diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2014-03-27 14:57:53 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2014-03-27 14:57:53 +0400 |
commit | 42263a2b0a16211f260e721a3087a1b14b09bbd9 (patch) | |
tree | 6bbe6a9a48fdfaa16955dedd8871118930dd95a6 | |
parent | 43498927fa4e3f67b01ae45fdb27890dcfe992e3 (diff) | |
parent | aef0b4a897aa87820399e716de349293c81ed5f1 (diff) | |
download | mariadb-git-42263a2b0a16211f260e721a3087a1b14b09bbd9.tar.gz |
Merge
-rw-r--r-- | sql/field.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sql/field.cc b/sql/field.cc index 922c9aba6c5..68617d0204e 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1175,6 +1175,15 @@ inline ulonglong char_prefix_to_ulonglong(uchar *src) return uint8korr(src); } +/* + Compute res = a - b, without losing precision and taking care that these are + unsigned numbers. +*/ +static inline double safe_substract(ulonglong a, ulonglong b) +{ + return (a > b)? double(a - b) : -double(b - a); +} + /** @brief @@ -1227,10 +1236,10 @@ double Field::pos_in_interval_val_str(Field *min, Field *max, uint data_offset) minp= char_prefix_to_ulonglong(minp_prefix); maxp= char_prefix_to_ulonglong(maxp_prefix); double n, d; - n= mp - minp; + n= safe_substract(mp, minp); if (n < 0) return 0.0; - d= maxp - minp; + d= safe_substract(maxp, minp); if (d <= 0) return 1.0; return MY_MIN(n/d, 1.0); |