From b09799529384f67b3daf53d2252838eb6b6c88a1 Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Thu, 4 Mar 2004 21:08:14 +0400 Subject: [PATCH 1/2] Fixed bug #2082 'mysqldump converts "inf" to NULL' and added commands vertical_results and horisontal_results to client/mysqltest.c --- client/mysqltest.c | 43 +++++-- mysql-test/r/insert.result | 250 +++++++++++++++++++++++++++++++++++++ mysql-test/t/insert.test | 85 +++++++++++++ sql/field.cc | 118 ++++++++++------- 4 files changed, 444 insertions(+), 52 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) + + if (isnan(nr) || 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) - { - j= -FLT_MAX; - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); - error= 1; - } - else if (nr > FLT_MAX) - { - j=FLT_MAX; + j= 0; set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); error= 1; } else - j= (float) nr; + { + 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; + } + #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)) + 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_TRUNCATED); - err= 1; - } - if (unsigned_flag && j < 0) - { - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); - j=0; - err= 1; - } -#ifdef WORDS_BIGENDIAN - if (table->db_low_byte_first) - { - float8store(ptr,j); + return Field_double::store(nr); } else -#endif - doublestore(ptr,j); - return err; + { + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED); + Field_double::store(nr); + return 1; + } } 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) { From a8bbcc52a94e24740d50b2283bc645a6e2cf5180 Mon Sep 17 00:00:00 2001 From: "vva@eagle.mysql.r18.ru" <> Date: Sat, 6 Mar 2004 03:00:21 +0400 Subject: [PATCH 2/2] - added commands --query_vertical and --query_horisontal to client/mysqltest.cc - get my_strtod to return inf - get Field_float::store(double) and Field_double::store(float) to set null for nan value (as extra serg's recomendations to fix for patch on Bug #2082 'mysqldump converts "inf" to null') --- client/mysqltest.c | 25 +++++++++++++++++++ mysql-test/r/insert.result | 10 ++++++-- mysql-test/r/mysqldump.result | 2 ++ mysql-test/t/insert.test | 47 ++++++++++------------------------- sql/field.cc | 18 ++++++++++++-- strings/strtod.c | 5 +--- 6 files changed, 65 insertions(+), 42 deletions(-) diff --git a/client/mysqltest.c b/client/mysqltest.c index 823b4d8df1b..178e4b11697 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -216,6 +216,7 @@ 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_QUERY_VERTICAL, Q_QUERY_HORISONTAL, Q_UNKNOWN, /* Unknown command. */ Q_COMMENT, /* Comments, ignored. */ @@ -291,6 +292,8 @@ const char *command_names[]= "delimiter", "vertical_results", "horisontal_results", + "query_vertical", + "query_horisontal", 0 }; @@ -2586,6 +2589,28 @@ int main(int argc, char **argv) if (q->query == q->query_buf) q->query= q->first_argument; /* fall through */ + case Q_QUERY_VERTICAL: + case Q_QUERY_HORISONTAL: + { + my_bool old_display_result_vertically= display_result_vertically; + if (!q->query[q->first_word_len]) + { + /* This happens when we use 'query_..' on it's own line */ + q_send_flag=1; + break; + } + /* fix up query pointer if this is * first iteration for this line */ + if (q->query == q->query_buf) + q->query += q->first_word_len + 1; + switch(q->type) + { + case Q_QUERY_VERTICAL: display_result_vertically= TRUE; break; + case Q_QUERY_HORISONTAL: display_result_vertically= FALSE; break; + } + error |= run_query(&cur_con->mysql, q, QUERY_REAP|QUERY_SEND); + display_result_vertically= old_display_result_vertically; + break; + } case Q_QUERY: case Q_REAP: { diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result index 9c066d67af1..6602704ccec 100644 --- a/mysql-test/r/insert.result +++ b/mysql-test/r/insert.result @@ -169,6 +169,7 @@ 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 1264 Data truncated, out of range 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 @@ -176,6 +177,7 @@ 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 @@ -197,6 +199,7 @@ 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 1264 Data truncated, out of range 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 @@ -225,15 +228,17 @@ 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_double ' at row 1 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 6 -original_value 1.7976931348623e+308 +original_value inf f_double 1.79769313486232e+308 f_float 3.40282e+38 f_double_7_2 99999.99 @@ -245,6 +250,7 @@ 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_double ' at row 1 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 @@ -254,7 +260,7 @@ 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 +original_value -inf f_double -1.79769313486232e+308 f_float -3.40282e+38 f_double_7_2 -99999.99 diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index fe1b83a1089..c8fbb504d25 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -46,6 +46,8 @@ UNLOCK TABLES; DROP TABLE t1; CREATE TABLE t1 (a double); INSERT INTO t1 VALUES (-9e999999); +Warnings: +Warning 1264 Data truncated, out of range for column 'a' at row 1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT, CHARACTER_SET_CLIENT=utf8 */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test index b2fafe10192..b3d996c1475 100644 --- a/mysql-test/t/insert.test +++ b/mysql-test/t/insert.test @@ -90,7 +90,8 @@ drop database mysqltest; # # Test of wrong values for float data (bug #2082) -# +# + use test; create table t1( `number ` int auto_increment primary key, @@ -107,68 +108,46 @@ create table t1( 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() 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; +--query_vertical select * from t1 where `number `=last_insert_id() drop table t1; diff --git a/sql/field.cc b/sql/field.cc index a2771dc67e3..32d7149ce63 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2291,7 +2291,14 @@ int Field_float::store(double nr) float j; int error= 0; - if (isnan(nr) || unsigned_flag && nr < 0) + if (isnan(nr)) + { + j= 0; + set_null(); + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); + error= 1; + } + else if (unsigned_flag && nr < 0) { j= 0; set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); @@ -2581,7 +2588,14 @@ int Field_double::store(double nr) { int error= 0; - if (isnan(nr) || unsigned_flag && nr < 0) + if (isnan(nr)) + { + nr= 0; + set_null(); + set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); + error= 1; + } + else if (unsigned_flag && nr < 0) { nr= 0; set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE); diff --git a/strings/strtod.c b/strings/strtod.c index 027abe56269..a06b74248cb 100644 --- a/strings/strtod.c +++ b/strings/strtod.c @@ -93,7 +93,7 @@ double my_strtod(const char *str, char **end) if (neg) result= 0.0; else - result= DBL_MAX; + result= DBL_MAX*10; goto done; } while (exp >= 100) @@ -113,9 +113,6 @@ done: if (end) *end = (char *)str; - if (isinf(result)) - result=DBL_MAX; - return negative ? -result : result; }