Commit 516fd425 authored by ramil@mysql.com's avatar ramil@mysql.com

Addition to fix for bug #12956: cast make differ rounding.

- use rint() in some other val_int() methods as well.
parent b46c240b
...@@ -2467,7 +2467,7 @@ longlong Item_param::val_int() ...@@ -2467,7 +2467,7 @@ longlong Item_param::val_int()
{ {
switch (state) { switch (state) {
case REAL_VALUE: case REAL_VALUE:
return (longlong) (value.real + (value.real > 0 ? 0.5 : -0.5)); return (longlong) rint(value.real);
case INT_VALUE: case INT_VALUE:
return value.integer; return value.integer;
case DECIMAL_VALUE: case DECIMAL_VALUE:
...@@ -5439,7 +5439,7 @@ void Item_cache_real::store(Item *item) ...@@ -5439,7 +5439,7 @@ void Item_cache_real::store(Item *item)
longlong Item_cache_real::val_int() longlong Item_cache_real::val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
return (longlong) (value+(value > 0 ? 0.5 : -0.5)); return (longlong) rint(value);
} }
......
...@@ -199,7 +199,7 @@ public: ...@@ -199,7 +199,7 @@ public:
String *val_str(String*str); String *val_str(String*str);
my_decimal *val_decimal(my_decimal *decimal_value); my_decimal *val_decimal(my_decimal *decimal_value);
longlong val_int() longlong val_int()
{ DBUG_ASSERT(fixed == 1); return (longlong) val_real(); } { DBUG_ASSERT(fixed == 1); return (longlong) rint(val_real()); }
enum Item_result result_type () const { return REAL_RESULT; } enum Item_result result_type () const { return REAL_RESULT; }
void fix_length_and_dec() void fix_length_and_dec()
{ decimals= NOT_FIXED_DEC; max_length= float_length(decimals); } { decimals= NOT_FIXED_DEC; max_length= float_length(decimals); }
...@@ -943,7 +943,7 @@ class Item_func_udf_float :public Item_udf_func ...@@ -943,7 +943,7 @@ class Item_func_udf_float :public Item_udf_func
longlong val_int() longlong val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
return (longlong) Item_func_udf_float::val_real(); return (longlong) rint(Item_func_udf_float::val_real());
} }
my_decimal *val_decimal(my_decimal *dec_buf) my_decimal *val_decimal(my_decimal *dec_buf)
{ {
......
...@@ -452,7 +452,7 @@ longlong Item_sum_sum::val_int() ...@@ -452,7 +452,7 @@ longlong Item_sum_sum::val_int()
&result); &result);
return result; return result;
} }
return (longlong) val_real(); return (longlong) rint(val_real());
} }
...@@ -1285,7 +1285,7 @@ longlong Item_sum_hybrid::val_int() ...@@ -1285,7 +1285,7 @@ longlong Item_sum_hybrid::val_int()
return sum_int; return sum_int;
} }
default: default:
return (longlong) Item_sum_hybrid::val_real(); return (longlong) rint(Item_sum_hybrid::val_real());
} }
} }
...@@ -2001,7 +2001,7 @@ double Item_avg_field::val_real() ...@@ -2001,7 +2001,7 @@ double Item_avg_field::val_real()
longlong Item_avg_field::val_int() longlong Item_avg_field::val_int()
{ {
return (longlong) val_real(); return (longlong) rint(val_real());
} }
......
...@@ -126,7 +126,7 @@ public: ...@@ -126,7 +126,7 @@ public:
longlong val_int() longlong val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
return (longlong) val_real(); /* Real as default */ return (longlong) rint(val_real()); /* Real as default */
} }
String *val_str(String*str); String *val_str(String*str);
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
...@@ -392,7 +392,7 @@ public: ...@@ -392,7 +392,7 @@ public:
bool add(); bool add();
double val_real(); double val_real();
// In SPs we might force the "wrong" type with select into a declare variable // In SPs we might force the "wrong" type with select into a declare variable
longlong val_int() { return (longlong)val_real(); } longlong val_int() { return (longlong) rint(val_real()); }
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
String *val_str(String *str); String *val_str(String *str);
void reset_field(); void reset_field();
...@@ -421,7 +421,7 @@ public: ...@@ -421,7 +421,7 @@ public:
enum Type type() const {return FIELD_VARIANCE_ITEM; } enum Type type() const {return FIELD_VARIANCE_ITEM; }
double val_real(); double val_real();
longlong val_int() longlong val_int()
{ /* can't be fix_fields()ed */ return (longlong) val_real(); } { /* can't be fix_fields()ed */ return (longlong) rint(val_real()); }
String *val_str(String*); String *val_str(String*);
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
bool is_null() { (void) val_int(); return null_value; } bool is_null() { (void) val_int(); return null_value; }
...@@ -699,7 +699,7 @@ class Item_sum_udf_float :public Item_udf_sum ...@@ -699,7 +699,7 @@ class Item_sum_udf_float :public Item_udf_sum
longlong val_int() longlong val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
return (longlong) Item_sum_udf_float::val_real(); return (longlong) rint(Item_sum_udf_float::val_real());
} }
double val_real(); double val_real();
String *val_str(String*str); String *val_str(String*str);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment