summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2014-03-27 14:57:53 +0400
committerSergey Petrunya <psergey@askmonty.org>2014-03-27 14:57:53 +0400
commit42263a2b0a16211f260e721a3087a1b14b09bbd9 (patch)
tree6bbe6a9a48fdfaa16955dedd8871118930dd95a6
parent43498927fa4e3f67b01ae45fdb27890dcfe992e3 (diff)
parentaef0b4a897aa87820399e716de349293c81ed5f1 (diff)
downloadmariadb-git-42263a2b0a16211f260e721a3087a1b14b09bbd9.tar.gz
Merge
-rw-r--r--sql/field.cc13
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);