summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <vva@eagle.mysql.r18.ru>2004-03-04 21:08:14 +0400
committerunknown <vva@eagle.mysql.r18.ru>2004-03-04 21:08:14 +0400
commit9988eecd45c1b6237ed352a7c95f37d19fa25aa1 (patch)
treef8d4d3bb4447a1e08ce9a2e62100aee706410a62
parentb0fbdfd0bffb13827cdd014064289efffbac4c1b (diff)
downloadmariadb-git-9988eecd45c1b6237ed352a7c95f37d19fa25aa1.tar.gz
Fixed bug #2082 'mysqldump converts "inf" to NULL' and
added commands vertical_results and horisontal_results to client/mysqltest.c client/mysqltest.c: added commands vertical_results and horisontal_results mysql-test/r/insert.result: added test for bug #2082 'mysqldump converts "inf" to NULL' mysql-test/t/insert.test: Fixed bug #2082 'mysqldump converts "inf" to NULL' sql/field.cc: added test for Fixed bug #2082 'mysqldump converts "inf" to NULL'
-rw-r--r--client/mysqltest.c43
-rw-r--r--mysql-test/r/insert.result250
-rw-r--r--mysql-test/t/insert.test85
-rw-r--r--sql/field.cc114
4 files changed, 442 insertions, 50 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 70dcc874b0f..823b4d8df1b 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -128,6 +128,8 @@ static CHARSET_INFO *charset_info= &my_charset_latin1;
static int embedded_server_arg_count=0;
static char *embedded_server_args[MAX_SERVER_ARGS];
+static my_bool display_result_vertically= FALSE;
+
static const char *embedded_server_groups[] = {
"server",
"embedded",
@@ -213,6 +215,7 @@ Q_REQUIRE_VERSION,
Q_ENABLE_WARNINGS, Q_DISABLE_WARNINGS,
Q_ENABLE_INFO, Q_DISABLE_INFO,
Q_EXEC, Q_DELIMITER,
+Q_DISPLAY_VERTICAL_RESULTS, Q_DISPLAY_HORISONTAL_RESULTS,
Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */
@@ -286,6 +289,8 @@ const char *command_names[]=
"disable_info",
"exec",
"delimiter",
+ "vertical_results",
+ "horisontal_results",
0
};
@@ -2110,6 +2115,7 @@ static void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res)
{
MYSQL_ROW row;
uint num_fields= mysql_num_fields(res);
+ MYSQL_FIELD *fields= !display_result_vertically ? 0 : mysql_fetch_fields(res);
unsigned long *lengths;
while ((row = mysql_fetch_row(res)))
{
@@ -2130,11 +2136,22 @@ static void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res)
val= "NULL";
len= 4;
}
- if (i)
+ if (!display_result_vertically)
+ {
+ if (i)
+ dynstr_append_mem(ds, "\t", 1);
+ replace_dynstr_append_mem(ds, val, len);
+ }
+ else
+ {
+ dynstr_append(ds, fields[i].name);
dynstr_append_mem(ds, "\t", 1);
- replace_dynstr_append_mem(ds, val, len);
+ replace_dynstr_append_mem(ds, val, len);
+ dynstr_append_mem(ds, "\n", 1);
+ }
}
- dynstr_append_mem(ds, "\n", 1);
+ if (!display_result_vertically)
+ dynstr_append_mem(ds, "\n", 1);
}
free_replace_column();
}
@@ -2276,16 +2293,19 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
{
if (res)
{
- int num_fields= mysql_num_fields(res);
- MYSQL_FIELD *fields= mysql_fetch_fields(res);
- for (i = 0; i < num_fields; i++)
+ if (!display_result_vertically)
{
- if (i)
- dynstr_append_mem(ds, "\t", 1);
- dynstr_append(ds, fields[i].name);
+ int num_fields= mysql_num_fields(res);
+ MYSQL_FIELD *fields= mysql_fetch_fields(res);
+ for (i = 0; i < num_fields; i++)
+ {
+ if (i)
+ dynstr_append_mem(ds, "\t", 1);
+ dynstr_append(ds, fields[i].name);
+ }
+ dynstr_append_mem(ds, "\n", 1);
}
- dynstr_append_mem(ds, "\n", 1);
append_result(ds, res);
}
@@ -2557,6 +2577,9 @@ int main(int argc, char **argv)
strmake(delimiter, q->first_argument, sizeof(delimiter) - 1);
delimiter_length= strlen(delimiter);
break;
+ case Q_DISPLAY_VERTICAL_RESULTS: display_result_vertically= TRUE; break;
+ case Q_DISPLAY_HORISONTAL_RESULTS:
+ display_result_vertically= FALSE; break;
case Q_LET: do_let(q); break;
case Q_EVAL_RESULT: eval_result = 1; break;
case Q_EVAL:
diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result
index 38e08d7fbc5..9c066d67af1 100644
--- a/mysql-test/r/insert.result
+++ b/mysql-test/r/insert.result
@@ -86,3 +86,253 @@ use mysqltest;
create table t1 (c int);
insert into mysqltest.t1 set mysqltest.t1.c = '1';
drop database mysqltest;
+use test;
+create table t1(
+`number ` int auto_increment primary key,
+`original_value ` varchar(50),
+`f_double ` double,
+`f_float ` float,
+`f_double_7_2 ` double(7,2),
+`f_float_4_3 ` float (4,3),
+`f_double_u ` double unsigned,
+`f_float_u ` float unsigned,
+`f_double_15_1_u ` double(15,1) unsigned,
+`f_float_3_1_u ` float (3,1) unsigned
+);
+set @value= "aa";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1265 Data truncated for column 'f_double ' at row 1
+Warning 1265 Data truncated for column 'f_float ' at row 1
+Warning 1265 Data truncated for column 'f_double_7_2 ' at row 1
+Warning 1265 Data truncated for column 'f_float_4_3 ' at row 1
+Warning 1265 Data truncated for column 'f_double_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_u ' at row 1
+Warning 1265 Data truncated for column 'f_double_15_1_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 1
+original_value aa
+f_double 0
+f_float 0
+f_double_7_2 0.00
+f_float_4_3 0.000
+f_double_u 0
+f_float_u 0
+f_double_15_1_u 0.0
+f_float_3_1_u 0.0
+set @value= "1aa";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1265 Data truncated for column 'f_double ' at row 1
+Warning 1265 Data truncated for column 'f_float ' at row 1
+Warning 1265 Data truncated for column 'f_double_7_2 ' at row 1
+Warning 1265 Data truncated for column 'f_float_4_3 ' at row 1
+Warning 1265 Data truncated for column 'f_double_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_u ' at row 1
+Warning 1265 Data truncated for column 'f_double_15_1_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 2
+original_value 1aa
+f_double 1
+f_float 1
+f_double_7_2 1.00
+f_float_4_3 1.000
+f_double_u 1
+f_float_u 1
+f_double_15_1_u 1.0
+f_float_3_1_u 1.0
+set @value= "aa1";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1265 Data truncated for column 'f_double ' at row 1
+Warning 1265 Data truncated for column 'f_float ' at row 1
+Warning 1265 Data truncated for column 'f_double_7_2 ' at row 1
+Warning 1265 Data truncated for column 'f_float_4_3 ' at row 1
+Warning 1265 Data truncated for column 'f_double_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_u ' at row 1
+Warning 1265 Data truncated for column 'f_double_15_1_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 3
+original_value aa1
+f_double 0
+f_float 0
+f_double_7_2 0.00
+f_float_4_3 0.000
+f_double_u 0
+f_float_u 0
+f_double_15_1_u 0.0
+f_float_3_1_u 0.0
+set @value= "1e+1111111111a";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1265 Data truncated for column 'f_double ' at row 1
+Warning 1265 Data truncated for column 'f_float ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float ' at row 1
+Warning 1265 Data truncated for column 'f_double_7_2 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_7_2 ' at row 1
+Warning 1265 Data truncated for column 'f_float_4_3 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_4_3 ' at row 1
+Warning 1265 Data truncated for column 'f_double_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1265 Data truncated for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_3_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 4
+original_value 1e+1111111111a
+f_double 1.79769313486232e+308
+f_float 3.40282e+38
+f_double_7_2 99999.99
+f_float_4_3 9.999
+f_double_u 1.79769313486232e+308
+f_float_u 3.40282e+38
+f_double_15_1_u 99999999999999.9
+f_float_3_1_u 99.9
+set @value= "-1e+1111111111a";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1265 Data truncated for column 'f_double ' at row 1
+Warning 1265 Data truncated for column 'f_float ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float ' at row 1
+Warning 1265 Data truncated for column 'f_double_7_2 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_7_2 ' at row 1
+Warning 1265 Data truncated for column 'f_float_4_3 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_4_3 ' at row 1
+Warning 1265 Data truncated for column 'f_double_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1265 Data truncated for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1265 Data truncated for column 'f_float_3_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 5
+original_value -1e+1111111111a
+f_double -1.79769313486232e+308
+f_float -3.40282e+38
+f_double_7_2 -99999.99
+f_float_4_3 -9.999
+f_double_u 0
+f_float_u 0
+f_double_15_1_u 0.0
+f_float_3_1_u 0.0
+set @value= 1e+1111111111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1264 Data truncated, out of range for column 'f_float ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_7_2 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_4_3 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 6
+original_value 1.7976931348623e+308
+f_double 1.79769313486232e+308
+f_float 3.40282e+38
+f_double_7_2 99999.99
+f_float_4_3 9.999
+f_double_u 1.79769313486232e+308
+f_float_u 3.40282e+38
+f_double_15_1_u 99999999999999.9
+f_float_3_1_u 99.9
+set @value= -1e+1111111111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1264 Data truncated, out of range for column 'f_float ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_7_2 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_4_3 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 7
+original_value -1.7976931348623e+308
+f_double -1.79769313486232e+308
+f_float -3.40282e+38
+f_double_7_2 -99999.99
+f_float_4_3 -9.999
+f_double_u 0
+f_float_u 0
+f_double_15_1_u 0.0
+f_float_3_1_u 0.0
+set @value= 1e+111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1264 Data truncated, out of range for column 'f_float ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_7_2 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_4_3 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 8
+original_value 1e+111
+f_double 1e+111
+f_float 3.40282e+38
+f_double_7_2 99999.99
+f_float_4_3 9.999
+f_double_u 1e+111
+f_float_u 3.40282e+38
+f_double_15_1_u 99999999999999.9
+f_float_3_1_u 99.9
+set @value= -1e+111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1264 Data truncated, out of range for column 'f_float ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_7_2 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_4_3 ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 9
+original_value -1e+111
+f_double -1e+111
+f_float -3.40282e+38
+f_double_7_2 -99999.99
+f_float_4_3 -9.999
+f_double_u 0
+f_float_u 0
+f_double_15_1_u 0.0
+f_float_3_1_u 0.0
+set @value= 1;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+select * from t1 where `number `=last_insert_id();
+number 10
+original_value 1
+f_double 1
+f_float 1
+f_double_7_2 1.00
+f_float_4_3 1.000
+f_double_u 1
+f_float_u 1
+f_double_15_1_u 1.0
+f_float_3_1_u 1.0
+set @value= -1;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+Warnings:
+Warning 1264 Data truncated, out of range for column 'f_double_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_double_15_1_u ' at row 1
+Warning 1264 Data truncated, out of range for column 'f_float_3_1_u ' at row 1
+select * from t1 where `number `=last_insert_id();
+number 11
+original_value -1
+f_double -1
+f_float -1
+f_double_7_2 -1.00
+f_float_4_3 -1.000
+f_double_u 0
+f_float_u 0
+f_double_15_1_u 0.0
+f_float_3_1_u 0.0
+drop table t1;
diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test
index 73b5f453bb4..b2fafe10192 100644
--- a/mysql-test/t/insert.test
+++ b/mysql-test/t/insert.test
@@ -87,3 +87,88 @@ use mysqltest;
create table t1 (c int);
insert into mysqltest.t1 set mysqltest.t1.c = '1';
drop database mysqltest;
+
+#
+# Test of wrong values for float data (bug #2082)
+#
+use test;
+create table t1(
+ `number ` int auto_increment primary key,
+ `original_value ` varchar(50),
+ `f_double ` double,
+ `f_float ` float,
+ `f_double_7_2 ` double(7,2),
+ `f_float_4_3 ` float (4,3),
+ `f_double_u ` double unsigned,
+ `f_float_u ` float unsigned,
+ `f_double_15_1_u ` double(15,1) unsigned,
+ `f_float_3_1_u ` float (3,1) unsigned
+);
+
+set @value= "aa";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= "1aa";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= "aa1";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= "1e+1111111111a";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= "-1e+1111111111a";
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= 1e+1111111111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= -1e+1111111111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= 1e+111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= -1e+111;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= 1;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+set @value= -1;
+insert into t1 values(null,@value,@value,@value,@value,@value,@value,@value,@value,@value);
+vertical_results;
+select * from t1 where `number `=last_insert_id();
+horisontal_results;
+
+drop table t1;
diff --git a/sql/field.cc b/sql/field.cc
index 4632fbc5c69..a2771dc67e3 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -2271,13 +2271,18 @@ void Field_longlong::sql_type(String &res) const
int Field_float::store(const char *from,uint len,CHARSET_INFO *cs)
{
int err;
- Field_float::store(my_strntod(cs,(char*) from,len,(char**)NULL,&err));
- if (err || current_thd->count_cuted_fields && !test_if_real(from,len,cs))
+ char *end;
+ double nr= my_strntod(cs,(char*) from,len,&end,&err);
+ if (!err && (!current_thd->count_cuted_fields || end-from==len))
+ {
+ return Field_float::store(nr);
+ }
+ else
{
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED);
+ Field_float::store(nr);
return 1;
}
- return (err) ? 1 : 0;
}
@@ -2285,28 +2290,41 @@ int Field_float::store(double nr)
{
float j;
int error= 0;
- if (dec < NOT_FIXED_DEC)
- nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point
- if (unsigned_flag && nr < 0)
- {
- set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
- nr=0;
- error= 1;
- }
- if (nr < -FLT_MAX)
+
+ if (isnan(nr) || unsigned_flag && nr < 0)
{
- j= -FLT_MAX;
+ j= 0;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
error= 1;
}
- else if (nr > FLT_MAX)
+ else
{
- j=FLT_MAX;
- set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
- error= 1;
+ double max_value;
+ if (dec >= NOT_FIXED_DEC)
+ {
+ max_value= FLT_MAX;
+ }
+ else
+ {
+ max_value= (log_10[field_length]-1)/log_10[dec];
+ nr= floor(nr*log_10[dec]+0.5)/log_10[dec];
+ }
+ if (nr < -max_value)
+ {
+ j= (float)-max_value;
+ set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
+ error= 1;
+ }
+ else if (nr > max_value)
+ {
+ j= (float)max_value;
+ set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
+ error= 1;
+ }
+ else
+ j= (float) nr;
}
- else
- j= (float) nr;
+
#ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first)
{
@@ -2544,41 +2562,57 @@ void Field_float::sql_type(String &res) const
int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
{
int err;
- double j= my_strntod(cs,(char*) from,len,(char**)0,&err);
- if (err || current_thd->count_cuted_fields && !test_if_real(from,len,cs))
- {
- set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED);
- err= 1;
- }
- if (unsigned_flag && j < 0)
+ char *end;
+ double nr= my_strntod(cs,(char*) from,len,&end,&err);
+ if (!err && (!current_thd->count_cuted_fields || end-from==len))
{
- set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
- j=0;
- err= 1;
+ return Field_double::store(nr);
}
-#ifdef WORDS_BIGENDIAN
- if (table->db_low_byte_first)
+ else
{
- float8store(ptr,j);
+ set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED);
+ Field_double::store(nr);
+ return 1;
}
- else
-#endif
- doublestore(ptr,j);
- return err;
}
int Field_double::store(double nr)
{
int error= 0;
- if (dec < NOT_FIXED_DEC)
- nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point
- if (unsigned_flag && nr < 0)
+
+ if (isnan(nr) || unsigned_flag && nr < 0)
{
+ nr= 0;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
- nr=0;
error= 1;
}
+ else
+ {
+ double max_value;
+ if (dec >= NOT_FIXED_DEC)
+ {
+ max_value= DBL_MAX;
+ }
+ else
+ {
+ max_value= (log_10[field_length]-1)/log_10[dec];
+ nr= floor(nr*log_10[dec]+0.5)/log_10[dec];
+ }
+ if (nr < -max_value)
+ {
+ nr= -max_value;
+ set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
+ error= 1;
+ }
+ else if (nr > max_value)
+ {
+ nr= max_value;
+ set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE);
+ error= 1;
+ }
+ }
+
#ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first)
{