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,