From 329a3dea5d1b648e7bf018b36cc84ec4cd9175c3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 4 Mar 2005 20:35:55 +0400 Subject: [PATCH] Fix for bug #8430 (CEILING returns incorrect result) sql/item_func.cc: ceiling::int_op should work differently depending on argument's type --- sql/item_func.cc | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/sql/item_func.cc b/sql/item_func.cc index 37e59fa89d3..2f00c06f68a 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1629,13 +1629,25 @@ void Item_func_int_val::find_num_type() longlong Item_func_ceiling::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) ceil(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= decimal_op(&dec_buf))) + my_decimal2int(E_DEC_FATAL_ERROR, dec, unsigned_flag, &result); + else + result= 0; + break; + } + default: + result= (longlong)real_op(); + }; + return result; }