Loading mysql-test/r/func_str.result +11 −0 Original line number Diff line number Diff line Loading @@ -800,3 +800,14 @@ field(0,NULL,1,0) field("",NULL,"bar","") field(0.0,NULL,1.0,0.0) select field(NULL,1,2,NULL), field(NULL,1,2,0); field(NULL,1,2,NULL) field(NULL,1,2,0) 0 0 CREATE TABLE t1 (str varchar(20) PRIMARY KEY); CREATE TABLE t2 (num int primary key); INSERT INTO t1 VALUES ('notnumber'); INSERT INTO t2 VALUES (0), (1); SELECT * FROM t1, t2 WHERE num=str; str num notnumber 0 SELECT * FROM t1, t2 WHERE num=substring(str from 1 for 6); str num notnumber 0 DROP TABLE t1,t2; mysql-test/r/rpl_multi_update3.result +81 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,8 @@ reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; -------- Test for BUG#9361 -------- CREATE TABLE t1 ( a int unsigned not null auto_increment primary key, b int unsigned Loading Loading @@ -41,3 +43,82 @@ a b 1 6 2 6 drop table t1,t2; -------- Test 1 for BUG#9361 -------- DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( a1 char(30), a2 int, a3 int, a4 char(30), a5 char(30) ); CREATE TABLE t2 ( b1 int, b2 char(30) ); INSERT INTO t1 VALUES ('Yes', 1, NULL, 'foo', 'bar'); INSERT INTO t2 VALUES (1, 'baz'); UPDATE t1 a, t2 SET a.a1 = 'No' WHERE a.a2 = (SELECT b1 FROM t2 WHERE b2 = 'baz') AND a.a3 IS NULL AND a.a4 = 'foo' AND a.a5 = 'bar'; SELECT * FROM t1; a1 a2 a3 a4 a5 No 1 NULL foo bar SELECT * FROM t2; b1 b2 1 baz DROP TABLE t1, t2; -------- Test 2 for BUG#9361 -------- DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t3; CREATE TABLE t1 ( i INT, j INT, x INT, y INT, z INT ); CREATE TABLE t2 ( i INT, k INT, x INT, y INT, z INT ); CREATE TABLE t3 ( j INT, k INT, x INT, y INT, z INT ); INSERT INTO t1 VALUES ( 1, 2,13,14,15); INSERT INTO t2 VALUES ( 1, 3,23,24,25); INSERT INTO t3 VALUES ( 2, 3, 1,34,35), ( 2, 3, 1,34,36); UPDATE t1 AS a INNER JOIN t2 AS b ON a.i = b.i INNER JOIN t3 AS c ON a.j = c.j AND b.k = c.k SET a.x = b.x, a.y = b.y, a.z = ( SELECT sum(z) FROM t3 WHERE y = 34 ) WHERE b.x = 23; SELECT * FROM t1; i j x y z 1 2 23 24 71 DROP TABLE t1, t2, t3; mysql-test/t/func_str.test +14 −0 Original line number Diff line number Diff line Loading @@ -529,3 +529,17 @@ DROP TABLE t1, t2; # select field(0,NULL,1,0), field("",NULL,"bar",""), field(0.0,NULL,1.0,0.0); select field(NULL,1,2,NULL), field(NULL,1,2,0); # # Bug #10124: access by integer index with a string key that is not a number # CREATE TABLE t1 (str varchar(20) PRIMARY KEY); CREATE TABLE t2 (num int primary key); INSERT INTO t1 VALUES ('notnumber'); INSERT INTO t2 VALUES (0), (1); SELECT * FROM t1, t2 WHERE num=str; SELECT * FROM t1, t2 WHERE num=substring(str from 1 for 6); DROP TABLE t1,t2; mysql-test/t/rpl_multi_update3.test +129 −4 Original line number Diff line number Diff line source include/master-slave.inc; ############################################################################## # # Let's verify that multi-update with a subselect does not cause the slave to crash # (BUG#10442) source include/master-slave.inc; # --disable_query_log SELECT '-------- Test for BUG#9361 --------' as ""; --enable_query_log CREATE TABLE t1 ( a int unsigned not null auto_increment primary key, Loading @@ -25,10 +31,129 @@ UPDATE t2, (SELECT a FROM t1) AS t SET t2.b = t.a+5 ; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; save_master_pos; sync_slave_with_master; connection slave; sync_with_master; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; connection master; drop table t1,t2; ############################################################################## # # Test for BUG#9361: # Subselects should work inside multi-updates # --disable_query_log SELECT '-------- Test 1 for BUG#9361 --------' as ""; --enable_query_log connection master; --disable_warnings DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; --enable_warnings CREATE TABLE t1 ( a1 char(30), a2 int, a3 int, a4 char(30), a5 char(30) ); CREATE TABLE t2 ( b1 int, b2 char(30) ); # Insert one row per table INSERT INTO t1 VALUES ('Yes', 1, NULL, 'foo', 'bar'); INSERT INTO t2 VALUES (1, 'baz'); # This should update the row in t1 UPDATE t1 a, t2 SET a.a1 = 'No' WHERE a.a2 = (SELECT b1 FROM t2 WHERE b2 = 'baz') AND a.a3 IS NULL AND a.a4 = 'foo' AND a.a5 = 'bar'; sync_slave_with_master; connection slave; SELECT * FROM t1; SELECT * FROM t2; connection master; DROP TABLE t1, t2; ############################################################################## # # Second test for BUG#9361 # --disable_query_log SELECT '-------- Test 2 for BUG#9361 --------' as ""; --enable_query_log connection master; --disable_warnings DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t3; --enable_warnings CREATE TABLE t1 ( i INT, j INT, x INT, y INT, z INT ); CREATE TABLE t2 ( i INT, k INT, x INT, y INT, z INT ); CREATE TABLE t3 ( j INT, k INT, x INT, y INT, z INT ); INSERT INTO t1 VALUES ( 1, 2,13,14,15); INSERT INTO t2 VALUES ( 1, 3,23,24,25); INSERT INTO t3 VALUES ( 2, 3, 1,34,35), ( 2, 3, 1,34,36); UPDATE t1 AS a INNER JOIN t2 AS b ON a.i = b.i INNER JOIN t3 AS c ON a.j = c.j AND b.k = c.k SET a.x = b.x, a.y = b.y, a.z = ( SELECT sum(z) FROM t3 WHERE y = 34 ) WHERE b.x = 23; sync_slave_with_master; connection slave; SELECT * FROM t1; connection master; DROP TABLE t1, t2, t3; sql/field.cc +16 −12 Original line number Diff line number Diff line Loading @@ -3322,7 +3322,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) } else if (from+len != end && table->in_use->count_cuted_fields && check_int(from,len,end,cs)) error= 1; error= 2; store_tmp= (long) tmp; #ifdef WORDS_BIGENDIAN Loading Loading @@ -3584,7 +3584,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) } else if (from+len != end && table->in_use->count_cuted_fields && check_int(from,len,end,cs)) error= 1; error= 2; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) { Loading Loading @@ -3806,7 +3806,7 @@ int Field_float::store(const char *from,uint len,CHARSET_INFO *cs) { set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, (error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1); error= 1; error= error ? 1 : 2; } Field_float::store(nr); return error; Loading Loading @@ -4093,7 +4093,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs) { set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, (error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1); error= 1; error= error ? 1 : 2; } Field_double::store(nr); return error; Loading Loading @@ -4495,6 +4495,8 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) error= 1; } } if (error > 1) error= 2; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) Loading Loading @@ -4791,7 +4793,7 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs) if (str_to_time(from, len, <ime, &error)) { tmp=0L; error= 1; error= 2; set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, from, len, MYSQL_TIMESTAMP_TIME, 1); } Loading @@ -4813,6 +4815,8 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs) from, len, MYSQL_TIMESTAMP_TIME, !error); error= 1; } if (error > 1) error= 2; } if (ltime.neg) Loading Loading @@ -5149,7 +5153,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs) &error) <= MYSQL_TIMESTAMP_ERROR) { tmp=0; error= 1; error= 2; } else tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day); Loading Loading @@ -5353,7 +5357,7 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) &error) <= MYSQL_TIMESTAMP_ERROR) { tmp=0L; error= 1; error= 2; } else tmp= l_time.day + l_time.month*32 + l_time.year*16*32; Loading Loading @@ -5836,7 +5840,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) from= tmpstr.ptr(); length= tmpstr.length(); if (conv_errors) error= 1; error= 2; } /* Loading @@ -5860,7 +5864,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES); if (from != end) error= 1; error= 2; } if (error) { Loading Loading @@ -6242,7 +6246,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) table->in_use->abort_on_warning) error_code= ER_DATA_TOO_LONG; set_warning(level, error_code, 1); return 1; return 2; } return 0; } Loading Loading @@ -6822,7 +6826,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) from= tmpstr.ptr(); length= tmpstr.length(); if (conv_errors) error= 1; error= 2; } copy_length= max_data_length(); Loading @@ -6837,7 +6841,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) copy_length, &well_formed_error); if (copy_length < length) error= 1; error= 2; Field_blob::store_length(copy_length); if (was_conversion || table->copy_blobs || copy_length <= MAX_FIELD_WIDTH) { // Must make a copy Loading Loading
mysql-test/r/func_str.result +11 −0 Original line number Diff line number Diff line Loading @@ -800,3 +800,14 @@ field(0,NULL,1,0) field("",NULL,"bar","") field(0.0,NULL,1.0,0.0) select field(NULL,1,2,NULL), field(NULL,1,2,0); field(NULL,1,2,NULL) field(NULL,1,2,0) 0 0 CREATE TABLE t1 (str varchar(20) PRIMARY KEY); CREATE TABLE t2 (num int primary key); INSERT INTO t1 VALUES ('notnumber'); INSERT INTO t2 VALUES (0), (1); SELECT * FROM t1, t2 WHERE num=str; str num notnumber 0 SELECT * FROM t1, t2 WHERE num=substring(str from 1 for 6); str num notnumber 0 DROP TABLE t1,t2;
mysql-test/r/rpl_multi_update3.result +81 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,8 @@ reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; -------- Test for BUG#9361 -------- CREATE TABLE t1 ( a int unsigned not null auto_increment primary key, b int unsigned Loading Loading @@ -41,3 +43,82 @@ a b 1 6 2 6 drop table t1,t2; -------- Test 1 for BUG#9361 -------- DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( a1 char(30), a2 int, a3 int, a4 char(30), a5 char(30) ); CREATE TABLE t2 ( b1 int, b2 char(30) ); INSERT INTO t1 VALUES ('Yes', 1, NULL, 'foo', 'bar'); INSERT INTO t2 VALUES (1, 'baz'); UPDATE t1 a, t2 SET a.a1 = 'No' WHERE a.a2 = (SELECT b1 FROM t2 WHERE b2 = 'baz') AND a.a3 IS NULL AND a.a4 = 'foo' AND a.a5 = 'bar'; SELECT * FROM t1; a1 a2 a3 a4 a5 No 1 NULL foo bar SELECT * FROM t2; b1 b2 1 baz DROP TABLE t1, t2; -------- Test 2 for BUG#9361 -------- DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t3; CREATE TABLE t1 ( i INT, j INT, x INT, y INT, z INT ); CREATE TABLE t2 ( i INT, k INT, x INT, y INT, z INT ); CREATE TABLE t3 ( j INT, k INT, x INT, y INT, z INT ); INSERT INTO t1 VALUES ( 1, 2,13,14,15); INSERT INTO t2 VALUES ( 1, 3,23,24,25); INSERT INTO t3 VALUES ( 2, 3, 1,34,35), ( 2, 3, 1,34,36); UPDATE t1 AS a INNER JOIN t2 AS b ON a.i = b.i INNER JOIN t3 AS c ON a.j = c.j AND b.k = c.k SET a.x = b.x, a.y = b.y, a.z = ( SELECT sum(z) FROM t3 WHERE y = 34 ) WHERE b.x = 23; SELECT * FROM t1; i j x y z 1 2 23 24 71 DROP TABLE t1, t2, t3;
mysql-test/t/func_str.test +14 −0 Original line number Diff line number Diff line Loading @@ -529,3 +529,17 @@ DROP TABLE t1, t2; # select field(0,NULL,1,0), field("",NULL,"bar",""), field(0.0,NULL,1.0,0.0); select field(NULL,1,2,NULL), field(NULL,1,2,0); # # Bug #10124: access by integer index with a string key that is not a number # CREATE TABLE t1 (str varchar(20) PRIMARY KEY); CREATE TABLE t2 (num int primary key); INSERT INTO t1 VALUES ('notnumber'); INSERT INTO t2 VALUES (0), (1); SELECT * FROM t1, t2 WHERE num=str; SELECT * FROM t1, t2 WHERE num=substring(str from 1 for 6); DROP TABLE t1,t2;
mysql-test/t/rpl_multi_update3.test +129 −4 Original line number Diff line number Diff line source include/master-slave.inc; ############################################################################## # # Let's verify that multi-update with a subselect does not cause the slave to crash # (BUG#10442) source include/master-slave.inc; # --disable_query_log SELECT '-------- Test for BUG#9361 --------' as ""; --enable_query_log CREATE TABLE t1 ( a int unsigned not null auto_increment primary key, Loading @@ -25,10 +31,129 @@ UPDATE t2, (SELECT a FROM t1) AS t SET t2.b = t.a+5 ; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; save_master_pos; sync_slave_with_master; connection slave; sync_with_master; SELECT * FROM t1 ORDER BY a; SELECT * FROM t2 ORDER BY a; connection master; drop table t1,t2; ############################################################################## # # Test for BUG#9361: # Subselects should work inside multi-updates # --disable_query_log SELECT '-------- Test 1 for BUG#9361 --------' as ""; --enable_query_log connection master; --disable_warnings DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; --enable_warnings CREATE TABLE t1 ( a1 char(30), a2 int, a3 int, a4 char(30), a5 char(30) ); CREATE TABLE t2 ( b1 int, b2 char(30) ); # Insert one row per table INSERT INTO t1 VALUES ('Yes', 1, NULL, 'foo', 'bar'); INSERT INTO t2 VALUES (1, 'baz'); # This should update the row in t1 UPDATE t1 a, t2 SET a.a1 = 'No' WHERE a.a2 = (SELECT b1 FROM t2 WHERE b2 = 'baz') AND a.a3 IS NULL AND a.a4 = 'foo' AND a.a5 = 'bar'; sync_slave_with_master; connection slave; SELECT * FROM t1; SELECT * FROM t2; connection master; DROP TABLE t1, t2; ############################################################################## # # Second test for BUG#9361 # --disable_query_log SELECT '-------- Test 2 for BUG#9361 --------' as ""; --enable_query_log connection master; --disable_warnings DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t3; --enable_warnings CREATE TABLE t1 ( i INT, j INT, x INT, y INT, z INT ); CREATE TABLE t2 ( i INT, k INT, x INT, y INT, z INT ); CREATE TABLE t3 ( j INT, k INT, x INT, y INT, z INT ); INSERT INTO t1 VALUES ( 1, 2,13,14,15); INSERT INTO t2 VALUES ( 1, 3,23,24,25); INSERT INTO t3 VALUES ( 2, 3, 1,34,35), ( 2, 3, 1,34,36); UPDATE t1 AS a INNER JOIN t2 AS b ON a.i = b.i INNER JOIN t3 AS c ON a.j = c.j AND b.k = c.k SET a.x = b.x, a.y = b.y, a.z = ( SELECT sum(z) FROM t3 WHERE y = 34 ) WHERE b.x = 23; sync_slave_with_master; connection slave; SELECT * FROM t1; connection master; DROP TABLE t1, t2, t3;
sql/field.cc +16 −12 Original line number Diff line number Diff line Loading @@ -3322,7 +3322,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) } else if (from+len != end && table->in_use->count_cuted_fields && check_int(from,len,end,cs)) error= 1; error= 2; store_tmp= (long) tmp; #ifdef WORDS_BIGENDIAN Loading Loading @@ -3584,7 +3584,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) } else if (from+len != end && table->in_use->count_cuted_fields && check_int(from,len,end,cs)) error= 1; error= 2; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) { Loading Loading @@ -3806,7 +3806,7 @@ int Field_float::store(const char *from,uint len,CHARSET_INFO *cs) { set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, (error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1); error= 1; error= error ? 1 : 2; } Field_float::store(nr); return error; Loading Loading @@ -4093,7 +4093,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs) { set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, (error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1); error= 1; error= error ? 1 : 2; } Field_double::store(nr); return error; Loading Loading @@ -4495,6 +4495,8 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) error= 1; } } if (error > 1) error= 2; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) Loading Loading @@ -4791,7 +4793,7 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs) if (str_to_time(from, len, <ime, &error)) { tmp=0L; error= 1; error= 2; set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, from, len, MYSQL_TIMESTAMP_TIME, 1); } Loading @@ -4813,6 +4815,8 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs) from, len, MYSQL_TIMESTAMP_TIME, !error); error= 1; } if (error > 1) error= 2; } if (ltime.neg) Loading Loading @@ -5149,7 +5153,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs) &error) <= MYSQL_TIMESTAMP_ERROR) { tmp=0; error= 1; error= 2; } else tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day); Loading Loading @@ -5353,7 +5357,7 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) &error) <= MYSQL_TIMESTAMP_ERROR) { tmp=0L; error= 1; error= 2; } else tmp= l_time.day + l_time.month*32 + l_time.year*16*32; Loading Loading @@ -5836,7 +5840,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) from= tmpstr.ptr(); length= tmpstr.length(); if (conv_errors) error= 1; error= 2; } /* Loading @@ -5860,7 +5864,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES); if (from != end) error= 1; error= 2; } if (error) { Loading Loading @@ -6242,7 +6246,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) table->in_use->abort_on_warning) error_code= ER_DATA_TOO_LONG; set_warning(level, error_code, 1); return 1; return 2; } return 0; } Loading Loading @@ -6822,7 +6826,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) from= tmpstr.ptr(); length= tmpstr.length(); if (conv_errors) error= 1; error= 2; } copy_length= max_data_length(); Loading @@ -6837,7 +6841,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) copy_length, &well_formed_error); if (copy_length < length) error= 1; error= 2; Field_blob::store_length(copy_length); if (was_conversion || table->copy_blobs || copy_length <= MAX_FIELD_WIDTH) { // Must make a copy Loading