diff options
Diffstat (limited to 'storage/innobase/include/rem0rec.ic')
-rw-r--r-- | storage/innobase/include/rem0rec.ic | 179 |
1 files changed, 94 insertions, 85 deletions
diff --git a/storage/innobase/include/rem0rec.ic b/storage/innobase/include/rem0rec.ic index 9c24f385f4f..e716241f26c 100644 --- a/storage/innobase/include/rem0rec.ic +++ b/storage/innobase/include/rem0rec.ic @@ -26,7 +26,7 @@ most significant bytes and bits are written below less significant. downward from origin -> 1 8 bits pointer to next record 2 8 bits pointer to next record - 3 1 bit short flag + 3 1 bit short flag 7 bits number of fields 4 3 bits number of fields 5 bits heap number @@ -99,7 +99,7 @@ and the shift needed to obtain each bit-field of the record. */ #define REC_INFO_BITS_SHIFT 0 /* The deleted flag in info bits */ -#define REC_INFO_DELETED_FLAG 0x20UL /* when bit is set to 1, it means the +#define REC_INFO_DELETED_FLAG 0x20UL /* when bit is set to 1, it means the record has been delete marked */ /* The following masks are used to filter the SQL null bit from one-byte and two-byte offsets */ @@ -137,14 +137,14 @@ rec_set_nth_field_null_bit( rec_t* rec, /* in: record */ ulint i, /* in: ith field */ ibool val); /* in: value to set */ -/*************************************************************** +/*************************************************************** Sets an old-style record field to SQL null. The physical size of the field is not changed. */ void rec_set_nth_field_sql_null( /*=======================*/ - rec_t* rec, /* in: record */ + rec_t* rec, /* in: record */ ulint n); /* in: index of the field */ /*************************************************************** @@ -207,9 +207,9 @@ rec_set_bit_field_1( ut_ad(mask <= 0xFFUL); ut_ad(((mask >> shift) << shift) == mask); ut_ad(((val << shift) & mask) == (val << shift)); - - mach_write_to_1(rec - offs, - (mach_read_from_1(rec - offs) & ~mask) + + mach_write_to_1(rec - offs, + (mach_read_from_1(rec - offs) & ~mask) | (val << shift)); } @@ -250,8 +250,8 @@ rec_set_bit_field_2( ut_ad(((mask >> shift) << shift) == mask); ut_ad(((val << shift) & mask) == (val << shift)); - mach_write_to_2(rec - offs, - (mach_read_from_2(rec - offs) & ~mask) + mach_write_to_2(rec - offs, + (mach_read_from_2(rec - offs) & ~mask) | (val << shift)); } @@ -259,18 +259,21 @@ rec_set_bit_field_2( The following function is used to get the offset of the next chained record on the same page. */ UNIV_INLINE -ulint +ulint rec_get_next_offs( /*==============*/ /* out: the page offset of the next chained record, or 0 if none */ rec_t* rec, /* in: physical record */ ulint comp) /* in: nonzero=compact page format */ -{ +{ ulint field_value; - - ut_ad(REC_NEXT_MASK == 0xFFFFUL); - ut_ad(REC_NEXT_SHIFT == 0); +#if REC_NEXT_MASK != 0xFFFFUL +# error "REC_NEXT_MASK != 0xFFFFUL" +#endif +#if REC_NEXT_SHIFT +# error "REC_NEXT_SHIFT != 0" +#endif field_value = mach_read_from_2(rec - REC_NEXT); @@ -286,16 +289,16 @@ rec_get_next_offs( (int16_t) field_value + ut_align_offset(...) < UNIV_PAGE_SIZE */ ut_ad((field_value >= 32768 - ? field_value - 65536 - : field_value) - + ut_align_offset(rec, UNIV_PAGE_SIZE) - < UNIV_PAGE_SIZE); + ? field_value - 65536 + : field_value) + + ut_align_offset(rec, UNIV_PAGE_SIZE) + < UNIV_PAGE_SIZE); #endif if (field_value == 0) { return(0); } - + return(ut_align_offset(rec + field_value, UNIV_PAGE_SIZE)); } else { ut_ad(field_value < UNIV_PAGE_SIZE); @@ -317,8 +320,12 @@ rec_set_next_offs( { ut_ad(rec); ut_ad(UNIV_PAGE_SIZE > next); - ut_ad(REC_NEXT_MASK == 0xFFFFUL); - ut_ad(REC_NEXT_SHIFT == 0); +#if REC_NEXT_MASK != 0xFFFFUL +# error "REC_NEXT_MASK != 0xFFFFUL" +#endif +#if REC_NEXT_SHIFT +# error "REC_NEXT_SHIFT != 0" +#endif if (comp) { ulint field_value; @@ -327,8 +334,8 @@ rec_set_next_offs( /* The following two statements calculate next - offset_of_rec mod 64Ki, where mod is the modulo as a non-negative number */ - - field_value = (ulint)((lint)next + + field_value = (ulint)((lint)next - (lint)ut_align_offset(rec, UNIV_PAGE_SIZE)); field_value &= REC_NEXT_MASK; } else { @@ -361,7 +368,7 @@ rec_get_n_fields_old( ut_ad(ret > 0); return(ret); -} +} /********************************************************** The following function is used to set the number of fields @@ -414,9 +421,11 @@ rec_get_n_fields( { ut_ad(rec); ut_ad(index); - if (UNIV_UNLIKELY(!index->table->comp)) { + + if (!dict_table_is_comp(index->table)) { return(rec_get_n_fields_old(rec)); } + switch (rec_get_status(rec)) { case REC_STATUS_ORDINARY: return(dict_index_get_n_fields(index)); @@ -449,10 +458,10 @@ rec_get_n_owned( ret = rec_get_bit_field_1(rec, comp ? REC_NEW_N_OWNED : REC_OLD_N_OWNED, REC_N_OWNED_MASK, REC_N_OWNED_SHIFT); - ut_ad(ret <= REC_MAX_N_OWNED); + ut_ad(ret <= REC_MAX_N_OWNED); return(ret); -} +} /********************************************************** The following function is used to set the number of owned records. */ @@ -492,7 +501,7 @@ rec_get_info_bits( ut_ad((ret & ~REC_INFO_BITS_MASK) == 0); return(ret); -} +} /********************************************************** The following function is used to set the info bits of a record. */ @@ -609,7 +618,7 @@ rec_set_deleted_flag( ulint val; val = rec_get_info_bits(rec, comp); - + if (flag) { val |= REC_INFO_DELETED_FLAG; } else { @@ -624,7 +633,7 @@ The following function tells if a new-style record is a node pointer. */ UNIV_INLINE ibool rec_get_node_ptr_flag( -/*=================*/ +/*==================*/ /* out: TRUE if node pointer */ rec_t* rec) /* in: physical record */ { @@ -637,7 +646,7 @@ heap of the index page. */ UNIV_INLINE ulint rec_get_heap_no( -/*=============*/ +/*============*/ /* out: heap order number */ rec_t* rec, /* in: physical record */ ulint comp) /* in: nonzero=compact page format */ @@ -652,14 +661,14 @@ rec_get_heap_no( ut_ad(ret <= REC_MAX_HEAP_NO); return(ret); -} +} /********************************************************** The following function is used to set the heap number field in the record. */ UNIV_INLINE void rec_set_heap_no( -/*=============*/ +/*============*/ rec_t* rec, /* in: physical record */ ulint comp, /* in: nonzero=compact page format */ ulint heap_no)/* in: the heap number */ @@ -715,17 +724,17 @@ UNIV_INLINE ulint rec_1_get_field_end_info( /*=====================*/ - /* out: offset of the start of the field, SQL null - flag ORed */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + /* out: offset of the start of the field, SQL null + flag ORed */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(rec_get_1byte_offs_flag(rec)); ut_ad(n < rec_get_n_fields_old(rec)); return(mach_read_from_1(rec - (REC_N_OLD_EXTRA_BYTES + n + 1))); } - + /********************************************************** Returns the offset of nth field end if the record is stored in the 2-byte offsets form. If the field is SQL null, the flag is ORed in the returned @@ -734,10 +743,10 @@ UNIV_INLINE ulint rec_2_get_field_end_info( /*=====================*/ - /* out: offset of the start of the field, SQL null - flag and extern storage flag ORed */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + /* out: offset of the start of the field, SQL null + flag and extern storage flag ORed */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(!rec_get_1byte_offs_flag(rec)); ut_ad(n < rec_get_n_fields_old(rec)); @@ -758,7 +767,7 @@ this position, and following positions hold the end offsets of the fields. */ #define rec_offs_base(offsets) (offsets + REC_OFFS_HEADER_SIZE) -/************************************************************** +/************************************************************** The following function returns the number of allocated elements for an array of offsets. */ UNIV_INLINE @@ -775,7 +784,7 @@ rec_offs_get_n_alloc( return(n_alloc); } -/************************************************************** +/************************************************************** The following function sets the number of allocated elements for an array of offsets. */ UNIV_INLINE @@ -790,12 +799,12 @@ rec_offs_set_n_alloc( offsets[0] = n_alloc; } -/************************************************************** +/************************************************************** The following function returns the number of fields in a record. */ UNIV_INLINE ulint rec_offs_n_fields( -/*===============*/ +/*==============*/ /* out: number of fields */ const ulint* offsets)/* in: array returned by rec_get_offsets() */ { @@ -891,8 +900,8 @@ UNIV_INLINE byte* rec_get_nth_field( /*==============*/ - /* out: pointer to the field */ - rec_t* rec, /* in: record */ + /* out: pointer to the field */ + rec_t* rec, /* in: record */ const ulint* offsets,/* in: array returned by rec_get_offsets() */ ulint n, /* in: index of the field */ ulint* len) /* out: length of the field; UNIV_SQL_NULL @@ -1019,7 +1028,7 @@ rec_set_nth_field_extern_bit( where rec is, or NULL; in the NULL case we do not write to log about the change */ { - if (UNIV_LIKELY(index->table->comp)) { + if (dict_table_is_comp(index->table)) { rec_set_nth_field_extern_bit_new(rec, index, i, val, mtr); } else { rec_set_nth_field_extern_bit_old(rec, i, val, mtr); @@ -1036,17 +1045,17 @@ UNIV_INLINE ulint rec_1_get_prev_field_end_info( /*==========================*/ - /* out: offset of the start of the PREVIOUS field, SQL + /* out: offset of the start of the PREVIOUS field, SQL null flag ORed */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(rec_get_1byte_offs_flag(rec)); ut_ad(n <= rec_get_n_fields_old(rec)); return(mach_read_from_1(rec - (REC_N_OLD_EXTRA_BYTES + n))); } - + /********************************************************** Returns the offset of n - 1th field end if the record is stored in the 2-byte offsets form. If the field is SQL null, the flag is ORed in the returned @@ -1055,10 +1064,10 @@ UNIV_INLINE ulint rec_2_get_prev_field_end_info( /*==========================*/ - /* out: offset of the start of the PREVIOUS field, SQL + /* out: offset of the start of the PREVIOUS field, SQL null flag ORed */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(!rec_get_1byte_offs_flag(rec)); ut_ad(n <= rec_get_n_fields_old(rec)); @@ -1073,9 +1082,9 @@ UNIV_INLINE void rec_1_set_field_end_info( /*=====================*/ - rec_t* rec, /* in: record */ - ulint n, /* in: field index */ - ulint info) /* in: value to set */ + rec_t* rec, /* in: record */ + ulint n, /* in: field index */ + ulint info) /* in: value to set */ { ut_ad(rec_get_1byte_offs_flag(rec)); ut_ad(n < rec_get_n_fields_old(rec)); @@ -1090,9 +1099,9 @@ UNIV_INLINE void rec_2_set_field_end_info( /*=====================*/ - rec_t* rec, /* in: record */ - ulint n, /* in: field index */ - ulint info) /* in: value to set */ + rec_t* rec, /* in: record */ + ulint n, /* in: field index */ + ulint info) /* in: value to set */ { ut_ad(!rec_get_1byte_offs_flag(rec)); ut_ad(n < rec_get_n_fields_old(rec)); @@ -1107,9 +1116,9 @@ UNIV_INLINE ulint rec_1_get_field_start_offs( /*=======================*/ - /* out: offset of the start of the field */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + /* out: offset of the start of the field */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(rec_get_1byte_offs_flag(rec)); ut_ad(n <= rec_get_n_fields_old(rec)); @@ -1122,7 +1131,7 @@ rec_1_get_field_start_offs( return(rec_1_get_prev_field_end_info(rec, n) & ~REC_1BYTE_SQL_NULL_MASK); } - + /********************************************************** Returns the offset of nth field start if the record is stored in the 2-byte offsets form. */ @@ -1130,9 +1139,9 @@ UNIV_INLINE ulint rec_2_get_field_start_offs( /*=======================*/ - /* out: offset of the start of the field */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + /* out: offset of the start of the field */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(!rec_get_1byte_offs_flag(rec)); ut_ad(n <= rec_get_n_fields_old(rec)); @@ -1145,7 +1154,7 @@ rec_2_get_field_start_offs( return(rec_2_get_prev_field_end_info(rec, n) & ~(REC_2BYTE_SQL_NULL_MASK | REC_2BYTE_EXTERN_MASK)); } - + /********************************************************** The following function is used to read the offset of the start of a data field in the record. The start of an SQL null field is the end offset of the @@ -1155,9 +1164,9 @@ UNIV_INLINE ulint rec_get_field_start_offs( /*=====================*/ - /* out: offset of the start of the field */ - rec_t* rec, /* in: record */ - ulint n) /* in: field index */ + /* out: offset of the start of the field */ + rec_t* rec, /* in: record */ + ulint n) /* in: field index */ { ut_ad(rec); ut_ad(n <= rec_get_n_fields_old(rec)); @@ -1184,8 +1193,8 @@ ulint rec_get_nth_field_size( /*===================*/ /* out: field size in bytes */ - rec_t* rec, /* in: record */ - ulint n) /* in: index of the field */ + rec_t* rec, /* in: record */ + ulint n) /* in: index of the field */ { ulint os; ulint next_os; @@ -1198,7 +1207,7 @@ rec_get_nth_field_size( return(next_os - os); } -/*************************************************************** +/*************************************************************** This is used to modify the value of an already existing field in a record. The previous value must have exactly the same size as the new value. If len is UNIV_SQL_NULL then the field is treated as an SQL null for old-style @@ -1243,7 +1252,7 @@ rec_set_nth_field( ut_memcpy(data2, data, len); } -/************************************************************** +/************************************************************** The following function returns the data size of an old-style physical record, that is the sum of field lengths. SQL null fields are counted as length 0 fields. The value returned by the function @@ -1260,7 +1269,7 @@ rec_get_data_size_old( return(rec_get_field_start_offs(rec, rec_get_n_fields_old(rec))); } -/************************************************************** +/************************************************************** The following function sets the number of fields in offsets. */ UNIV_INLINE void @@ -1327,7 +1336,7 @@ rec_offs_size( { return(rec_offs_data_size(offsets) + rec_offs_extra_size(offsets)); } - + /************************************************************** Returns a pointer to the end of the record. */ UNIV_INLINE @@ -1367,7 +1376,7 @@ rec_copy( { ulint extra_len; ulint data_len; - + ut_ad(rec && buf); ut_ad(rec_offs_validate((rec_t*) rec, NULL, offsets)); ut_ad(rec_validate((rec_t*) rec, offsets)); @@ -1434,7 +1443,7 @@ rec_get_converted_size( ? dict_index_get_n_unique_in_tree(index) + 1 : dict_index_get_n_fields(index))); - if (UNIV_LIKELY(index->table->comp)) { + if (dict_table_is_comp(index->table)) { return(rec_get_converted_size_new(index, dtuple)); } @@ -1478,15 +1487,15 @@ rec_fold( ut_ad(n_fields < n_fields_rec || n_bytes == 0); if (n_fields > n_fields_rec) { - n_fields = n_fields_rec; + n_fields = n_fields_rec; } if (n_fields == n_fields_rec) { - n_bytes = 0; + n_bytes = 0; } fold = ut_fold_dulint(tree_id); - + for (i = 0; i < n_fields; i++) { data = rec_get_nth_field(rec, offsets, i, &len); @@ -1503,7 +1512,7 @@ rec_fold( if (len > n_bytes) { len = n_bytes; } - + fold = ut_fold_ulint_pair(fold, ut_fold_binary(data, len)); } |