Commit 03d411b1 authored by unknown's avatar unknown
Browse files

Bug#6147: Traditional: Assigning a string to a numeric column has unexpected results

The problem was that when converting a string to an exact number,
rounding didn't work, because conversion didn't understand
approximate numbers notation.
Fix: a new function for string-to-number conversion was implemented,
which is aware of approxinate number notation (with decimal point
and exponent, e.g. -19.55e-1)


include/m_ctype.h:
  Adding new function into MY_CHARSET_HANDLER
  Adding prototypes for 8bit and ucs2 functions.
mysql-test/r/loaddata.result:
  Fixing results
mysql-test/r/ps_2myisam.result:
  Fixing results
mysql-test/r/ps_3innodb.result:
  Fixing results
mysql-test/r/ps_4heap.result:
  Fixing results
mysql-test/r/ps_5merge.result:
  Fixing results
mysql-test/r/ps_6bdb.result:
  Fixing results
mysql-test/r/rpl_rewrite_db.result:
  Fixing results
mysql-test/r/select.result:
  Fixing results
mysql-test/r/sp-vars.result:
  Fixing results
mysql-test/r/strict.result:
  Fixing results
mysql-test/r/view.result:
  Fixing results
mysql-test/r/warnings.result:
  Fixing results
mysql-test/t/strict.test:
  Fixing results
sql/field.cc:
  Using new function
strings/ctype-big5.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-bin.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-cp932.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-euc_kr.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-eucjpms.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-gb2312.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-gbk.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-latin1.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-simple.c:
  Implementing my_strntoull10_8bit
  Adding new function into MY_CHARSET_HANDLER
strings/ctype-sjis.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-tis620.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-ucs2.c:
  Implementing UCS2 wrapper for 8bit version
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-ujis.c:
  Adding new function into the MY_CHARSET_HANDLER structure
strings/ctype-utf8.c:
  Adding new function into the MY_CHARSET_HANDLER structure
mysql-test/r/round.result:
  New BitKeeper file ``mysql-test/r/round.result''
mysql-test/t/round.test:
  New BitKeeper file ``mysql-test/t/round.test''
