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;
}