diff options
-rw-r--r-- | mysql-test/r/type_newdecimal.result | 10 | ||||
-rw-r--r-- | mysql-test/t/type_newdecimal.test | 2 | ||||
-rw-r--r-- | sql/item_func.cc | 30 |
3 files changed, 31 insertions, 11 deletions
diff --git a/mysql-test/r/type_newdecimal.result b/mysql-test/r/type_newdecimal.result index 5b6612572cb..bb5f9e7f3b0 100644 --- a/mysql-test/r/type_newdecimal.result +++ b/mysql-test/r/type_newdecimal.result @@ -733,6 +733,9 @@ abs(9999999999999999999999) select abs(-9999999999999999999999); abs(-9999999999999999999999) 9999999999999999999999 +select ceiling(999999999999999999); +ceiling(999999999999999999) +999999999999999999 select ceiling(99999999999999999999); ceiling(99999999999999999999) 99999999999999999999 @@ -741,13 +744,16 @@ ceiling(9.9999999999999999999) 10 select ceiling(-9.9999999999999999999); ceiling(-9.9999999999999999999) --10 +-9 +select floor(999999999999999999); +floor(999999999999999999) +999999999999999999 select floor(9999999999999999999999); floor(9999999999999999999999) 9999999999999999999999 select floor(9.999999999999999999999); floor(9.999999999999999999999) -10 +9 select floor(-9.999999999999999999999); floor(-9.999999999999999999999) -10 diff --git a/mysql-test/t/type_newdecimal.test b/mysql-test/t/type_newdecimal.test index 3922a0448e9..d116d56fa48 100644 --- a/mysql-test/t/type_newdecimal.test +++ b/mysql-test/t/type_newdecimal.test @@ -601,6 +601,7 @@ select abs(9999999999999999999999); select abs(-9999999999999999999999); #-- should return 9999999999999999999999 # +select ceiling(999999999999999999); select ceiling(99999999999999999999); #-- should return 99999999999999999999 # @@ -610,6 +611,7 @@ select ceiling(9.9999999999999999999); select ceiling(-9.9999999999999999999); #-- should return 9 # +select floor(999999999999999999); select floor(9999999999999999999999); #-- should return 9999999999999999999999 # diff --git a/sql/item_func.cc b/sql/item_func.cc index c1f5de23b7d..e5e9fcd5dbf 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1638,14 +1638,14 @@ longlong Item_func_ceiling::int_op() case DECIMAL_RESULT: { my_decimal dec_buf, *dec; - if ((dec= decimal_op(&dec_buf))) + if ((dec= Item_func_ceiling::decimal_op(&dec_buf))) my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result); else result= 0; break; } default: - result= (longlong)real_op(); + result= (longlong)Item_func_ceiling::real_op(); }; return result; } @@ -1676,13 +1676,25 @@ my_decimal *Item_func_ceiling::decimal_op(my_decimal *decimal_value) longlong Item_func_floor::int_op() { - /* - the volatile's for BUG #3051 to calm optimizer down (because of gcc's - bug) - */ - volatile double value= args[0]->val_real(); - null_value= args[0]->null_value; - return (longlong) floor(value); + longlong result; + switch (args[0]->result_type()) { + case INT_RESULT: + result= args[0]->val_int(); + null_value= args[0]->null_value; + break; + case DECIMAL_RESULT: + { + my_decimal dec_buf, *dec; + if ((dec= Item_func_floor::decimal_op(&dec_buf))) + my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result); + else + result= 0; + break; + } + default: + result= (longlong)Item_func_floor::real_op(); + }; + return result; } |