diff options
author | unknown <monty@hundin.mysql.fi> | 2001-08-18 14:24:01 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2001-08-18 14:24:01 +0300 |
commit | 0f4b1e511536c8e3e691758a523e1f9b4bf1a75e (patch) | |
tree | 185409a9024f800dcf89ef564b4baaccbaa1c5b2 /sql/item_func.cc | |
parent | 131cd2ab9a2c3585061860282e3aae28c38bd7c4 (diff) | |
download | mariadb-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.cc | 54 |
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() |