parent c1306fc0
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -205,6 +205,9 @@ typedef struct my_charset_handler_st
			 int *err);
  longlong    (*strtoll10)(struct charset_info_st *cs,
                           const char *nptr, char **endptr, int *error);
  ulonglong   (*strntoull10rnd)(struct charset_info_st *cs,
                                const char *str, uint length, int unsigned_fl,
                                char **endptr, int *error);
  ulong        (*scan)(struct charset_info_st *, const char *b, const char *e,
		       int sq);
} MY_CHARSET_HANDLER;
@@ -341,6 +344,13 @@ longlong my_strtoll10_8bit(CHARSET_INFO *cs,
longlong my_strtoll10_ucs2(CHARSET_INFO *cs, 
                           const char *nptr, char **endptr, int *error);

ulonglong my_strntoull10rnd_8bit(CHARSET_INFO *cs,
                                 const char *str, uint length, int unsigned_fl,
                                 char **endptr, int *error);
ulonglong my_strntoull10rnd_ucs2(CHARSET_INFO *cs, 
                                 const char *str, uint length, int unsigned_fl,
                                 char **endptr, int *error);

void my_fill_8bit(CHARSET_INFO *cs, char* to, uint l, int fill);

my_bool  my_like_range_simple(CHARSET_INFO *cs,
+4 −3
Original line number Diff line number Diff line
@@ -43,9 +43,9 @@ drop table t1;
create table t1 (a int, b char(10));
load data infile '../std_data_ln/loaddata3.dat' into table t1 fields terminated by '' enclosed by '' ignore 1 lines;
Warnings:
Warning	1264	Out of range value adjusted for column 'a' at row 3
Warning	1366	Incorrect integer value: 'error      ' for column 'a' at row 3
Warning	1262	Row 3 was truncated; it contained more data than there were input columns
Warning	1264	Out of range value adjusted for column 'a' at row 5
Warning	1366	Incorrect integer value: 'wrong end  ' for column 'a' at row 5
Warning	1262	Row 5 was truncated; it contained more data than there were input columns
select * from t1;
a	b
@@ -57,7 +57,8 @@ a b
truncate table t1;
load data infile '../std_data_ln/loaddata4.dat' into table t1 fields terminated by '' enclosed by '' lines terminated by '' ignore 1 lines;
Warnings:
Warning	1264	Out of range value adjusted for column 'a' at row 4
Warning	1366	Incorrect integer value: '
' for column 'a' at row 4
Warning	1261	Row 4 doesn't contain data for all columns
select * from t1;
a	b
+24 −24
Original line number Diff line number Diff line
@@ -2689,21 +2689,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning	1265	Data truncated for column 'c1' at row 1
Warning	1265	Data truncated for column 'c2' at row 1
Warning	1265	Data truncated for column 'c3' at row 1
Warning	1265	Data truncated for column 'c4' at row 1
Warning	1265	Data truncated for column 'c5' at row 1
Warning	1265	Data truncated for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c1' at row 1
Warning	1264	Out of range value adjusted for column 'c2' at row 1
Warning	1264	Out of range value adjusted for column 'c3' at row 1
Warning	1264	Out of range value adjusted for column 'c4' at row 1
Warning	1264	Out of range value adjusted for column 'c5' at row 1
Warning	1264	Out of range value adjusted for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c7' at row 1
Warning	1264	Out of range value adjusted for column 'c12' at row 1
execute my_select ;
c1	1
c2	1
c3	1
c4	1
c5	1
c6	1
c1	127
c2	32767
c3	8388607
c4	2147483647
c5	2147483647
c6	9223372036854775807
c7	3.40282e+38
c8	1.11111111111111e+50
c9	1.11111111111111e+50
@@ -2739,21 +2739,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning	1265	Data truncated for column 'c1' at row 1
Warning	1265	Data truncated for column 'c2' at row 1
Warning	1265	Data truncated for column 'c3' at row 1
Warning	1265	Data truncated for column 'c4' at row 1
Warning	1265	Data truncated for column 'c5' at row 1
Warning	1265	Data truncated for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c1' at row 1
Warning	1264	Out of range value adjusted for column 'c2' at row 1
Warning	1264	Out of range value adjusted for column 'c3' at row 1
Warning	1264	Out of range value adjusted for column 'c4' at row 1
Warning	1264	Out of range value adjusted for column 'c5' at row 1
Warning	1264	Out of range value adjusted for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c7' at row 1
Warning	1264	Out of range value adjusted for column 'c12' at row 1
execute my_select ;
c1	-1
c2	-1
c3	-1
c4	-1
c5	-1
c6	-1
c1	-128
c2	-32768
c3	-8388608
c4	-2147483648
c5	-2147483648
c6	-9223372036854775808
c7	-3.40282e+38
c8	-1.11111111111111e+50
c9	-1.11111111111111e+50
+24 −24
Original line number Diff line number Diff line
@@ -2672,21 +2672,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning	1265	Data truncated for column 'c1' at row 1
Warning	1265	Data truncated for column 'c2' at row 1
Warning	1265	Data truncated for column 'c3' at row 1
Warning	1265	Data truncated for column 'c4' at row 1
Warning	1265	Data truncated for column 'c5' at row 1
Warning	1265	Data truncated for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c1' at row 1
Warning	1264	Out of range value adjusted for column 'c2' at row 1
Warning	1264	Out of range value adjusted for column 'c3' at row 1
Warning	1264	Out of range value adjusted for column 'c4' at row 1
Warning	1264	Out of range value adjusted for column 'c5' at row 1
Warning	1264	Out of range value adjusted for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c7' at row 1
Warning	1264	Out of range value adjusted for column 'c12' at row 1
execute my_select ;
c1	1
c2	1
c3	1
c4	1
c5	1
c6	1
c1	127
c2	32767
c3	8388607
c4	2147483647
c5	2147483647
c6	9223372036854775807
c7	3.40282e+38
c8	1.11111111111111e+50
c9	1.11111111111111e+50
@@ -2722,21 +2722,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning	1265	Data truncated for column 'c1' at row 1
Warning	1265	Data truncated for column 'c2' at row 1
Warning	1265	Data truncated for column 'c3' at row 1
Warning	1265	Data truncated for column 'c4' at row 1
Warning	1265	Data truncated for column 'c5' at row 1
Warning	1265	Data truncated for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c1' at row 1
Warning	1264	Out of range value adjusted for column 'c2' at row 1
Warning	1264	Out of range value adjusted for column 'c3' at row 1
Warning	1264	Out of range value adjusted for column 'c4' at row 1
Warning	1264	Out of range value adjusted for column 'c5' at row 1
Warning	1264	Out of range value adjusted for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c7' at row 1
Warning	1264	Out of range value adjusted for column 'c12' at row 1
execute my_select ;
c1	-1
c2	-1
c3	-1
c4	-1
c5	-1
c6	-1
c1	-128
c2	-32768
c3	-8388608
c4	-2147483648
c5	-2147483648
c6	-9223372036854775808
c7	-3.40282e+38
c8	-1.11111111111111e+50
c9	-1.11111111111111e+50
+24 −24
Original line number Diff line number Diff line
@@ -2673,21 +2673,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning	1265	Data truncated for column 'c1' at row 1
Warning	1265	Data truncated for column 'c2' at row 1
Warning	1265	Data truncated for column 'c3' at row 1
Warning	1265	Data truncated for column 'c4' at row 1
Warning	1265	Data truncated for column 'c5' at row 1
Warning	1265	Data truncated for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c1' at row 1
Warning	1264	Out of range value adjusted for column 'c2' at row 1
Warning	1264	Out of range value adjusted for column 'c3' at row 1
Warning	1264	Out of range value adjusted for column 'c4' at row 1
Warning	1264	Out of range value adjusted for column 'c5' at row 1
Warning	1264	Out of range value adjusted for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c7' at row 1
Warning	1264	Out of range value adjusted for column 'c12' at row 1
execute my_select ;
c1	1
c2	1
c3	1
c4	1
c5	1
c6	1
c1	127
c2	32767
c3	8388607
c4	2147483647
c5	2147483647
c6	9223372036854775807
c7	3.40282e+38
c8	1.11111111111111e+50
c9	1.11111111111111e+50
@@ -2723,21 +2723,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning	1265	Data truncated for column 'c1' at row 1
Warning	1265	Data truncated for column 'c2' at row 1
Warning	1265	Data truncated for column 'c3' at row 1
Warning	1265	Data truncated for column 'c4' at row 1
Warning	1265	Data truncated for column 'c5' at row 1
Warning	1265	Data truncated for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c1' at row 1
Warning	1264	Out of range value adjusted for column 'c2' at row 1
Warning	1264	Out of range value adjusted for column 'c3' at row 1
Warning	1264	Out of range value adjusted for column 'c4' at row 1
Warning	1264	Out of range value adjusted for column 'c5' at row 1
Warning	1264	Out of range value adjusted for column 'c6' at row 1
Warning	1264	Out of range value adjusted for column 'c7' at row 1
Warning	1264	Out of range value adjusted for column 'c12' at row 1
execute my_select ;
c1	-1
c2	-1
c3	-1
c4	-1
c5	-1
c6	-1
c1	-128
c2	-32768
c3	-8388608
c4	-2147483648
c5	-2147483648
c6	-9223372036854775808
c7	-3.40282e+38
c8	-1.11111111111111e+50
c9	-1.11111111111111e+50
Loading