summaryrefslogtreecommitdiff
path: root/sql/item_func.cc
diff options
context:
space:
mode:
authorunknown <monty@hundin.mysql.fi>2001-08-18 14:24:01 +0300
committerunknown <monty@hundin.mysql.fi>2001-08-18 14:24:01 +0300
commit0f4b1e511536c8e3e691758a523e1f9b4bf1a75e (patch)
tree185409a9024f800dcf89ef564b4baaccbaa1c5b2 /sql/item_func.cc
parent131cd2ab9a2c3585061860282e3aae28c38bd7c4 (diff)
downloadmariadb-git-0f4b1e511536c8e3e691758a523e1f9b4bf1a75e.tar.gz
Fix for handling of floats inside val_int() of +, - * and /.
Build-tools/Do-compile: Make shutdown safer Docs/manual.texi: Fix of bad merge sql/log.cc: cleanup sql/sql_acl.cc: cleanup
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r--sql/item_func.cc54
1 files changed, 34 insertions, 20 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 1d1a72d35eb..ef3372629f6 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -259,10 +259,14 @@ double Item_func_plus::val()
longlong Item_func_plus::val_int()
{
- longlong value=args[0]->val_int()+args[1]->val_int();
- if ((null_value=args[0]->null_value || args[1]->null_value))
- return 0;
- return value;
+ if (hybrid_type == INT_RESULT)
+ {
+ longlong value=args[0]->val_int()+args[1]->val_int();
+ if ((null_value=args[0]->null_value || args[1]->null_value))
+ return 0;
+ return value;
+ }
+ return (longlong) Item_func_plus::val();
}
double Item_func_minus::val()
@@ -275,12 +279,17 @@ double Item_func_minus::val()
longlong Item_func_minus::val_int()
{
- longlong value=args[0]->val_int() - args[1]->val_int();
- if ((null_value=args[0]->null_value || args[1]->null_value))
- return 0;
- return value;
+ if (hybrid_type == INT_RESULT)
+ {
+ longlong value=args[0]->val_int() - args[1]->val_int();
+ if ((null_value=args[0]->null_value || args[1]->null_value))
+ return 0;
+ return value;
+ }
+ return (longlong) Item_func_minus::val();
}
+
double Item_func_mul::val()
{
double value=args[0]->val()*args[1]->val();
@@ -291,10 +300,14 @@ double Item_func_mul::val()
longlong Item_func_mul::val_int()
{
- longlong value=args[0]->val_int()*args[1]->val_int();
- if ((null_value=args[0]->null_value || args[1]->null_value))
- return 0; /* purecov: inspected */
- return value;
+ if (hybrid_type == INT_RESULT)
+ {
+ longlong value=args[0]->val_int()*args[1]->val_int();
+ if ((null_value=args[0]->null_value || args[1]->null_value))
+ return 0; /* purecov: inspected */
+ return value;
+ }
+ return (longlong) Item_func_mul::val();
}
@@ -309,14 +322,15 @@ double Item_func_div::val()
longlong Item_func_div::val_int()
{
- // the integer result of division of two arguments needs to be computed
- // as a type-cast division of val(), not as diviion of val_int() of each
- // argument. For example, val_int(41.5/3.4) = val_int(12.206) = 12, but
- // if you do val_int(41.5)/val_int(3.4), as in the old code, we get 42/3=
- // 14, which is wrong. This would break sec_to_time(a/b),
- // from_unixtime(a/b), and
- // all functions that do val_int() on their arguments
- return (longlong)val();
+ if (hybrid_type == INT_RESULT)
+ {
+ longlong value=args[0]->val_int();
+ longlong val2=args[1]->val_int();
+ if ((null_value= val2 == 0 || args[0]->null_value || args[1]->null_value))
+ return 0;
+ return value/val2;
+ }
+ return (longlong) Item_func_div::val();
}
void Item_func_div::fix_length_and_dec()