Skip to content

Commit

Permalink
Fix ut_ad(!leaf) failure in rec_get_offsets_func() with spatial index
Browse files Browse the repository at this point in the history
This fixes a regression that only affects debug builds, caused by
commit 48192f9 which is necessary
preparation for MDEV-11369 instant ADD COLUMN. (Although that is a
10.3 task, to ease merges between 10.2 and 10.3, this change that
improves debug checks was pushed to 10.2 already.)

Unlike btr_pcur_restore_position(), rtr_cur_restore_position()
can create a search tuple out of a non-leaf page record. So,
we must pass 'bool leaf' parameter to dict_index_build_data_tuple().

dict_index_build_data_tuple(): Add a debug-only parameter 'bool leaf'.

rec_copy_prefix_to_dtuple(): Make the parameter debug-only.

row_sel_get_clust_rec_for_mysql(): In the debug code for spatial index,
remove an unnecessary call to buf_page_get_gen(), and use the already
latched block directly.
  • Loading branch information
dr-m committed Sep 20, 2017
1 parent a1e4797 commit 47cd984
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 36 deletions.
2 changes: 1 addition & 1 deletion storage/innobase/btr/btr0pcur.cc
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ btr_pcur_restore_position_func(

heap = mem_heap_create(256);

tuple = dict_index_build_data_tuple(index, cursor->old_rec,
tuple = dict_index_build_data_tuple(cursor->old_rec, index, true,
cursor->old_n_fields, heap);

/* Save the old search mode of the cursor */
Expand Down
24 changes: 15 additions & 9 deletions storage/innobase/dict/dict0dict.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5702,16 +5702,22 @@ dict_index_copy_rec_order_prefix(
return(rec_copy_prefix_to_buf(rec, index, n, buf, buf_size));
}

/**********************************************************************//**
Builds a typed data tuple out of a physical record.
/** Convert a physical record into a search tuple.
@param[in] rec index record (not necessarily in an index page)
@param[in] index index
@param[in] leaf whether rec is in a leaf page
@param[in] n_fields number of data fields
@param[in,out] heap memory heap for allocation
@return own: data tuple */
dtuple_t*
dict_index_build_data_tuple(
/*========================*/
dict_index_t* index, /*!< in: index tree */
rec_t* rec, /*!< in: record for which to build data tuple */
ulint n_fields,/*!< in: number of data fields */
mem_heap_t* heap) /*!< in: memory heap where tuple created */
dict_index_build_data_tuple_func(
const rec_t* rec,
const dict_index_t* index,
#ifdef UNIV_DEBUG
bool leaf,
#endif /* UNIV_DEBUG */
ulint n_fields,
mem_heap_t* heap)
{
dtuple_t* tuple;

Expand All @@ -5722,7 +5728,7 @@ dict_index_build_data_tuple(

dict_index_copy_types(tuple, index, n_fields);

rec_copy_prefix_to_dtuple(tuple, rec, index, true, n_fields, heap);
rec_copy_prefix_to_dtuple(tuple, rec, index, leaf, n_fields, heap);

ut_ad(dtuple_check_typed(tuple));

Expand Down
2 changes: 1 addition & 1 deletion storage/innobase/gis/gis0sea.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1352,7 +1352,7 @@ rtr_cur_restore_position(

heap = mem_heap_create(256);

tuple = dict_index_build_data_tuple(index, r_cursor->old_rec,
tuple = dict_index_build_data_tuple(r_cursor->old_rec, index, !level,
r_cursor->old_n_fields, heap);

page_cursor = btr_pcur_get_page_cur(r_cursor);
Expand Down
30 changes: 22 additions & 8 deletions storage/innobase/include/dict0dict.h
Original file line number Diff line number Diff line change
Expand Up @@ -1460,17 +1460,31 @@ dict_index_copy_rec_order_prefix(
copied prefix, or NULL */
ulint* buf_size)/*!< in/out: buffer size */
MY_ATTRIBUTE((nonnull, warn_unused_result));
/**********************************************************************//**
Builds a typed data tuple out of a physical record.
/** Convert a physical record into a search tuple.
@param[in] rec index record (not necessarily in an index page)
@param[in] index index
@param[in] leaf whether rec is in a leaf page
@param[in] n_fields number of data fields
@param[in,out] heap memory heap for allocation
@return own: data tuple */
dtuple_t*
dict_index_build_data_tuple(
/*========================*/
dict_index_t* index, /*!< in: index */
rec_t* rec, /*!< in: record for which to build data tuple */
ulint n_fields,/*!< in: number of data fields */
mem_heap_t* heap) /*!< in: memory heap where tuple created */
dict_index_build_data_tuple_func(
const rec_t* rec,
const dict_index_t* index,
#ifdef UNIV_DEBUG
bool leaf,
#endif /* UNIV_DEBUG */
ulint n_fields,
mem_heap_t* heap)
MY_ATTRIBUTE((nonnull, warn_unused_result));
#ifdef UNIV_DEBUG
# define dict_index_build_data_tuple(rec, index, leaf, n_fields, heap) \
dict_index_build_data_tuple_func(rec, index, leaf, n_fields, heap)
#else /* UNIV_DEBUG */
# define dict_index_build_data_tuple(rec, index, leaf, n_fields, heap) \
dict_index_build_data_tuple_func(rec, index, n_fields, heap)
#endif /* UNIV_DEBUG */

/*********************************************************************//**
Gets the space id of the root of the index tree.
@return space id */
Expand Down
11 changes: 10 additions & 1 deletion storage/innobase/include/rem0rec.h
Original file line number Diff line number Diff line change
Expand Up @@ -944,14 +944,23 @@ The fields are copied into the memory heap.
@param[in] n_fields number of fields to copy
@param[in,out] heap memory heap */
void
rec_copy_prefix_to_dtuple(
rec_copy_prefix_to_dtuple_func(
dtuple_t* tuple,
const rec_t* rec,
const dict_index_t* index,
#ifdef UNIV_DEBUG
bool is_leaf,
#endif /* UNIV_DEBUG */
ulint n_fields,
mem_heap_t* heap)
MY_ATTRIBUTE((nonnull));
#ifdef UNIV_DEBUG
# define rec_copy_prefix_to_dtuple(tuple,rec,index,leaf,n_fields,heap) \
rec_copy_prefix_to_dtuple_func(tuple,rec,index,leaf,n_fields,heap)
#else /* UNIV_DEBUG */
# define rec_copy_prefix_to_dtuple(tuple,rec,index,leaf,n_fields,heap) \
rec_copy_prefix_to_dtuple_func(tuple,rec,index,n_fields,heap)
#endif /* UNIV_DEBUG */
/***************************************************************//**
Validates the consistency of a physical record.
@return TRUE if ok */
Expand Down
4 changes: 3 additions & 1 deletion storage/innobase/rem/rem0rec.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1556,11 +1556,13 @@ The fields are copied into the memory heap.
@param[in] n_fields number of fields to copy
@param[in,out] heap memory heap */
void
rec_copy_prefix_to_dtuple(
rec_copy_prefix_to_dtuple_func(
dtuple_t* tuple,
const rec_t* rec,
const dict_index_t* index,
#ifdef UNIV_DEBUG
bool is_leaf,
#endif /* UNIV_DEBUG */
ulint n_fields,
mem_heap_t* heap)
{
Expand Down
19 changes: 4 additions & 15 deletions storage/innobase/row/row0sel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3393,23 +3393,12 @@ row_sel_get_clust_rec_for_mysql(
goto func_exit;
}

ulint page_no = page_get_page_no(
btr_pcur_get_page(
prebuilt->pcur));

page_id_t page_id(dict_index_get_space(sec_index),
page_no);

buf_block_t* block = buf_page_get_gen(
page_id,
dict_table_page_size(sec_index->table),
RW_NO_LATCH, NULL, BUF_GET,
__FILE__, __LINE__, mtr, &err);

buf_block_t* block = btr_pcur_get_block(
prebuilt->pcur);
mem_heap_t* heap = mem_heap_create(256);
dtuple_t* tuple = dict_index_build_data_tuple(
sec_index, const_cast<rec_t*>(rec),
dict_index_get_n_fields(sec_index), heap);;
rec, sec_index, true,
sec_index->n_fields, heap);
page_cur_t page_cursor;

ulint low_match = page_cur_search(
Expand Down

0 comments on commit 47cd984

Please sign in to comment.