函数rec_get_nth_field_offs_old

时间:2022-03-12 21:25:55
/************************************************************//**
The following function is used to get the offset to the nth
data field in an old-style record.
@return    offset to the field */
UNIV_INTERN
ulint
rec_get_nth_field_offs_old(
/*=======================*/
    const rec_t*    rec,    /*!< in: record */
    ulint        n,    /*!< in: index of the field */
    ulint*        len)    /*!< out: length of the field;
                UNIV_SQL_NULL if SQL null */
{
    ulint    os;
    ulint    next_os;

    ut_ad(len);
    ut_a(rec);
    ut_a(n < rec_get_n_fields_old(rec));

    if (rec_get_1byte_offs_flag(rec)) {
        os = rec_1_get_field_start_offs(rec, n);

        next_os = rec_1_get_field_end_info(rec, n);

        if (next_os & REC_1BYTE_SQL_NULL_MASK) {
            *len = UNIV_SQL_NULL;

            return(os);
        }

        next_os = next_os & ~REC_1BYTE_SQL_NULL_MASK;
    } else {
        os = rec_2_get_field_start_offs(rec, n);

        next_os = rec_2_get_field_end_info(rec, n);

        if (next_os & REC_2BYTE_SQL_NULL_MASK) {
            *len = UNIV_SQL_NULL;

            return(os);
        }

        next_os = next_os & ~(REC_2BYTE_SQL_NULL_MASK
                      | REC_2BYTE_EXTERN_MASK);
    }

    *len = next_os - os;

    ut_ad(*len < UNIV_PAGE_SIZE);

    return(os);
}

/******************************************************//**
Returns the offset of nth field start if the record is stored in the 1-byte
offsets form.
@return    offset of the start of the field */
UNIV_INLINE
ulint
rec_1_get_field_start_offs(
/*=======================*/
    const 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(rec_1_get_prev_field_end_info(rec, n)
           & ~REC_1BYTE_SQL_NULL_MASK);
}

/******************************************************//**
Returns the offset of n - 1th field end if the record is stored in the 1-byte
offsets form. If the field is SQL null, the flag is ORed in the returned
value. This function and the 2-byte counterpart are defined here because the
C-compiler was not able to sum negative and positive constant offsets, and
warned of constant arithmetic overflow within the compiler.
@return offset of the start of the PREVIOUS field, SQL null flag ORed */
UNIV_INLINE
ulint
rec_1_get_prev_field_end_info(
/*==========================*/
  const 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 nth field end if the record is stored in the 1-byte
offsets form. If the field is SQL null, the flag is ORed in the returned
value.
@return    offset of the start of the field, SQL null flag ORed */
UNIV_INLINE
ulint
rec_1_get_field_end_info(
/*=====================*/
    const 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));

    )));
}