Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/home/my/mysql-4.1
This commit is contained in:
monty@mysql.com 2005-06-03 13:35:58 +03:00
commit fd17d75923
4 changed files with 19 additions and 7 deletions

View File

@ -19,6 +19,7 @@
EXTRA_DIST = FINISH.sh \ EXTRA_DIST = FINISH.sh \
SETUP.sh \ SETUP.sh \
check-cpu \
compile-alpha \ compile-alpha \
compile-alpha-ccc \ compile-alpha-ccc \
compile-alpha-cxx \ compile-alpha-cxx \

View File

@ -888,3 +888,6 @@ NULL
select ifnull(NULL, _utf8'string'); select ifnull(NULL, _utf8'string');
ifnull(NULL, _utf8'string') ifnull(NULL, _utf8'string')
string string
create table t1 (a varchar(255)) default character set utf8;
insert into t1 values (1.0);
drop table t1;

View File

@ -724,3 +724,10 @@ select ifnull(a,'') from t1;
drop table t1; drop table t1;
select repeat(_utf8'+',3) as h union select NULL; select repeat(_utf8'+',3) as h union select NULL;
select ifnull(NULL, _utf8'string'); select ifnull(NULL, _utf8'string');
#
# Bug#10714: Inserting double value into utf8 column crashes server
#
create table t1 (a varchar(255)) default character set utf8;
insert into t1 values (1.0);
drop table t1;

View File

@ -4981,31 +4981,32 @@ int Field_str::store(double nr)
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
uint length; uint length;
bool use_scientific_notation= TRUE; bool use_scientific_notation= TRUE;
uint char_length= field_length / charset()->mbmaxlen;
/* /*
Check fabs(nr) against longest value that can be stored in field, Check fabs(nr) against longest value that can be stored in field,
which depends on whether the value is < 1 or not, and negative or not which depends on whether the value is < 1 or not, and negative or not
*/ */
double anr= fabs(nr); double anr= fabs(nr);
int neg= (nr < 0.0) ? 1 : 0; int neg= (nr < 0.0) ? 1 : 0;
if (field_length > 4 && field_length < 32 && if (char_length > 4 && char_length < 32 &&
(anr < 1.0 ? anr > 1/(log_10[max(0,field_length-neg-2)]) /* -2 for "0." */ (anr < 1.0 ? anr > 1/(log_10[max(0,char_length-neg-2)]) /* -2 for "0." */
: anr < log_10[field_length-neg]-1)) : anr < log_10[char_length-neg]-1))
use_scientific_notation= FALSE; use_scientific_notation= FALSE;
length= (uint) my_sprintf(buff, (buff, "%-.*g", length= (uint) my_sprintf(buff, (buff, "%-.*g",
(use_scientific_notation ? (use_scientific_notation ?
max(0, (int)field_length-neg-5) : max(0, (int)char_length-neg-5) :
field_length), char_length),
nr)); nr));
/* /*
+1 below is because "precision" in %g above means the +1 below is because "precision" in %g above means the
max. number of significant digits, not the output width. max. number of significant digits, not the output width.
Thus the width can be larger than number of significant digits by 1 Thus the width can be larger than number of significant digits by 1
(for decimal point) (for decimal point)
the test for field_length < 5 is for extreme cases, the test for char_length < 5 is for extreme cases,
like inserting 500.0 in char(1) like inserting 500.0 in char(1)
*/ */
DBUG_ASSERT(field_length < 5 || length <= field_length+1); DBUG_ASSERT(char_length < 5 || length <= char_length+1);
return store((const char *) buff, length, charset()); return store((const char *) buff, length, charset());
} }