mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
5.3 merge
This commit is contained in:
@ -1594,7 +1594,7 @@ btr_page_reorganize_low(
|
||||
ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
|
||||
btr_assert_not_corrupted(block, index);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
data_size1 = page_get_data_size(page);
|
||||
max_ins_size1 = page_get_max_insert_size_after_reorganize(page, 1);
|
||||
@ -1713,7 +1713,7 @@ btr_page_reorganize_low(
|
||||
|
||||
func_exit:
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
buf_block_free(temp_block);
|
||||
@ -1788,7 +1788,7 @@ btr_page_empty(
|
||||
ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
|
||||
ut_ad(page_zip == buf_block_get_page_zip(block));
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
btr_search_drop_page_hash_index(block);
|
||||
@ -1845,10 +1845,10 @@ btr_root_raise_and_insert(
|
||||
root_block = btr_cur_get_block(cursor);
|
||||
root_page_zip = buf_block_get_page_zip(root_block);
|
||||
ut_ad(page_get_n_recs(root) > 0);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!root_page_zip || page_zip_validate(root_page_zip, root));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
index = btr_cur_get_index(cursor);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!root_page_zip || page_zip_validate(root_page_zip, root, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
#ifdef UNIV_BTR_DEBUG
|
||||
if (!dict_index_is_ibuf(index)) {
|
||||
ulint space = dict_index_get_space(index);
|
||||
@ -2778,8 +2778,8 @@ insert_empty:
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
if (UNIV_LIKELY_NULL(page_zip)) {
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(new_page_zip, new_page));
|
||||
ut_a(page_zip_validate(page_zip, page, cursor->index));
|
||||
ut_a(page_zip_validate(new_page_zip, new_page, cursor->index));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
@ -2813,7 +2813,8 @@ insert_empty:
|
||||
= buf_block_get_page_zip(insert_block);
|
||||
|
||||
ut_a(!insert_page_zip
|
||||
|| page_zip_validate(insert_page_zip, insert_page));
|
||||
|| page_zip_validate(insert_page_zip, insert_page,
|
||||
cursor->index));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
@ -3178,7 +3179,7 @@ btr_lift_page_up(
|
||||
|
||||
btr_page_set_level(page, page_zip, page_level, mtr);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -3354,8 +3355,8 @@ err_exit:
|
||||
const page_zip_des_t* page_zip
|
||||
= buf_block_get_page_zip(block);
|
||||
ut_a(page_zip);
|
||||
ut_a(page_zip_validate(merge_page_zip, merge_page));
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(merge_page_zip, merge_page, index));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
@ -3488,7 +3489,8 @@ err_exit:
|
||||
|
||||
ut_ad(page_validate(merge_page, index));
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!merge_page_zip || page_zip_validate(merge_page_zip, merge_page));
|
||||
ut_a(!merge_page_zip || page_zip_validate(merge_page_zip, merge_page,
|
||||
index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
/* Free the file page */
|
||||
@ -3671,7 +3673,7 @@ btr_discard_page(
|
||||
page_zip_des_t* merge_page_zip
|
||||
= buf_block_get_page_zip(merge_block);
|
||||
ut_a(!merge_page_zip
|
||||
|| page_zip_validate(merge_page_zip, merge_page));
|
||||
|| page_zip_validate(merge_page_zip, merge_page, index));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
@ -4149,7 +4151,7 @@ btr_validate_level(
|
||||
ut_a(space == page_get_space_id(page));
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
page_zip = buf_block_get_page_zip(block);
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
ut_a(!page_is_leaf(page));
|
||||
|
||||
@ -4177,7 +4179,7 @@ loop:
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
page_zip = buf_block_get_page_zip(block);
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
/* Check ordering etc. of records */
|
||||
|
@ -673,7 +673,7 @@ retry_page_get:
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
const page_zip_des_t* page_zip
|
||||
= buf_block_get_page_zip(block);
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
buf_block_dbg_add_level(
|
||||
@ -2042,7 +2042,7 @@ any_extern:
|
||||
|
||||
page_zip = buf_block_get_page_zip(block);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
if (page_zip
|
||||
@ -2253,7 +2253,7 @@ btr_cur_pessimistic_update(
|
||||
MTR_MEMO_X_LOCK));
|
||||
ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
/* The insert buffer tree should never be updated in place. */
|
||||
ut_ad(!dict_index_is_ibuf(index));
|
||||
@ -2391,7 +2391,7 @@ make_external:
|
||||
btr_search_update_hash_on_delete(cursor);
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
page_cursor = btr_cur_get_page_cur(cursor);
|
||||
|
||||
@ -2498,7 +2498,7 @@ make_external:
|
||||
buf_block_t* rec_block = btr_cur_get_block(cursor);
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
page = buf_block_get_frame(rec_block);
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
page_zip = buf_block_get_page_zip(rec_block);
|
||||
@ -2524,7 +2524,7 @@ make_external:
|
||||
|
||||
return_after_reservations:
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
if (n_extents > 0) {
|
||||
@ -2886,7 +2886,7 @@ btr_cur_set_deleted_flag_for_ibuf(
|
||||
when the tablespace is
|
||||
uncompressed */
|
||||
ibool val, /*!< in: value to set */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
{
|
||||
/* We do not need to reserve btr_search_latch, as the page
|
||||
has just been read to the buffer pool and there cannot be
|
||||
@ -2986,12 +2986,14 @@ btr_cur_optimistic_delete(
|
||||
page, 1);
|
||||
}
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip
|
||||
|| page_zip_validate(page_zip, page, cursor->index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
page_cur_delete_rec(btr_cur_get_page_cur(cursor),
|
||||
cursor->index, offsets, mtr);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip
|
||||
|| page_zip_validate(page_zip, page, cursor->index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
if (dict_index_is_clust(cursor->index)
|
||||
@ -3086,7 +3088,7 @@ btr_cur_pessimistic_delete(
|
||||
rec = btr_cur_get_rec(cursor);
|
||||
page_zip = buf_block_get_page_zip(block);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap);
|
||||
@ -3096,7 +3098,7 @@ btr_cur_pessimistic_delete(
|
||||
rec, offsets, page_zip,
|
||||
rb_ctx, mtr);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -3157,7 +3159,7 @@ btr_cur_pessimistic_delete(
|
||||
|
||||
page_cur_delete_rec(btr_cur_get_page_cur(cursor), index, offsets, mtr);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
ut_ad(btr_check_node_ptr(index, block, mtr));
|
||||
|
@ -242,7 +242,7 @@ the read requests for the whole area.
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/** Value in microseconds */
|
||||
static const int WAIT_FOR_READ = 5000;
|
||||
static const int WAIT_FOR_READ = 100;
|
||||
/** Number of attemtps made to read in a page in the buffer pool */
|
||||
static const ulint BUF_PAGE_READ_MAX_RETRIES = 100;
|
||||
|
||||
@ -2582,8 +2582,9 @@ wait_until_unfixed:
|
||||
mutex_exit(&block->mutex);
|
||||
|
||||
if (io_fix == BUF_IO_READ) {
|
||||
|
||||
os_thread_sleep(WAIT_FOR_READ);
|
||||
/* wait by temporaly s-latch */
|
||||
rw_lock_s_lock(&(block->lock));
|
||||
rw_lock_s_unlock(&(block->lock));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
@ -1998,7 +1998,9 @@ buf_LRU_block_remove_hashed_page(
|
||||
break;
|
||||
case FIL_PAGE_INDEX:
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(&bpage->zip, page));
|
||||
ut_a(page_zip_validate(
|
||||
&bpage->zip, page,
|
||||
((buf_block_t*) bpage)->index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
break;
|
||||
default:
|
||||
|
@ -487,10 +487,12 @@ Looks for column n in an index.
|
||||
ULINT_UNDEFINED if not contained */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
dict_index_get_nth_col_pos(
|
||||
/*=======================*/
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
ulint n) /*!< in: column number */
|
||||
dict_index_get_nth_col_or_prefix_pos(
|
||||
/*=================================*/
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
ulint n, /*!< in: column number */
|
||||
ibool inc_prefix) /*!< in: TRUE=consider
|
||||
column prefixes too */
|
||||
{
|
||||
const dict_field_t* field;
|
||||
const dict_col_t* col;
|
||||
@ -512,7 +514,8 @@ dict_index_get_nth_col_pos(
|
||||
for (pos = 0; pos < n_fields; pos++) {
|
||||
field = dict_index_get_nth_field(index, pos);
|
||||
|
||||
if (col == field->col && field->prefix_len == 0) {
|
||||
if (col == field->col
|
||||
&& (inc_prefix || field->prefix_len == 0)) {
|
||||
|
||||
return(pos);
|
||||
}
|
||||
@ -521,6 +524,20 @@ dict_index_get_nth_col_pos(
|
||||
return(ULINT_UNDEFINED);
|
||||
}
|
||||
|
||||
/********************************************************************//**
|
||||
Looks for column n in an index.
|
||||
@return position in internal representation of the index;
|
||||
ULINT_UNDEFINED if not contained */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
dict_index_get_nth_col_pos(
|
||||
/*=======================*/
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
ulint n) /*!< in: column number */
|
||||
{
|
||||
return(dict_index_get_nth_col_or_prefix_pos(index, n, FALSE));
|
||||
}
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/********************************************************************//**
|
||||
Returns TRUE if the index contains a column or a prefix of that column.
|
||||
@ -2017,7 +2034,6 @@ dict_index_build_internal_clust(
|
||||
{
|
||||
dict_index_t* new_index;
|
||||
dict_field_t* field;
|
||||
ulint fixed_size;
|
||||
ulint trx_id_pos;
|
||||
ulint i;
|
||||
ibool* indexed;
|
||||
@ -2094,7 +2110,7 @@ dict_index_build_internal_clust(
|
||||
|
||||
for (i = 0; i < trx_id_pos; i++) {
|
||||
|
||||
fixed_size = dict_col_get_fixed_size(
|
||||
ulint fixed_size = dict_col_get_fixed_size(
|
||||
dict_index_get_nth_col(new_index, i),
|
||||
dict_table_is_comp(table));
|
||||
|
||||
@ -2111,7 +2127,20 @@ dict_index_build_internal_clust(
|
||||
break;
|
||||
}
|
||||
|
||||
new_index->trx_id_offset += (unsigned int) fixed_size;
|
||||
/* Add fixed_size to new_index->trx_id_offset.
|
||||
Because the latter is a bit-field, an overflow
|
||||
can theoretically occur. Check for it. */
|
||||
fixed_size += new_index->trx_id_offset;
|
||||
|
||||
new_index->trx_id_offset = fixed_size;
|
||||
|
||||
if (new_index->trx_id_offset != fixed_size) {
|
||||
/* Overflow. Pretend that this is a
|
||||
variable-length PRIMARY KEY. */
|
||||
ut_ad(0);
|
||||
new_index->trx_id_offset = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -11747,8 +11747,8 @@ static MYSQL_SYSVAR_ENUM(stats_method, srv_innodb_stats_method,
|
||||
#if defined UNIV_DEBUG || defined UNIV_IBUF_DEBUG
|
||||
static MYSQL_SYSVAR_UINT(change_buffering_debug, ibuf_debug,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Debug flags for InnoDB change buffering (0=none)",
|
||||
NULL, NULL, 0, 0, 1, 0);
|
||||
"Debug flags for InnoDB change buffering (0=none, 2=crash at merge)",
|
||||
NULL, NULL, 0, 0, 2, 0);
|
||||
#endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
|
||||
|
||||
static MYSQL_SYSVAR_BOOL(random_read_ahead, srv_random_read_ahead,
|
||||
|
@ -112,13 +112,17 @@ innobase_col_to_mysql(
|
||||
/* These column types should never be shipped to MySQL. */
|
||||
ut_ad(0);
|
||||
|
||||
case DATA_CHAR:
|
||||
case DATA_FIXBINARY:
|
||||
case DATA_FLOAT:
|
||||
case DATA_DOUBLE:
|
||||
case DATA_DECIMAL:
|
||||
/* Above are the valid column types for MySQL data. */
|
||||
ut_ad(flen == len);
|
||||
/* fall through */
|
||||
case DATA_CHAR:
|
||||
/* We may have flen > len when there is a shorter
|
||||
prefix on a CHAR column. */
|
||||
ut_ad(flen >= len);
|
||||
#else /* UNIV_DEBUG */
|
||||
default:
|
||||
#endif /* UNIV_DEBUG */
|
||||
@ -151,7 +155,7 @@ innobase_rec_to_mysql(
|
||||
|
||||
field->reset();
|
||||
|
||||
ipos = dict_index_get_nth_col_pos(index, i);
|
||||
ipos = dict_index_get_nth_col_or_prefix_pos(index, i, TRUE);
|
||||
|
||||
if (UNIV_UNLIKELY(ipos == ULINT_UNDEFINED)) {
|
||||
null_field:
|
||||
|
@ -4285,6 +4285,22 @@ ibuf_delete_rec(
|
||||
ut_ad(ibuf_rec_get_page_no(mtr, btr_pcur_get_rec(pcur)) == page_no);
|
||||
ut_ad(ibuf_rec_get_space(mtr, btr_pcur_get_rec(pcur)) == space);
|
||||
|
||||
#if defined UNIV_DEBUG || defined UNIV_IBUF_DEBUG
|
||||
if (ibuf_debug == 2) {
|
||||
/* Inject a fault (crash). We do this before trying
|
||||
optimistic delete, because a pessimistic delete in the
|
||||
change buffer would require a larger test case. */
|
||||
|
||||
/* Flag the buffered record as processed, to avoid
|
||||
an assertion failure after crash recovery. */
|
||||
btr_cur_set_deleted_flag_for_ibuf(
|
||||
btr_pcur_get_rec(pcur), NULL, TRUE, mtr);
|
||||
mtr_commit(mtr);
|
||||
log_make_checkpoint_at(IB_ULONGLONG_MAX, TRUE);
|
||||
DBUG_SUICIDE();
|
||||
}
|
||||
#endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
|
||||
|
||||
success = btr_cur_optimistic_delete(btr_pcur_get_btr_cur(pcur), mtr);
|
||||
|
||||
if (success) {
|
||||
@ -4319,7 +4335,13 @@ ibuf_delete_rec(
|
||||
ut_ad(ibuf_rec_get_page_no(mtr, btr_pcur_get_rec(pcur)) == page_no);
|
||||
ut_ad(ibuf_rec_get_space(mtr, btr_pcur_get_rec(pcur)) == space);
|
||||
|
||||
/* We have to resort to a pessimistic delete from ibuf */
|
||||
/* We have to resort to a pessimistic delete from ibuf.
|
||||
Delete-mark the record so that it will not be applied again,
|
||||
in case the server crashes before the pessimistic delete is
|
||||
made persistent. */
|
||||
btr_cur_set_deleted_flag_for_ibuf(
|
||||
btr_pcur_get_rec(pcur), NULL, TRUE, mtr);
|
||||
|
||||
btr_pcur_store_position(pcur, mtr);
|
||||
ibuf_btr_pcur_commit_specify_mtr(pcur, mtr);
|
||||
|
||||
@ -4600,7 +4622,7 @@ loop:
|
||||
fputs("InnoDB: Discarding record\n ", stderr);
|
||||
rec_print_old(stderr, rec);
|
||||
fputs("\nInnoDB: from the insert buffer!\n\n", stderr);
|
||||
} else if (block) {
|
||||
} else if (block && !rec_get_deleted_flag(rec, 0)) {
|
||||
/* Now we have at pcur a record which should be
|
||||
applied on the index page; NOTE that the call below
|
||||
copies pointers to fields in rec, and we must
|
||||
|
@ -635,7 +635,7 @@ btr_cur_set_deleted_flag_for_ibuf(
|
||||
when the tablespace is
|
||||
uncompressed */
|
||||
ibool val, /*!< in: value to set */
|
||||
mtr_t* mtr); /*!< in: mtr */
|
||||
mtr_t* mtr); /*!< in/out: mini-transaction */
|
||||
/*######################################################################*/
|
||||
|
||||
/** In the pessimistic delete, if the page data size drops below this
|
||||
|
@ -910,6 +910,18 @@ dict_index_get_nth_col_pos(
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
ulint n); /*!< in: column number */
|
||||
/********************************************************************//**
|
||||
Looks for column n in an index.
|
||||
@return position in internal representation of the index;
|
||||
ULINT_UNDEFINED if not contained */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
dict_index_get_nth_col_or_prefix_pos(
|
||||
/*=================================*/
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
ulint n, /*!< in: column number */
|
||||
ibool inc_prefix); /*!< in: TRUE=consider
|
||||
column prefixes too */
|
||||
/********************************************************************//**
|
||||
Returns TRUE if the index contains a column or a prefix of that column.
|
||||
@return TRUE if contains the column or its prefix */
|
||||
UNIV_INTERN
|
||||
|
@ -377,10 +377,15 @@ struct dict_index_struct{
|
||||
unsigned type:DICT_IT_BITS;
|
||||
/*!< index type (DICT_CLUSTERED, DICT_UNIQUE,
|
||||
DICT_UNIVERSAL, DICT_IBUF, DICT_CORRUPT) */
|
||||
unsigned trx_id_offset:10;/*!< position of the trx id column
|
||||
#define MAX_KEY_LENGTH_BITS 12
|
||||
unsigned trx_id_offset:MAX_KEY_LENGTH_BITS;
|
||||
/*!< position of the trx id column
|
||||
in a clustered index record, if the fields
|
||||
before it are known to be of a fixed size,
|
||||
0 otherwise */
|
||||
#if (1<<MAX_KEY_LENGTH_BITS) < MAX_KEY_LENGTH
|
||||
# error (1<<MAX_KEY_LENGTH_BITS) < MAX_KEY_LENGTH
|
||||
#endif
|
||||
unsigned n_user_defined_cols:10;
|
||||
/*!< number of columns the user defined to
|
||||
be in the index: in the internal
|
||||
|
@ -156,9 +156,10 @@ page_zip_validate_low(
|
||||
/*==================*/
|
||||
const page_zip_des_t* page_zip,/*!< in: compressed page */
|
||||
const page_t* page, /*!< in: uncompressed page */
|
||||
const dict_index_t* index, /*!< in: index of the page, if known */
|
||||
ibool sloppy) /*!< in: FALSE=strict,
|
||||
TRUE=ignore the MIN_REC_FLAG */
|
||||
__attribute__((nonnull));
|
||||
__attribute__((nonnull(1,2)));
|
||||
/**********************************************************************//**
|
||||
Check that the compressed and decompressed pages match. */
|
||||
UNIV_INTERN
|
||||
@ -166,8 +167,9 @@ ibool
|
||||
page_zip_validate(
|
||||
/*==============*/
|
||||
const page_zip_des_t* page_zip,/*!< in: compressed page */
|
||||
const page_t* page) /*!< in: uncompressed page */
|
||||
__attribute__((nonnull));
|
||||
const page_t* page, /*!< in: uncompressed page */
|
||||
const dict_index_t* index) /*!< in: index of the page, if known */
|
||||
__attribute__((nonnull(1,2)));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
/**********************************************************************//**
|
||||
|
@ -87,10 +87,6 @@ that index record. */
|
||||
enum undo_exec {
|
||||
UNDO_NODE_FETCH_NEXT = 1, /*!< we should fetch the next
|
||||
undo log record */
|
||||
UNDO_NODE_PREV_VERS, /*!< the roll ptr to previous
|
||||
version of a row is stored in
|
||||
node, and undo should be done
|
||||
based on it */
|
||||
UNDO_NODE_INSERT, /*!< undo a fresh insert of a
|
||||
row to a table */
|
||||
UNDO_NODE_MODIFY /*!< undo a modify operation
|
||||
@ -108,9 +104,6 @@ struct undo_node_struct{
|
||||
undo_no_t undo_no;/*!< undo number of the record */
|
||||
ulint rec_type;/*!< undo log record type: TRX_UNDO_INSERT_REC,
|
||||
... */
|
||||
roll_ptr_t new_roll_ptr;
|
||||
/*!< roll ptr to restore to clustered index
|
||||
record */
|
||||
trx_id_t new_trx_id; /*!< trx id to restore to clustered index
|
||||
record */
|
||||
btr_pcur_t pcur; /*!< persistent cursor used in searching the
|
||||
|
@ -1636,9 +1636,8 @@ recv_recover_page_func(
|
||||
if (fil_page_get_type(page) == FIL_PAGE_INDEX) {
|
||||
page_zip_des_t* page_zip = buf_block_get_page_zip(block);
|
||||
|
||||
if (page_zip) {
|
||||
ut_a(page_zip_validate_low(page_zip, page, FALSE));
|
||||
}
|
||||
ut_a(!page_zip
|
||||
|| page_zip_validate_low(page_zip, page, NULL, FALSE));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
|
@ -1397,6 +1397,14 @@ os_file_create_func(
|
||||
DWORD create_flag;
|
||||
DWORD attributes;
|
||||
ibool retry;
|
||||
|
||||
DBUG_EXECUTE_IF(
|
||||
"ib_create_table_fail_disk_full",
|
||||
*success = FALSE;
|
||||
SetLastError(ERROR_DISK_FULL);
|
||||
return((os_file_t) -1);
|
||||
);
|
||||
|
||||
try_again:
|
||||
ut_a(name);
|
||||
|
||||
@ -1512,6 +1520,13 @@ try_again:
|
||||
ibool retry;
|
||||
const char* mode_str = NULL;
|
||||
|
||||
DBUG_EXECUTE_IF(
|
||||
"ib_create_table_fail_disk_full",
|
||||
*success = FALSE;
|
||||
errno = ENOSPC;
|
||||
return((os_file_t) -1);
|
||||
);
|
||||
|
||||
try_again:
|
||||
ut_a(name);
|
||||
|
||||
|
@ -310,7 +310,7 @@ page_cur_search_with_match(
|
||||
#endif /* UNIV_DEBUG */
|
||||
page = buf_block_get_frame(block);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
page_check_dir(page);
|
||||
@ -1248,7 +1248,7 @@ page_cur_insert_rec_zip(
|
||||
|
||||
ut_ad(!page_rec_is_supremum(*current_rec));
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
/* 1. Get the size of the physical record in the page */
|
||||
@ -1973,7 +1973,7 @@ page_cur_delete_rec(
|
||||
}
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
|
@ -626,7 +626,7 @@ page_copy_rec_list_end(
|
||||
Furthermore, btr_compress() may set FIL_PAGE_PREV to
|
||||
FIL_NULL on new_page while leaving it intact on
|
||||
new_page_zip. So, we cannot validate new_page_zip. */
|
||||
ut_a(page_zip_validate_low(page_zip, page, TRUE));
|
||||
ut_a(page_zip_validate_low(page_zip, page, index, TRUE));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
ut_ad(buf_block_get_frame(block) == page);
|
||||
@ -946,7 +946,7 @@ page_delete_rec_list_end(
|
||||
ut_ad(size == ULINT_UNDEFINED || size < UNIV_PAGE_SIZE);
|
||||
ut_ad(!page_zip || page_rec_is_comp(rec));
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page));
|
||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
if (page_rec_is_infimum(rec)) {
|
||||
@ -988,7 +988,7 @@ page_delete_rec_list_end(
|
||||
ULINT_UNDEFINED, &heap);
|
||||
rec = rec_get_next_ptr(rec, TRUE);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
page_cur_delete_rec(&cur, index, offsets, mtr);
|
||||
} while (page_offset(rec) != PAGE_NEW_SUPREMUM);
|
||||
@ -1128,7 +1128,8 @@ page_delete_rec_list_start(
|
||||
between btr_attach_half_pages() and insert_page = ...
|
||||
when btr_page_get_split_rec_to_left() holds
|
||||
(direction == FSP_DOWN). */
|
||||
ut_a(!page_zip || page_zip_validate_low(page_zip, page, TRUE));
|
||||
ut_a(!page_zip
|
||||
|| page_zip_validate_low(page_zip, page, index, TRUE));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
@ -1199,9 +1200,10 @@ page_move_rec_list_end(
|
||||
= buf_block_get_page_zip(block);
|
||||
ut_a(!new_page_zip == !page_zip);
|
||||
ut_a(!new_page_zip
|
||||
|| page_zip_validate(new_page_zip, new_page));
|
||||
|| page_zip_validate(new_page_zip, new_page, index));
|
||||
ut_a(!page_zip
|
||||
|| page_zip_validate(page_zip, page_align(split_rec)));
|
||||
|| page_zip_validate(page_zip, page_align(split_rec),
|
||||
index));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
|
@ -1433,7 +1433,7 @@ err_exit:
|
||||
page_zip_get_size(page_zip) - PAGE_DATA);
|
||||
mem_heap_free(heap);
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
if (mtr) {
|
||||
@ -3119,6 +3119,7 @@ page_zip_validate_low(
|
||||
/*==================*/
|
||||
const page_zip_des_t* page_zip,/*!< in: compressed page */
|
||||
const page_t* page, /*!< in: uncompressed page */
|
||||
const dict_index_t* index, /*!< in: index of the page, if known */
|
||||
ibool sloppy) /*!< in: FALSE=strict,
|
||||
TRUE=ignore the MIN_REC_FLAG */
|
||||
{
|
||||
@ -3206,39 +3207,102 @@ page_zip_validate_low(
|
||||
committed. Let us tolerate that difference when we
|
||||
are performing a sloppy validation. */
|
||||
|
||||
if (sloppy) {
|
||||
byte info_bits_diff;
|
||||
ulint offset
|
||||
= rec_get_next_offs(page + PAGE_NEW_INFIMUM,
|
||||
TRUE);
|
||||
ut_a(offset >= PAGE_NEW_SUPREMUM);
|
||||
offset -= 5 /* REC_NEW_INFO_BITS */;
|
||||
ulint* offsets;
|
||||
mem_heap_t* heap;
|
||||
const rec_t* rec;
|
||||
const rec_t* trec;
|
||||
byte info_bits_diff;
|
||||
ulint offset
|
||||
= rec_get_next_offs(page + PAGE_NEW_INFIMUM, TRUE);
|
||||
ut_a(offset >= PAGE_NEW_SUPREMUM);
|
||||
offset -= 5/*REC_NEW_INFO_BITS*/;
|
||||
|
||||
info_bits_diff = page[offset] ^ temp_page[offset];
|
||||
info_bits_diff = page[offset] ^ temp_page[offset];
|
||||
|
||||
if (info_bits_diff == REC_INFO_MIN_REC_FLAG) {
|
||||
temp_page[offset] = page[offset];
|
||||
if (info_bits_diff == REC_INFO_MIN_REC_FLAG) {
|
||||
temp_page[offset] = page[offset];
|
||||
|
||||
if (!memcmp(page + PAGE_HEADER,
|
||||
temp_page + PAGE_HEADER,
|
||||
UNIV_PAGE_SIZE - PAGE_HEADER
|
||||
- FIL_PAGE_DATA_END)) {
|
||||
if (!memcmp(page + PAGE_HEADER,
|
||||
temp_page + PAGE_HEADER,
|
||||
UNIV_PAGE_SIZE - PAGE_HEADER
|
||||
- FIL_PAGE_DATA_END)) {
|
||||
|
||||
/* Only the minimum record flag
|
||||
differed. Let us ignore it. */
|
||||
page_zip_fail(("page_zip_validate: "
|
||||
"min_rec_flag "
|
||||
"(ignored, "
|
||||
"%lu,%lu,0x%02lx)\n",
|
||||
page_get_space_id(page),
|
||||
page_get_page_no(page),
|
||||
(ulong) page[offset]));
|
||||
goto func_exit;
|
||||
}
|
||||
/* Only the minimum record flag
|
||||
differed. Let us ignore it. */
|
||||
page_zip_fail(("page_zip_validate: "
|
||||
"min_rec_flag "
|
||||
"(%s"
|
||||
"%lu,%lu,0x%02lx)\n",
|
||||
sloppy ? "ignored, " : "",
|
||||
page_get_space_id(page),
|
||||
page_get_page_no(page),
|
||||
(ulong) page[offset]));
|
||||
valid = sloppy;
|
||||
goto func_exit;
|
||||
}
|
||||
}
|
||||
page_zip_fail(("page_zip_validate: content\n"));
|
||||
valid = FALSE;
|
||||
|
||||
/* Compare the pointers in the PAGE_FREE list. */
|
||||
rec = page_header_get_ptr(page, PAGE_FREE);
|
||||
trec = page_header_get_ptr(temp_page, PAGE_FREE);
|
||||
|
||||
while (rec || trec) {
|
||||
if (page_offset(rec) != page_offset(trec)) {
|
||||
page_zip_fail(("page_zip_validate: "
|
||||
"PAGE_FREE list: %u!=%u\n",
|
||||
(unsigned) page_offset(rec),
|
||||
(unsigned) page_offset(trec)));
|
||||
valid = FALSE;
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
rec = page_rec_get_next_low(rec, TRUE);
|
||||
trec = page_rec_get_next_low(trec, TRUE);
|
||||
}
|
||||
|
||||
/* Compare the records. */
|
||||
heap = NULL;
|
||||
offsets = NULL;
|
||||
rec = page_rec_get_next_low(
|
||||
page + PAGE_NEW_INFIMUM, TRUE);
|
||||
trec = page_rec_get_next_low(
|
||||
temp_page + PAGE_NEW_INFIMUM, TRUE);
|
||||
|
||||
do {
|
||||
if (page_offset(rec) != page_offset(trec)) {
|
||||
page_zip_fail(("page_zip_validate: "
|
||||
"record list: 0x%02x!=0x%02x\n",
|
||||
(unsigned) page_offset(rec),
|
||||
(unsigned) page_offset(trec)));
|
||||
valid = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (index) {
|
||||
/* Compare the data. */
|
||||
offsets = rec_get_offsets(
|
||||
rec, index, offsets,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
|
||||
if (memcmp(rec - rec_offs_extra_size(offsets),
|
||||
trec - rec_offs_extra_size(offsets),
|
||||
rec_offs_size(offsets))) {
|
||||
page_zip_fail(
|
||||
("page_zip_validate: "
|
||||
"record content: 0x%02x",
|
||||
(unsigned) page_offset(rec)));
|
||||
valid = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rec = page_rec_get_next_low(rec, TRUE);
|
||||
trec = page_rec_get_next_low(trec, TRUE);
|
||||
} while (rec || trec);
|
||||
|
||||
if (heap) {
|
||||
mem_heap_free(heap);
|
||||
}
|
||||
}
|
||||
|
||||
func_exit:
|
||||
@ -3260,9 +3324,10 @@ ibool
|
||||
page_zip_validate(
|
||||
/*==============*/
|
||||
const page_zip_des_t* page_zip,/*!< in: compressed page */
|
||||
const page_t* page) /*!< in: uncompressed page */
|
||||
const page_t* page, /*!< in: uncompressed page */
|
||||
const dict_index_t* index) /*!< in: index of the page, if known */
|
||||
{
|
||||
return(page_zip_validate_low(page_zip, page,
|
||||
return(page_zip_validate_low(page_zip, page, index,
|
||||
recv_recovery_is_on()));
|
||||
}
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
@ -3593,7 +3658,7 @@ page_zip_write_rec(
|
||||
page_zip->m_nonempty = TRUE;
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page_align(rec)));
|
||||
ut_a(page_zip_validate(page_zip, page_align(rec), index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -3640,7 +3705,7 @@ corrupt:
|
||||
}
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
memcpy(page + offset,
|
||||
@ -3649,7 +3714,7 @@ corrupt:
|
||||
ptr + 4, BTR_EXTERN_FIELD_REF_SIZE);
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -3716,7 +3781,7 @@ page_zip_write_blob_ptr(
|
||||
memcpy(externs, field, BTR_EXTERN_FIELD_REF_SIZE);
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
if (mtr) {
|
||||
@ -3787,7 +3852,7 @@ corrupt:
|
||||
}
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
field = page + offset;
|
||||
@ -3808,7 +3873,7 @@ corrupt:
|
||||
memcpy(storage, ptr + 4, REC_NODE_PTR_SIZE);
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -4035,7 +4100,7 @@ page_zip_clear_rec(
|
||||
}
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -4059,7 +4124,7 @@ page_zip_rec_set_deleted(
|
||||
*slot &= ~(PAGE_ZIP_DIR_SLOT_DEL >> 8);
|
||||
}
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page_align(rec)));
|
||||
ut_a(page_zip_validate(page_zip, page_align(rec), NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -4360,14 +4425,14 @@ corrupt:
|
||||
goto corrupt;
|
||||
}
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
||||
memcpy(page + offset, ptr, len);
|
||||
memcpy(page_zip->data + offset, ptr, len);
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, NULL));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
}
|
||||
|
||||
@ -4445,7 +4510,7 @@ page_zip_reorganize(
|
||||
ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
|
||||
ut_ad(page_is_comp(page));
|
||||
ut_ad(!dict_index_is_ibuf(index));
|
||||
/* Note that page_zip_validate(page_zip, page) may fail here. */
|
||||
/* Note that page_zip_validate(page_zip, page, index) may fail here. */
|
||||
UNIV_MEM_ASSERT_RW(page, UNIV_PAGE_SIZE);
|
||||
UNIV_MEM_ASSERT_RW(page_zip->data, page_zip_get_size(page_zip));
|
||||
|
||||
@ -4532,7 +4597,7 @@ page_zip_copy_recs(
|
||||
FIL_PAGE_PREV or PAGE_LEVEL, causing a temporary min_rec_flag
|
||||
mismatch. A strict page_zip_validate() will be executed later
|
||||
during the B-tree operations. */
|
||||
ut_a(page_zip_validate_low(src_zip, src, TRUE));
|
||||
ut_a(page_zip_validate_low(src_zip, src, index, TRUE));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
ut_a(page_zip_get_size(page_zip) == page_zip_get_size(src_zip));
|
||||
if (UNIV_UNLIKELY(src_zip->n_blobs)) {
|
||||
@ -4593,7 +4658,7 @@ page_zip_copy_recs(
|
||||
}
|
||||
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
ut_a(page_zip_validate(page_zip, page));
|
||||
ut_a(page_zip_validate(page_zip, page, index));
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
btr_blob_dbg_add(page, index, "page_zip_copy_recs");
|
||||
|
||||
|
@ -1855,7 +1855,8 @@ Creates a table for MySQL. If the name of the table ends in
|
||||
one of "innodb_monitor", "innodb_lock_monitor", "innodb_tablespace_monitor",
|
||||
"innodb_table_monitor", then this will also start the printing of monitor
|
||||
output by the master thread. If the table name ends in "innodb_mem_validate",
|
||||
InnoDB will try to invoke mem_validate().
|
||||
InnoDB will try to invoke mem_validate(). On failure the transaction will
|
||||
be rolled back and the 'table' object will be freed.
|
||||
@return error code or DB_SUCCESS */
|
||||
UNIV_INTERN
|
||||
int
|
||||
@ -1993,6 +1994,8 @@ err_exit:
|
||||
|
||||
row_drop_table_for_mysql(table->name, trx, FALSE);
|
||||
trx_commit_for_mysql(trx);
|
||||
} else {
|
||||
dict_mem_table_free(table);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -3915,6 +3915,11 @@ wait_table_again:
|
||||
}
|
||||
|
||||
rec_loop:
|
||||
if (trx_is_interrupted(trx)) {
|
||||
err = DB_INTERRUPTED;
|
||||
goto normal_return;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------*/
|
||||
/* PHASE 4: Look for matching records in a loop */
|
||||
|
||||
@ -4839,12 +4844,16 @@ row_search_autoinc_read_column(
|
||||
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap);
|
||||
offsets = rec_get_offsets(rec, index, offsets, col_no + 1, &heap);
|
||||
|
||||
if (rec_offs_nth_sql_null(offsets, col_no)) {
|
||||
/* There is no non-NULL value in the auto-increment column. */
|
||||
value = 0;
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
data = rec_get_nth_field(rec, offsets, col_no, &len);
|
||||
|
||||
ut_a(len != UNIV_SQL_NULL);
|
||||
|
||||
switch (mtype) {
|
||||
case DATA_INT:
|
||||
ut_a(len <= sizeof value);
|
||||
@ -4865,14 +4874,15 @@ row_search_autoinc_read_column(
|
||||
ut_error;
|
||||
}
|
||||
|
||||
if (UNIV_LIKELY_NULL(heap)) {
|
||||
mem_heap_free(heap);
|
||||
}
|
||||
|
||||
if (!unsigned_type && (ib_int64_t) value < 0) {
|
||||
value = 0;
|
||||
}
|
||||
|
||||
func_exit:
|
||||
if (UNIV_LIKELY_NULL(heap)) {
|
||||
mem_heap_free(heap);
|
||||
}
|
||||
|
||||
return(value);
|
||||
}
|
||||
|
||||
|
@ -68,36 +68,6 @@ check.
|
||||
If you make a change in this module make sure that no codepath is
|
||||
introduced where a call to log_free_check() is bypassed. */
|
||||
|
||||
/***********************************************************//**
|
||||
Checks if also the previous version of the clustered index record was
|
||||
modified or inserted by the same transaction, and its undo number is such
|
||||
that it should be undone in the same rollback.
|
||||
@return TRUE if also previous modify or insert of this row should be undone */
|
||||
static
|
||||
ibool
|
||||
row_undo_mod_undo_also_prev_vers(
|
||||
/*=============================*/
|
||||
undo_node_t* node, /*!< in: row undo node */
|
||||
undo_no_t* undo_no)/*!< out: the undo number */
|
||||
{
|
||||
trx_undo_rec_t* undo_rec;
|
||||
trx_t* trx;
|
||||
|
||||
trx = node->trx;
|
||||
|
||||
if (node->new_trx_id != trx->id) {
|
||||
|
||||
*undo_no = 0;
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
undo_rec = trx_undo_get_undo_rec_low(node->new_roll_ptr, node->heap);
|
||||
|
||||
*undo_no = trx_undo_rec_get_undo_no(undo_rec);
|
||||
|
||||
return(trx->roll_limit <= *undo_no);
|
||||
}
|
||||
|
||||
/***********************************************************//**
|
||||
Undoes a modify in a clustered index record.
|
||||
@return DB_SUCCESS, DB_FAIL, or error code: we may run out of file space */
|
||||
@ -226,19 +196,11 @@ row_undo_mod_clust(
|
||||
btr_pcur_t* pcur;
|
||||
mtr_t mtr;
|
||||
ulint err;
|
||||
ibool success;
|
||||
ibool more_vers;
|
||||
undo_no_t new_undo_no;
|
||||
|
||||
ut_ad(node && thr);
|
||||
|
||||
log_free_check();
|
||||
|
||||
/* Check if also the previous version of the clustered index record
|
||||
should be undone in this same rollback operation */
|
||||
|
||||
more_vers = row_undo_mod_undo_also_prev_vers(node, &new_undo_no);
|
||||
|
||||
pcur = &(node->pcur);
|
||||
|
||||
mtr_start(&mtr);
|
||||
@ -286,20 +248,6 @@ row_undo_mod_clust(
|
||||
|
||||
trx_undo_rec_release(node->trx, node->undo_no);
|
||||
|
||||
if (more_vers && err == DB_SUCCESS) {
|
||||
|
||||
/* Reserve the undo log record to the prior version after
|
||||
committing &mtr: this is necessary to comply with the latching
|
||||
order, as &mtr may contain the fsp latch which is lower in
|
||||
the latch hierarchy than trx->undo_mutex. */
|
||||
|
||||
success = trx_undo_rec_reserve(node->trx, new_undo_no);
|
||||
|
||||
if (success) {
|
||||
node->state = UNDO_NODE_PREV_VERS;
|
||||
}
|
||||
}
|
||||
|
||||
return(err);
|
||||
}
|
||||
|
||||
@ -847,7 +795,6 @@ row_undo_mod_parse_undo_rec(
|
||||
trx_undo_update_rec_get_update(ptr, clust_index, type, trx_id,
|
||||
roll_ptr, info_bits, trx,
|
||||
node->heap, &(node->update));
|
||||
node->new_roll_ptr = roll_ptr;
|
||||
node->new_trx_id = trx_id;
|
||||
node->cmpl_info = cmpl_info;
|
||||
}
|
||||
|
@ -276,25 +276,6 @@ row_undo(
|
||||
node->roll_ptr = roll_ptr;
|
||||
node->undo_no = trx_undo_rec_get_undo_no(node->undo_rec);
|
||||
|
||||
if (trx_undo_roll_ptr_is_insert(roll_ptr)) {
|
||||
|
||||
node->state = UNDO_NODE_INSERT;
|
||||
} else {
|
||||
node->state = UNDO_NODE_MODIFY;
|
||||
}
|
||||
|
||||
} else if (node->state == UNDO_NODE_PREV_VERS) {
|
||||
|
||||
/* Undo should be done to the same clustered index record
|
||||
again in this same rollback, restoring the previous version */
|
||||
|
||||
roll_ptr = node->new_roll_ptr;
|
||||
|
||||
node->undo_rec = trx_undo_get_undo_rec_low(roll_ptr,
|
||||
node->heap);
|
||||
node->roll_ptr = roll_ptr;
|
||||
node->undo_no = trx_undo_rec_get_undo_no(node->undo_rec);
|
||||
|
||||
if (trx_undo_roll_ptr_is_insert(roll_ptr)) {
|
||||
|
||||
node->state = UNDO_NODE_INSERT;
|
||||
|
@ -291,7 +291,14 @@ static struct my_option my_long_options[] =
|
||||
&check_param.write_buffer_length, 0, GET_ULONG, REQUIRED_ARG,
|
||||
(long) READ_BUFFER_INIT, (long) MALLOC_OVERHEAD,
|
||||
INT_MAX32, (long) MALLOC_OVERHEAD, (long) 1L, 0},
|
||||
{ "sort_buffer_size", OPT_SORT_BUFFER_SIZE, "",
|
||||
{ "sort_buffer_size", OPT_SORT_BUFFER_SIZE,
|
||||
"Deprecated. myisam_sort_buffer_size alias is being used",
|
||||
&check_param.sort_buffer_length,
|
||||
&check_param.sort_buffer_length, 0, GET_ULONG, REQUIRED_ARG,
|
||||
(long) SORT_BUFFER_INIT, (long) (MIN_SORT_BUFFER + MALLOC_OVERHEAD),
|
||||
ULONG_MAX, (long) MALLOC_OVERHEAD, (long) 1L, 0},
|
||||
{ "myisam_sort_buffer_size", OPT_SORT_BUFFER_SIZE,
|
||||
"Alias of sort_buffer_size parameter",
|
||||
&check_param.sort_buffer_length,
|
||||
&check_param.sort_buffer_length, 0, GET_ULL, REQUIRED_ARG,
|
||||
(long) SORT_BUFFER_INIT, (long) (MIN_SORT_BUFFER + MALLOC_OVERHEAD),
|
||||
|
Reference in New Issue
Block a user