summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2013-03-11 07:44:24 -0700
committerIgor Babaev <igor@askmonty.org>2013-03-11 07:44:24 -0700
commitfc1c8ffdadfd14eb51969ecfde43e3204f10f6f8 (patch)
tree70ee4b3628cc62a706476d6c7b873fcfc9aa0e10 /sql/field.cc
parent938d47dcdc50ae4f127197ed72fd044b33ea7524 (diff)
downloadmariadb-git-fc1c8ffdadfd14eb51969ecfde43e3204f10f6f8.tar.gz
The pilot patch for mwl#253.
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/sql/field.cc b/sql/field.cc
index d4468ba3c5b..e54a3e59795 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -1273,6 +1273,20 @@ out_of_range:
return 1;
}
+
+double Field_num::middle_point_pos(Field *min, Field *max)
+{
+ double n, d;
+ n= val_real() - min->val_real();
+ if (n < 0)
+ return 0.0;
+ d= max->val_real() - min->val_real();
+ if (d <= 0)
+ return 1.0;
+ return min(n/d, 1.0);
+}
+
+
/**
Process decimal library return codes and issue warnings for overflow and
truncation.
@@ -1344,6 +1358,8 @@ Field::Field(uchar *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
comment.length=0;
field_index= 0;
is_stat_field= FALSE;
+ cond_selectivity= 1.0;
+ next_equal_field= NULL;
}
@@ -6167,6 +6183,46 @@ int Field_str::store(double nr)
return store(buff, length, &my_charset_numeric);
}
+static
+inline ulonglong char_prefix_to_ulonglong(uchar *src)
+{
+ uint sz= sizeof(ulonglong);
+ for (uint i= 0; i < sz/2; i++)
+ {
+ uchar tmp= src[i];
+ src[i]= src[sz-1-i];
+ src[sz-1-i]= tmp;
+ }
+ return uint8korr(src);
+}
+
+double Field_str::middle_point_pos(Field *min, Field *max)
+{
+ uchar mp_prefix[sizeof(ulonglong)];
+ uchar minp_prefix[sizeof(ulonglong)];
+ uchar maxp_prefix[sizeof(ulonglong)];
+ ulonglong mp, minp, maxp;
+ my_strnxfrm(charset(), mp_prefix, sizeof(mp),
+ ptr + length_size(), sizeof(mp) * charset()->mbmaxlen);
+ my_strnxfrm(charset(), minp_prefix, sizeof(minp),
+ min->ptr + length_size(),
+ sizeof(minp) * charset()->mbmaxlen);
+ my_strnxfrm(charset(), maxp_prefix, sizeof(maxp),
+ max->ptr + length_size(),
+ sizeof(maxp) * charset()->mbmaxlen);
+ mp= char_prefix_to_ulonglong(mp_prefix);
+ minp= char_prefix_to_ulonglong(minp_prefix);
+ maxp= char_prefix_to_ulonglong(maxp_prefix);
+ double n, d;
+ n= mp - minp;
+ if (n < 0)
+ return 0.0;
+ d= maxp - minp;
+ if (d <= 0)
+ return 1.0;
+ return min(n/d, 1.0);
+}
+
uint Field::is_equal(Create_field *new_field)
{