null+****@clear*****
null+****@clear*****
2012年 3月 18日 (日) 17:47:26 JST
Kouhei Sutou 2012-03-18 17:47:26 +0900 (Sun, 18 Mar 2012) New Revision: ec0b09861985dd1cbfb42ed1d70473856b46240e Log: multiple column key: split code for double Modified files: ha_mroonga.cc ha_mroonga.h Modified: ha_mroonga.cc (+27 -20) =================================================================== --- ha_mroonga.cc 2012-03-18 17:22:06 +0900 (224f2d1) +++ ha_mroonga.cc 2012-03-18 17:47:26 +0900 (6d9dcf2) @@ -8865,6 +8865,29 @@ uint32 ha_mroonga::storage_encode_multiple_column_key_float(const uchar *key, DBUG_RETURN(data_size); } +uint32 ha_mroonga::storage_encode_multiple_column_key_double(const uchar *key, + uchar *buffer, + bool decode) +{ + MRN_DBUG_ENTER_METHOD(); + uint32 data_size = 8; + double double_value = 0.0; + float8get(double_value, key); + int n_bits = (data_size * 8 - 1); + volatile long long int *long_long_value_pointer = + (long long int *)(&double_value); + volatile long long int long_long_value = *long_long_value_pointer; + if (!decode) + long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits)); + mrn_byte_order_host_to_network(buffer, &long_long_value, data_size); + if (decode) { + long_long_value = *((long long int *)buffer); + *((long long int *)buffer) = + long_long_value ^ (((long_long_value ^ (1LL << n_bits)) >> n_bits) | + (1LL << n_bits)); + } + DBUG_RETURN(data_size); +} int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info, const uchar *key, @@ -8901,8 +8924,7 @@ int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info, TYPE_BYTE_SEQUENCE } data_type = TYPE_UNKNOWN; uint32 data_size = 0; - volatile long long int long_long_value = 0; - volatile double double_value = 0.0; + long long int long_long_value = 0; switch (field->real_type()) { case MYSQL_TYPE_DECIMAL: data_type = TYPE_BYTE_SEQUENCE; @@ -8928,8 +8950,9 @@ int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info, break; case MYSQL_TYPE_DOUBLE: data_type = TYPE_DOUBLE; - data_size = 8; - float8get(double_value, current_key); + data_size = storage_encode_multiple_column_key_double(current_key, + current_buffer, + decode); break; case MYSQL_TYPE_NULL: data_type = TYPE_NUMBER; @@ -9059,22 +9082,6 @@ int ha_mroonga::storage_encode_multiple_column_key(KEY *key_info, case TYPE_FLOAT: break; case TYPE_DOUBLE: - { - int n_bits = (data_size * 8 - 1); - volatile long long int *encoded_value_pointer = - (long long int *)(&double_value); - long_long_value = *encoded_value_pointer; - if (!decode) - long_long_value ^= ((long_long_value >> n_bits) | (1LL << n_bits)); - mrn_byte_order_host_to_network(current_buffer, &long_long_value, - data_size); - if (decode) { - long_long_value = *((long long int *)current_buffer); - *((long long int *)current_buffer) = - long_long_value ^ (((long_long_value ^ (1LL << n_bits)) >> n_bits) | - (1LL << n_bits)); - } - } break; case TYPE_BYTE_SEQUENCE: memcpy(current_buffer, current_key, data_size); Modified: ha_mroonga.h (+3 -0) =================================================================== --- ha_mroonga.h 2012-03-18 17:22:06 +0900 (e4db7f8) +++ ha_mroonga.h 2012-03-18 17:47:26 +0900 (fac5516) @@ -536,6 +536,9 @@ private: uint32 storage_encode_multiple_column_key_float(const uchar *key, uchar *buffer, bool decode); + uint32 storage_encode_multiple_column_key_double(const uchar *key, + uchar *buffer, + bool decode); int storage_encode_multiple_column_key(KEY *key_info, const uchar *key, uint key_length, uchar *buffer, uint *encoded_length,