Loading myisam/mi_rkey.c +2 −2 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, HA_KEYSEG *last_used_keyseg; uint pack_key_length, use_key_length, nextflag; DBUG_ENTER("mi_rkey"); DBUG_PRINT("enter", ("base: %p buf: %p inx: %d search_flag: %d", info, buf, inx, search_flag)); DBUG_PRINT("enter", ("base: %lx buf: %lx inx: %d search_flag: %d", (long) info, (long) buf, inx, search_flag)); if ((inx = _mi_check_index(info,inx)) < 0) DBUG_RETURN(my_errno); Loading myisam/mi_search.c +25 −20 Original line number Diff line number Diff line Loading @@ -259,15 +259,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, { mi_print_error(info->s, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p", length, page, end)); DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx", length, (long) page, (long) end)); DBUG_RETURN(MI_FOUND_WRONG_KEY); } if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag, ¬_used)) >= 0) break; #ifdef EXTRA_DEBUG DBUG_PRINT("loop",("page: %p key: '%s' flag: %d", page, t_buff, flag)); DBUG_PRINT("loop",("page: %lx key: '%s' flag: %d", (long) page, t_buff, flag)); #endif memcpy(buff,t_buff,length); *ret_pos=page; Loading @@ -275,7 +276,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, if (flag == 0) memcpy(buff,t_buff,length); /* Result is first key */ *last_key= page == end; DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos)); DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos)); DBUG_RETURN(flag); } /* _mi_seq_search */ Loading Loading @@ -415,8 +416,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, { mi_print_error(info->s, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p", length, page, end)); DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx", length, (long) page, (long) end)); DBUG_RETURN(MI_FOUND_WRONG_KEY); } Loading Loading @@ -550,7 +551,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, *last_key= page == end; DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos)); DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos)); DBUG_RETURN(flag); } /* _mi_prefix_search */ Loading Loading @@ -812,8 +813,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, if (length > keyseg->length) { DBUG_PRINT("error", ("Found too long null packed key: %u of %u at %p", length, keyseg->length, *page_pos)); ("Found too long null packed key: %u of %u at %lx", length, keyseg->length, (long) *page_pos)); DBUG_DUMP("key",(char*) *page_pos,16); mi_print_error(keyinfo->share, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; Loading Loading @@ -869,8 +870,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, } if (length > (uint) keyseg->length) { DBUG_PRINT("error",("Found too long packed key: %u of %u at %p", length, keyseg->length, *page_pos)); DBUG_PRINT("error",("Found too long packed key: %u of %u at %lx", length, keyseg->length, (long) *page_pos)); DBUG_DUMP("key",(char*) *page_pos,16); mi_print_error(keyinfo->share, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; Loading Loading @@ -935,8 +936,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, { if (length > keyinfo->maxlength) { DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %p", length, keyinfo->maxlength, *page_pos)); DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %lx", length, keyinfo->maxlength, (long) *page_pos)); DBUG_DUMP("key",(char*) *page_pos,16); mi_print_error(keyinfo->share, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; Loading Loading @@ -983,8 +984,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, length-=tmp; from=page; from_end=page_end; } DBUG_PRINT("info",("key: %p from: %p length: %u", key, from, length)); DBUG_PRINT("info",("key: %lx from: %lx length: %u", (long) key, (long) from, length)); memcpy_overlap((byte*) key, (byte*) from, (size_t) length); key+=length; from+=length; Loading Loading @@ -1041,7 +1042,8 @@ uchar *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, } } } DBUG_PRINT("exit",("page: %p length: %u", page, *return_key_length)); DBUG_PRINT("exit",("page: %lx length: %u", (long) page, *return_key_length)); DBUG_RETURN(page); } /* _mi_get_key */ Loading Loading @@ -1093,7 +1095,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uint nod_flag; uchar *lastpos; DBUG_ENTER("_mi_get_last_key"); DBUG_PRINT("enter",("page: %p endpos: %p", page, endpos)); DBUG_PRINT("enter",("page: %lx endpos: %lx", (long) page, (long) endpos)); nod_flag=mi_test_if_nod(page); if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY))) Loading @@ -1113,14 +1115,16 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, *return_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&page,lastkey); if (*return_key_length == 0) { DBUG_PRINT("error",("Couldn't find last key: page: %p", page)); DBUG_PRINT("error",("Couldn't find last key: page: %lx", (long) page)); mi_print_error(info->s, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; DBUG_RETURN(0); } } } DBUG_PRINT("exit",("lastpos: %p length: %u", lastpos, *return_key_length)); DBUG_PRINT("exit",("lastpos: %lx length: %u", (long) lastpos, *return_key_length)); DBUG_RETURN(lastpos); } /* _mi_get_last_key */ Loading Loading @@ -1659,7 +1663,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key, ref_length=0; next_length_pack=0; } DBUG_PRINT("test",("length: %d next_key: %p", length, next_key)); DBUG_PRINT("test",("length: %d next_key: %lx", length, (long) next_key)); { uint tmp_length; Loading mysql-test/r/rpl_multi_update3.result +72 −0 Original line number Diff line number Diff line Loading @@ -122,3 +122,75 @@ SELECT * FROM t1; i j x y z 1 2 23 24 71 DROP TABLE t1, t2, t3; DROP TABLE IF EXISTS t1; Warnings: Note 1051 Unknown table 't1' DROP TABLE IF EXISTS t2; Warnings: Note 1051 Unknown table 't2' CREATE TABLE t1 ( idp int(11) NOT NULL default '0', idpro int(11) default NULL, price decimal(19,4) default NULL, PRIMARY KEY (idp) ); CREATE TABLE t2 ( idpro int(11) NOT NULL default '0', price decimal(19,4) default NULL, nbprice int(11) default NULL, PRIMARY KEY (idpro) ); INSERT INTO t1 VALUES (1,1,'3.0000'), (2,2,'1.0000'), (3,1,'1.0000'), (4,1,'4.0000'), (5,3,'2.0000'), (6,2,'4.0000'); INSERT INTO t2 VALUES (1,'0.0000',0), (2,'0.0000',0), (3,'0.0000',0); update t2 join ( select idpro, min(price) as min_price, count(*) as nbr_price from t1 where idpro>0 and price>0 group by idpro ) as table_price on t2.idpro = table_price.idpro set t2.price = table_price.min_price, t2.nbprice = table_price.nbr_price; select "-- MASTER AFTER JOIN --" as ""; -- MASTER AFTER JOIN -- select * from t1; idp idpro price 1 1 3.0000 2 2 1.0000 3 1 1.0000 4 1 4.0000 5 3 2.0000 6 2 4.0000 select * from t2; idpro price nbprice 1 1.0000 3 2 1.0000 2 3 2.0000 1 select "-- SLAVE AFTER JOIN --" as ""; -- SLAVE AFTER JOIN -- select * from t1; idp idpro price 1 1 3.0000 2 2 1.0000 3 1 1.0000 4 1 4.0000 5 3 2.0000 6 2 4.0000 select * from t2; idpro price nbprice 1 1.0000 3 2 1.0000 2 3 2.0000 1 mysql-test/r/subselect2.result +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ DOCID VARCHAR(32)BINARY NOT NULL , PRIMARY KEY ( DOCID ) ) ENGINE=InnoDB ; INSERT INTO t1 (DOCID) VALUES ("1"), ("2"); CREATE TABLE t2 ( DOCID VARCHAR(32)BINARY NOT NULL Loading mysql-test/t/rpl_multi_update3.test +59 −0 Original line number Diff line number Diff line Loading @@ -158,4 +158,63 @@ SELECT * FROM t1; connection master; DROP TABLE t1, t2, t3; ############################################################################## # # BUG#12618 # # TEST: Replication of a statement containing a join in a multi-update. DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( idp int(11) NOT NULL default '0', idpro int(11) default NULL, price decimal(19,4) default NULL, PRIMARY KEY (idp) ); CREATE TABLE t2 ( idpro int(11) NOT NULL default '0', price decimal(19,4) default NULL, nbprice int(11) default NULL, PRIMARY KEY (idpro) ); INSERT INTO t1 VALUES (1,1,'3.0000'), (2,2,'1.0000'), (3,1,'1.0000'), (4,1,'4.0000'), (5,3,'2.0000'), (6,2,'4.0000'); INSERT INTO t2 VALUES (1,'0.0000',0), (2,'0.0000',0), (3,'0.0000',0); # This update sets t2 to the minimal prices for each product update t2 join ( select idpro, min(price) as min_price, count(*) as nbr_price from t1 where idpro>0 and price>0 group by idpro ) as table_price on t2.idpro = table_price.idpro set t2.price = table_price.min_price, t2.nbprice = table_price.nbr_price; select "-- MASTER AFTER JOIN --" as ""; select * from t1; select * from t2; sync_slave_with_master; select "-- SLAVE AFTER JOIN --" as ""; select * from t1; select * from t2; # End of 4.1 tests Loading
myisam/mi_rkey.c +2 −2 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, HA_KEYSEG *last_used_keyseg; uint pack_key_length, use_key_length, nextflag; DBUG_ENTER("mi_rkey"); DBUG_PRINT("enter", ("base: %p buf: %p inx: %d search_flag: %d", info, buf, inx, search_flag)); DBUG_PRINT("enter", ("base: %lx buf: %lx inx: %d search_flag: %d", (long) info, (long) buf, inx, search_flag)); if ((inx = _mi_check_index(info,inx)) < 0) DBUG_RETURN(my_errno); Loading
myisam/mi_search.c +25 −20 Original line number Diff line number Diff line Loading @@ -259,15 +259,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, { mi_print_error(info->s, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p", length, page, end)); DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx", length, (long) page, (long) end)); DBUG_RETURN(MI_FOUND_WRONG_KEY); } if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag, ¬_used)) >= 0) break; #ifdef EXTRA_DEBUG DBUG_PRINT("loop",("page: %p key: '%s' flag: %d", page, t_buff, flag)); DBUG_PRINT("loop",("page: %lx key: '%s' flag: %d", (long) page, t_buff, flag)); #endif memcpy(buff,t_buff,length); *ret_pos=page; Loading @@ -275,7 +276,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, if (flag == 0) memcpy(buff,t_buff,length); /* Result is first key */ *last_key= page == end; DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos)); DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos)); DBUG_RETURN(flag); } /* _mi_seq_search */ Loading Loading @@ -415,8 +416,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, { mi_print_error(info->s, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p", length, page, end)); DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx", length, (long) page, (long) end)); DBUG_RETURN(MI_FOUND_WRONG_KEY); } Loading Loading @@ -550,7 +551,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, *last_key= page == end; DBUG_PRINT("exit",("flag: %d ret_pos: %p", flag, *ret_pos)); DBUG_PRINT("exit",("flag: %d ret_pos: %lx", flag, (long) *ret_pos)); DBUG_RETURN(flag); } /* _mi_prefix_search */ Loading Loading @@ -812,8 +813,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, if (length > keyseg->length) { DBUG_PRINT("error", ("Found too long null packed key: %u of %u at %p", length, keyseg->length, *page_pos)); ("Found too long null packed key: %u of %u at %lx", length, keyseg->length, (long) *page_pos)); DBUG_DUMP("key",(char*) *page_pos,16); mi_print_error(keyinfo->share, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; Loading Loading @@ -869,8 +870,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, } if (length > (uint) keyseg->length) { DBUG_PRINT("error",("Found too long packed key: %u of %u at %p", length, keyseg->length, *page_pos)); DBUG_PRINT("error",("Found too long packed key: %u of %u at %lx", length, keyseg->length, (long) *page_pos)); DBUG_DUMP("key",(char*) *page_pos,16); mi_print_error(keyinfo->share, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; Loading Loading @@ -935,8 +936,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, { if (length > keyinfo->maxlength) { DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %p", length, keyinfo->maxlength, *page_pos)); DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %lx", length, keyinfo->maxlength, (long) *page_pos)); DBUG_DUMP("key",(char*) *page_pos,16); mi_print_error(keyinfo->share, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; Loading Loading @@ -983,8 +984,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, length-=tmp; from=page; from_end=page_end; } DBUG_PRINT("info",("key: %p from: %p length: %u", key, from, length)); DBUG_PRINT("info",("key: %lx from: %lx length: %u", (long) key, (long) from, length)); memcpy_overlap((byte*) key, (byte*) from, (size_t) length); key+=length; from+=length; Loading Loading @@ -1041,7 +1042,8 @@ uchar *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, } } } DBUG_PRINT("exit",("page: %p length: %u", page, *return_key_length)); DBUG_PRINT("exit",("page: %lx length: %u", (long) page, *return_key_length)); DBUG_RETURN(page); } /* _mi_get_key */ Loading Loading @@ -1093,7 +1095,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, uint nod_flag; uchar *lastpos; DBUG_ENTER("_mi_get_last_key"); DBUG_PRINT("enter",("page: %p endpos: %p", page, endpos)); DBUG_PRINT("enter",("page: %lx endpos: %lx", (long) page, (long) endpos)); nod_flag=mi_test_if_nod(page); if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY))) Loading @@ -1113,14 +1115,16 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, *return_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&page,lastkey); if (*return_key_length == 0) { DBUG_PRINT("error",("Couldn't find last key: page: %p", page)); DBUG_PRINT("error",("Couldn't find last key: page: %lx", (long) page)); mi_print_error(info->s, HA_ERR_CRASHED); my_errno=HA_ERR_CRASHED; DBUG_RETURN(0); } } } DBUG_PRINT("exit",("lastpos: %p length: %u", lastpos, *return_key_length)); DBUG_PRINT("exit",("lastpos: %lx length: %u", (long) lastpos, *return_key_length)); DBUG_RETURN(lastpos); } /* _mi_get_last_key */ Loading Loading @@ -1659,7 +1663,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key, ref_length=0; next_length_pack=0; } DBUG_PRINT("test",("length: %d next_key: %p", length, next_key)); DBUG_PRINT("test",("length: %d next_key: %lx", length, (long) next_key)); { uint tmp_length; Loading
mysql-test/r/rpl_multi_update3.result +72 −0 Original line number Diff line number Diff line Loading @@ -122,3 +122,75 @@ SELECT * FROM t1; i j x y z 1 2 23 24 71 DROP TABLE t1, t2, t3; DROP TABLE IF EXISTS t1; Warnings: Note 1051 Unknown table 't1' DROP TABLE IF EXISTS t2; Warnings: Note 1051 Unknown table 't2' CREATE TABLE t1 ( idp int(11) NOT NULL default '0', idpro int(11) default NULL, price decimal(19,4) default NULL, PRIMARY KEY (idp) ); CREATE TABLE t2 ( idpro int(11) NOT NULL default '0', price decimal(19,4) default NULL, nbprice int(11) default NULL, PRIMARY KEY (idpro) ); INSERT INTO t1 VALUES (1,1,'3.0000'), (2,2,'1.0000'), (3,1,'1.0000'), (4,1,'4.0000'), (5,3,'2.0000'), (6,2,'4.0000'); INSERT INTO t2 VALUES (1,'0.0000',0), (2,'0.0000',0), (3,'0.0000',0); update t2 join ( select idpro, min(price) as min_price, count(*) as nbr_price from t1 where idpro>0 and price>0 group by idpro ) as table_price on t2.idpro = table_price.idpro set t2.price = table_price.min_price, t2.nbprice = table_price.nbr_price; select "-- MASTER AFTER JOIN --" as ""; -- MASTER AFTER JOIN -- select * from t1; idp idpro price 1 1 3.0000 2 2 1.0000 3 1 1.0000 4 1 4.0000 5 3 2.0000 6 2 4.0000 select * from t2; idpro price nbprice 1 1.0000 3 2 1.0000 2 3 2.0000 1 select "-- SLAVE AFTER JOIN --" as ""; -- SLAVE AFTER JOIN -- select * from t1; idp idpro price 1 1 3.0000 2 2 1.0000 3 1 1.0000 4 1 4.0000 5 3 2.0000 6 2 4.0000 select * from t2; idpro price nbprice 1 1.0000 3 2 1.0000 2 3 2.0000 1
mysql-test/r/subselect2.result +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ DOCID VARCHAR(32)BINARY NOT NULL , PRIMARY KEY ( DOCID ) ) ENGINE=InnoDB ; INSERT INTO t1 (DOCID) VALUES ("1"), ("2"); CREATE TABLE t2 ( DOCID VARCHAR(32)BINARY NOT NULL Loading
mysql-test/t/rpl_multi_update3.test +59 −0 Original line number Diff line number Diff line Loading @@ -158,4 +158,63 @@ SELECT * FROM t1; connection master; DROP TABLE t1, t2, t3; ############################################################################## # # BUG#12618 # # TEST: Replication of a statement containing a join in a multi-update. DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( idp int(11) NOT NULL default '0', idpro int(11) default NULL, price decimal(19,4) default NULL, PRIMARY KEY (idp) ); CREATE TABLE t2 ( idpro int(11) NOT NULL default '0', price decimal(19,4) default NULL, nbprice int(11) default NULL, PRIMARY KEY (idpro) ); INSERT INTO t1 VALUES (1,1,'3.0000'), (2,2,'1.0000'), (3,1,'1.0000'), (4,1,'4.0000'), (5,3,'2.0000'), (6,2,'4.0000'); INSERT INTO t2 VALUES (1,'0.0000',0), (2,'0.0000',0), (3,'0.0000',0); # This update sets t2 to the minimal prices for each product update t2 join ( select idpro, min(price) as min_price, count(*) as nbr_price from t1 where idpro>0 and price>0 group by idpro ) as table_price on t2.idpro = table_price.idpro set t2.price = table_price.min_price, t2.nbprice = table_price.nbr_price; select "-- MASTER AFTER JOIN --" as ""; select * from t1; select * from t2; sync_slave_with_master; select "-- SLAVE AFTER JOIN --" as ""; select * from t1; select * from t2; # End of 4.1 tests