Commit 2a48b142 authored by Marko Mäkelä's avatar Marko Mäkelä

Introduce UNIV_BLOB_NULL_DEBUG for temporarily hiding Bug#12650861.

Some ut_a(!rec_offs_any_null_extern()) assertion failures are indicating
genuine BLOB bugs, others are bogus failures when rolling back incomplete
transactions at crash recovery. This needs more work, and until I get a
chance to work on it, other testing must not be disrupted by this.
parent c0fcd9e0
...@@ -1592,9 +1592,9 @@ btr_cur_optimistic_update( ...@@ -1592,9 +1592,9 @@ btr_cur_optimistic_update(
heap = mem_heap_create(1024); heap = mem_heap_create(1024);
offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap); offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
if (btr_cur_print_record_ops && thr) { if (btr_cur_print_record_ops && thr) {
......
...@@ -339,7 +339,7 @@ rec_offs_any_extern( ...@@ -339,7 +339,7 @@ rec_offs_any_extern(
/*================*/ /*================*/
/* out: TRUE if a field is stored externally */ /* out: TRUE if a field is stored externally */
const ulint* offsets);/* in: array returned by rec_get_offsets() */ const ulint* offsets);/* in: array returned by rec_get_offsets() */
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
/******************************************************** /********************************************************
Determine if the offsets are for a record containing null BLOB pointers. */ Determine if the offsets are for a record containing null BLOB pointers. */
UNIV_INLINE UNIV_INLINE
...@@ -351,7 +351,7 @@ rec_offs_any_null_extern( ...@@ -351,7 +351,7 @@ rec_offs_any_null_extern(
or NULL if none found */ or NULL if none found */
rec_t* rec, /*!< in: record */ rec_t* rec, /*!< in: record */
const ulint* offsets); /*!< in: rec_get_offsets(rec) */ const ulint* offsets); /*!< in: rec_get_offsets(rec) */
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
/*************************************************************** /***************************************************************
Sets the value of the ith field extern storage bit. */ Sets the value of the ith field extern storage bit. */
UNIV_INLINE UNIV_INLINE
......
...@@ -1021,7 +1021,7 @@ rec_offs_any_extern( ...@@ -1021,7 +1021,7 @@ rec_offs_any_extern(
return(FALSE); return(FALSE);
} }
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
/******************************************************** /********************************************************
Determine if the offsets are for a record containing null BLOB pointers. */ Determine if the offsets are for a record containing null BLOB pointers. */
UNIV_INLINE UNIV_INLINE
...@@ -1055,7 +1055,7 @@ rec_offs_any_null_extern( ...@@ -1055,7 +1055,7 @@ rec_offs_any_null_extern(
return(NULL); return(NULL);
} }
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
/*************************************************************** /***************************************************************
Sets the value of the ith field extern storage bit. */ Sets the value of the ith field extern storage bit. */
......
...@@ -88,8 +88,8 @@ memory is read outside the allocated blocks. */ ...@@ -88,8 +88,8 @@ memory is read outside the allocated blocks. */
#if 0 #if 0
#define UNIV_DEBUG_VALGRIND /* Enable extra #define UNIV_DEBUG_VALGRIND /* Enable extra
Valgrind instrumentation */ Valgrind instrumentation */
#define UNIV_BLOB_LIGHT_DEBUG /* Enable off-page column #define UNIV_BLOB_NULL_DEBUG /* Enable deep off-page
debugging without UNIV_DEBUG */ column debugging */
#define UNIV_DEBUG /* Enable ut_ad() assertions */ #define UNIV_DEBUG /* Enable ut_ad() assertions */
#define UNIV_LIST_DEBUG /* debug UT_LIST_ macros */ #define UNIV_LIST_DEBUG /* debug UT_LIST_ macros */
#define UNIV_MEM_DEBUG /* detect memory leaks etc */ #define UNIV_MEM_DEBUG /* detect memory leaks etc */
......
...@@ -210,13 +210,13 @@ row_build( ...@@ -210,13 +210,13 @@ row_build(
ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(rec_offs_validate(rec, index, offsets));
} }
#if 0/* defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG*/ #if 0 && defined UNIV_BLOB_NULL_DEBUG
/* This one can fail in trx_rollback_or_clean_all_without_sess() /* This one can fail in trx_rollback_or_clean_all_without_sess()
if the server crashed during an insert before the if the server crashed during an insert before the
btr_store_big_rec_extern_fields() did mtr_commit() btr_store_big_rec_extern_fields() did mtr_commit()
all BLOB pointers to the clustered index record. */ all BLOB pointers to the clustered index record. */
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* 0 && UNIV_BLOB_NULL_DEBUG */
if (type != ROW_COPY_POINTERS) { if (type != ROW_COPY_POINTERS) {
/* Take a copy of rec to heap */ /* Take a copy of rec to heap */
...@@ -310,10 +310,10 @@ row_rec_to_index_entry( ...@@ -310,10 +310,10 @@ row_rec_to_index_entry(
rec = rec_copy(buf, rec, offsets); rec = rec_copy(buf, rec, offsets);
/* Avoid a debug assertion in rec_offs_validate(). */ /* Avoid a debug assertion in rec_offs_validate(). */
rec_offs_make_valid(rec, index, offsets); rec_offs_make_valid(rec, index, offsets);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
} else { } else {
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
} }
rec_len = rec_offs_n_fields(offsets); rec_len = rec_offs_n_fields(offsets);
......
...@@ -473,10 +473,10 @@ row_vers_build_for_consistent_read( ...@@ -473,10 +473,10 @@ row_vers_build_for_consistent_read(
/* The view already sees this version: we can /* The view already sees this version: we can
copy it to in_heap and return */ copy it to in_heap and return */
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #if defined UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern( ut_a(!rec_offs_any_null_extern(
version, *offsets)); version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
buf = mem_heap_alloc(in_heap, buf = mem_heap_alloc(in_heap,
rec_offs_size(*offsets)); rec_offs_size(*offsets));
...@@ -511,9 +511,9 @@ row_vers_build_for_consistent_read( ...@@ -511,9 +511,9 @@ row_vers_build_for_consistent_read(
*offsets = rec_get_offsets(prev_version, index, *offsets, *offsets = rec_get_offsets(prev_version, index, *offsets,
ULINT_UNDEFINED, offset_heap); ULINT_UNDEFINED, offset_heap);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(prev_version, *offsets)); ut_a(!rec_offs_any_null_extern(prev_version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
trx_id = row_get_rec_trx_id(prev_version, index, *offsets); trx_id = row_get_rec_trx_id(prev_version, index, *offsets);
...@@ -615,9 +615,9 @@ row_vers_build_for_semi_consistent_read( ...@@ -615,9 +615,9 @@ row_vers_build_for_semi_consistent_read(
/* We found a version that belongs to a /* We found a version that belongs to a
committed transaction: return it. */ committed transaction: return it. */
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(version, *offsets)); ut_a(!rec_offs_any_null_extern(version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
if (rec == version) { if (rec == version) {
*old_vers = rec; *old_vers = rec;
...@@ -676,9 +676,9 @@ row_vers_build_for_semi_consistent_read( ...@@ -676,9 +676,9 @@ row_vers_build_for_semi_consistent_read(
version = prev_version; version = prev_version;
*offsets = rec_get_offsets(version, index, *offsets, *offsets = rec_get_offsets(version, index, *offsets,
ULINT_UNDEFINED, offset_heap); ULINT_UNDEFINED, offset_heap);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(version, *offsets)); ut_a(!rec_offs_any_null_extern(version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
}/* for (;;) */ }/* for (;;) */
if (heap) { if (heap) {
......
...@@ -1397,9 +1397,9 @@ trx_undo_prev_version_build( ...@@ -1397,9 +1397,9 @@ trx_undo_prev_version_build(
return(DB_ERROR); return(DB_ERROR);
} }
# if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG # ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
# endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ # endif /* UNIV_BLOB_NULL_DEBUG */
if (row_upd_changes_field_size_or_external(index, offsets, update)) { if (row_upd_changes_field_size_or_external(index, offsets, update)) {
ulint* ext_vect; ulint* ext_vect;
......
...@@ -1871,9 +1871,9 @@ btr_cur_optimistic_update( ...@@ -1871,9 +1871,9 @@ btr_cur_optimistic_update(
heap = mem_heap_create(1024); heap = mem_heap_create(1024);
offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap); offsets = rec_get_offsets(rec, index, NULL, ULINT_UNDEFINED, &heap);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
if (btr_cur_print_record_ops && thr) { if (btr_cur_print_record_ops && thr) {
......
...@@ -480,7 +480,7 @@ ulint ...@@ -480,7 +480,7 @@ ulint
rec_offs_any_extern( rec_offs_any_extern(
/*================*/ /*================*/
const ulint* offsets);/*!< in: array returned by rec_get_offsets() */ const ulint* offsets);/*!< in: array returned by rec_get_offsets() */
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
/******************************************************//** /******************************************************//**
Determine if the offsets are for a record containing null BLOB pointers. Determine if the offsets are for a record containing null BLOB pointers.
@return first field containing a null BLOB pointer, or NULL if none found */ @return first field containing a null BLOB pointer, or NULL if none found */
...@@ -491,7 +491,7 @@ rec_offs_any_null_extern( ...@@ -491,7 +491,7 @@ rec_offs_any_null_extern(
const rec_t* rec, /*!< in: record */ const rec_t* rec, /*!< in: record */
const ulint* offsets) /*!< in: rec_get_offsets(rec) */ const ulint* offsets) /*!< in: rec_get_offsets(rec) */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
/******************************************************//** /******************************************************//**
Returns nonzero if the extern bit is set in nth field of rec. Returns nonzero if the extern bit is set in nth field of rec.
@return nonzero if externally stored */ @return nonzero if externally stored */
......
...@@ -1088,7 +1088,7 @@ rec_offs_any_extern( ...@@ -1088,7 +1088,7 @@ rec_offs_any_extern(
return(UNIV_UNLIKELY(*rec_offs_base(offsets) & REC_OFFS_EXTERNAL)); return(UNIV_UNLIKELY(*rec_offs_base(offsets) & REC_OFFS_EXTERNAL));
} }
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
/******************************************************//** /******************************************************//**
Determine if the offsets are for a record containing null BLOB pointers. Determine if the offsets are for a record containing null BLOB pointers.
@return first field containing a null BLOB pointer, or NULL if none found */ @return first field containing a null BLOB pointer, or NULL if none found */
...@@ -1124,7 +1124,7 @@ rec_offs_any_null_extern( ...@@ -1124,7 +1124,7 @@ rec_offs_any_null_extern(
return(NULL); return(NULL);
} }
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
/******************************************************//** /******************************************************//**
Returns nonzero if the extern bit is set in nth field of rec. Returns nonzero if the extern bit is set in nth field of rec.
......
...@@ -179,6 +179,8 @@ command. Not tested on Windows. */ ...@@ -179,6 +179,8 @@ command. Not tested on Windows. */
debugging without UNIV_DEBUG */ debugging without UNIV_DEBUG */
#define UNIV_BLOB_LIGHT_DEBUG /* Enable off-page column #define UNIV_BLOB_LIGHT_DEBUG /* Enable off-page column
debugging without UNIV_DEBUG */ debugging without UNIV_DEBUG */
#define UNIV_BLOB_NULL_DEBUG /* Enable deep off-page
column debugging */
#define UNIV_DEBUG /* Enable ut_ad() assertions #define UNIV_DEBUG /* Enable ut_ad() assertions
and disable UNIV_INLINE */ and disable UNIV_INLINE */
#define UNIV_DEBUG_LOCK_VALIDATE /* Enable #define UNIV_DEBUG_LOCK_VALIDATE /* Enable
......
...@@ -231,13 +231,13 @@ row_build( ...@@ -231,13 +231,13 @@ row_build(
ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(rec_offs_validate(rec, index, offsets));
} }
#if 0 /* defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG */ #if 0 && defined UNIV_BLOB_NULL_DEBUG
/* This one can fail in trx_rollback_active() if /* This one can fail in trx_rollback_active() if
the server crashed during an insert before the the server crashed during an insert before the
btr_store_big_rec_extern_fields() did mtr_commit() btr_store_big_rec_extern_fields() did mtr_commit()
all BLOB pointers to the clustered index record. */ all BLOB pointers to the clustered index record. */
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* 0 && UNIV_BLOB_NULL_DEBUG */
if (type != ROW_COPY_POINTERS) { if (type != ROW_COPY_POINTERS) {
/* Take a copy of rec to heap */ /* Take a copy of rec to heap */
...@@ -423,10 +423,10 @@ row_rec_to_index_entry( ...@@ -423,10 +423,10 @@ row_rec_to_index_entry(
rec = rec_copy(buf, rec, offsets); rec = rec_copy(buf, rec, offsets);
/* Avoid a debug assertion in rec_offs_validate(). */ /* Avoid a debug assertion in rec_offs_validate(). */
rec_offs_make_valid(rec, index, offsets); rec_offs_make_valid(rec, index, offsets);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
} else { } else {
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
} }
entry = row_rec_to_index_entry_low(rec, index, offsets, n_ext, heap); entry = row_rec_to_index_entry_low(rec, index, offsets, n_ext, heap);
......
...@@ -550,10 +550,10 @@ row_vers_build_for_consistent_read( ...@@ -550,10 +550,10 @@ row_vers_build_for_consistent_read(
/* The view already sees this version: we can /* The view already sees this version: we can
copy it to in_heap and return */ copy it to in_heap and return */
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern( ut_a(!rec_offs_any_null_extern(
version, *offsets)); version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
buf = mem_heap_alloc(in_heap, buf = mem_heap_alloc(in_heap,
rec_offs_size(*offsets)); rec_offs_size(*offsets));
...@@ -588,9 +588,9 @@ row_vers_build_for_consistent_read( ...@@ -588,9 +588,9 @@ row_vers_build_for_consistent_read(
*offsets = rec_get_offsets(prev_version, index, *offsets, *offsets = rec_get_offsets(prev_version, index, *offsets,
ULINT_UNDEFINED, offset_heap); ULINT_UNDEFINED, offset_heap);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(prev_version, *offsets)); ut_a(!rec_offs_any_null_extern(prev_version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
trx_id = row_get_rec_trx_id(prev_version, index, *offsets); trx_id = row_get_rec_trx_id(prev_version, index, *offsets);
...@@ -691,9 +691,9 @@ row_vers_build_for_semi_consistent_read( ...@@ -691,9 +691,9 @@ row_vers_build_for_semi_consistent_read(
/* We found a version that belongs to a /* We found a version that belongs to a
committed transaction: return it. */ committed transaction: return it. */
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(version, *offsets)); ut_a(!rec_offs_any_null_extern(version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
if (rec == version) { if (rec == version) {
*old_vers = rec; *old_vers = rec;
...@@ -752,9 +752,9 @@ row_vers_build_for_semi_consistent_read( ...@@ -752,9 +752,9 @@ row_vers_build_for_semi_consistent_read(
version = prev_version; version = prev_version;
*offsets = rec_get_offsets(version, index, *offsets, *offsets = rec_get_offsets(version, index, *offsets,
ULINT_UNDEFINED, offset_heap); ULINT_UNDEFINED, offset_heap);
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG #ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(version, *offsets)); ut_a(!rec_offs_any_null_extern(version, *offsets));
#endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ #endif /* UNIV_BLOB_NULL_DEBUG */
}/* for (;;) */ }/* for (;;) */
if (heap) { if (heap) {
......
...@@ -1577,9 +1577,9 @@ trx_undo_prev_version_build( ...@@ -1577,9 +1577,9 @@ trx_undo_prev_version_build(
return(DB_ERROR); return(DB_ERROR);
} }
# if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG # ifdef UNIV_BLOB_NULL_DEBUG
ut_a(!rec_offs_any_null_extern(rec, offsets)); ut_a(!rec_offs_any_null_extern(rec, offsets));
# endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ # endif /* UNIV_BLOB_NULL_DEBUG */
if (row_upd_changes_field_size_or_external(index, offsets, update)) { if (row_upd_changes_field_size_or_external(index, offsets, update)) {
ulint n_ext; ulint n_ext;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment