|
|
|
@ -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++; |
|
|
|
|
|
|
|
|