null+****@clear*****
null+****@clear*****
2011年 12月 16日 (金) 11:04:30 JST
Kouhei Sutou 2011-12-16 02:04:30 +0000 (Fri, 16 Dec 2011) New Revision: fcfa60ec62325a8c33e1bce70dfbdb4d479ca627 Log: [i386] suppress strict-aliasing warnings. fixes [groonga-dev, 00659] warning message: dereferencing type-punned pointer will break strict-aliasing rules. Reported by Kazuhiko. Thanks!!! Modified files: ha_mroonga.cc Modified: ha_mroonga.cc (+14 -10) =================================================================== --- ha_mroonga.cc 2011-12-12 07:34:24 +0000 (2007f16) +++ ha_mroonga.cc 2011-12-16 02:04:30 +0000 (3f29e7e) @@ -704,12 +704,13 @@ static uchar *mrn_multiple_column_key_encode(KEY *key_info, enum { TYPE_LONG_LONG_NUMBER, TYPE_NUMBER, - TYPE_FLOAT, + TYPE_DOUBLE, TYPE_BYTE_SEQUENCE } data_type; uint32 data_size; long long int long_long_value; - double float_value; + float float_value; + double double_value; switch (field->type()) { case MYSQL_TYPE_BIT: case MYSQL_TYPE_ENUM: @@ -735,14 +736,15 @@ static uchar *mrn_multiple_column_key_encode(KEY *key_info, data_size = 8; break; case MYSQL_TYPE_FLOAT: - data_type = TYPE_FLOAT; + data_type = TYPE_DOUBLE; data_size = 8; float4get(float_value, current_key); + double_value = float_value; break; case MYSQL_TYPE_DOUBLE: - data_type = TYPE_FLOAT; + data_type = TYPE_DOUBLE; data_size = 8; - float8get(float_value, current_key); + float8get(double_value, current_key); break; case MYSQL_TYPE_TIME: case MYSQL_TYPE_YEAR: @@ -782,9 +784,9 @@ static uchar *mrn_multiple_column_key_encode(KEY *key_info, } } break; - case TYPE_FLOAT: + case TYPE_DOUBLE: { - long_long_value = (long long int)(float_value); + long_long_value = (long long int)(double_value); long_long_value ^= ((long_long_value >> 63) | (1LL << 63)); mrn_byte_order_host_to_network(current_buffer, &long_long_value, data_size); @@ -850,9 +852,11 @@ static int mrn_set_key_buf(grn_ctx *ctx, Field *field, } case MYSQL_TYPE_FLOAT: { - double val; - float4get(val, ptr); - memcpy(buf, &val, 8); + float float_value; + double double_value; + float4get(float_value, ptr); + double_value = float_value; + memcpy(buf, &double_value, 8); *size = 8; break; }