summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/type_newdecimal.result10
-rw-r--r--mysql-test/t/type_newdecimal.test2
-rw-r--r--sql/item_func.cc30
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;
}