diff --git a/storage/tokudb/hatoku_cmp.cc b/storage/tokudb/hatoku_cmp.cc index 99a5aed7962..1f2703d5497 100755 --- a/storage/tokudb/hatoku_cmp.cc +++ b/storage/tokudb/hatoku_cmp.cc @@ -593,6 +593,39 @@ inline int tokudb_compare_two_hidden_keys( return a < b ? -1 : (a > b ? 1 : 0); } +// +// returns number of bytes to jump over +// +u_int32_t skip_field_in_descriptor(uchar* row_desc) { + uchar* row_desc_pos = row_desc; + TOKU_TYPE toku_type = (TOKU_TYPE)row_desc_pos[0]; + row_desc_pos++; + + switch (toku_type) { + case (toku_type_hpk): + case (toku_type_double): + case (toku_type_float): + break; + case (toku_type_int): + row_desc_pos += 2; + break; + case (toku_type_fixbinary): + case (toku_type_varbinary): + row_desc_pos++; + break; + case (toku_type_fixstring): + case (toku_type_varstring): + case (toku_type_blob): + row_desc_pos++; + row_desc_pos += sizeof(u_int32_t); + break; + default: + assert(false); + break; + } + return (u_int32_t)(row_desc_pos - row_desc); +} + inline int compare_toku_field( uchar* a_buf, uchar* b_buf, @@ -955,8 +988,22 @@ int tokudb_compare_two_keys( ret_val = ((int) *new_key_ptr - (int) *saved_key_ptr); goto exit; } - new_key_ptr++; saved_key_ptr++; + // + // in case we just read the fact that new_key_ptr and saved_key_ptr + // have NULL as their next field + // + if (!*new_key_ptr++) { + // + // skip row_desc_ptr[0] read in if clause + // + row_desc_ptr++; + // + // skip data that describes rest of field + // + row_desc_ptr += skip_field_in_descriptor(row_desc_ptr); + continue; + } } row_desc_ptr++;