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 @@ -257,15 +257,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, if (length == 0 || page > end) { 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 @@ -273,7 +274,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 @@ -412,8 +413,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, if (page > end) { 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 @@ -546,7 +547,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 @@ -807,8 +808,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); my_errno=HA_ERR_CRASHED; return 0; Loading Loading @@ -863,8 +864,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); my_errno=HA_ERR_CRASHED; return 0; /* Error */ Loading Loading @@ -928,8 +929,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); my_errno=HA_ERR_CRASHED; DBUG_RETURN(0); /* Wrong key */ Loading Loading @@ -975,8 +976,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 @@ -1031,7 +1032,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 @@ -1082,7 +1084,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 @@ -1102,13 +1104,15 @@ 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)); 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 @@ -1644,7 +1648,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/select.result +7 −0 Original line number Diff line number Diff line Loading @@ -2625,4 +2625,11 @@ select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1)); f1 select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL)); f1 insert into t1 values(1,1),(2,null); insert into t2 values(2); select * from t1,t2 where f1=f3 and (f1,f2) = (2,null); f1 f2 f3 select * from t1,t2 where f1=f3 and (f1,f2) <=> (2,null); f1 f2 f3 2 NULL 2 drop table t1,t2; mysql-test/t/select.test +4 −0 Original line number Diff line number Diff line Loading @@ -2172,6 +2172,10 @@ create table t2(f3 int); select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,1)); select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1)); select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL)); insert into t1 values(1,1),(2,null); insert into t2 values(2); select * from t1,t2 where f1=f3 and (f1,f2) = (2,null); select * from t1,t2 where f1=f3 and (f1,f2) <=> (2,null); drop table t1,t2; # End of 4.1 tests sql/item.cc +11 −22 Original line number Diff line number Diff line Loading @@ -2872,32 +2872,21 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item) } else if (res_type == ROW_RESULT) { Item_row *item_row= (Item_row*) item; Item_row *comp_item_row= (Item_row*) comp_item; uint col; new_item= 0; /* If item and comp_item are both Item_rows and have same number of cols then process items in Item_row one by one. If Item_row contain nulls substitute it by Item_null. Otherwise just return. */ if (item->result_type() == comp_item->result_type() && ((Item_row*)item)->cols() == ((Item_row*)comp_item)->cols()) { Item_row *item_row= (Item_row*)item,*comp_item_row= (Item_row*)comp_item; if (item_row->null_inside()) new_item= (Item*) new Item_null(name); else { int i= item_row->cols() - 1; for (; i >= 0; i--) { if (item_row->maybe_null && item_row->el(i)->is_null()) { new_item= (Item*) new Item_null(name); break; } resolve_const_item(thd, item_row->addr(i), comp_item_row->el(i)); } } } then process items in Item_row one by one. We can't ignore NULL values here as this item may be used with <=>, in which case NULL's are significant. */ DBUG_ASSERT(item->result_type() == comp_item->result_type()); DBUG_ASSERT(item_row->cols() == comp_item_row->cols()); col= item_row->cols(); while (col-- > 0) resolve_const_item(thd, item_row->addr(col), comp_item_row->el(col)); } else { // It must REAL_RESULT Loading 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 @@ -257,15 +257,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, if (length == 0 || page > end) { 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 @@ -273,7 +274,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 @@ -412,8 +413,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, if (page > end) { 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 @@ -546,7 +547,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 @@ -807,8 +808,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); my_errno=HA_ERR_CRASHED; return 0; Loading Loading @@ -863,8 +864,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); my_errno=HA_ERR_CRASHED; return 0; /* Error */ Loading Loading @@ -928,8 +929,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); my_errno=HA_ERR_CRASHED; DBUG_RETURN(0); /* Wrong key */ Loading Loading @@ -975,8 +976,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 @@ -1031,7 +1032,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 @@ -1082,7 +1084,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 @@ -1102,13 +1104,15 @@ 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)); 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 @@ -1644,7 +1648,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/select.result +7 −0 Original line number Diff line number Diff line Loading @@ -2625,4 +2625,11 @@ select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1)); f1 select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL)); f1 insert into t1 values(1,1),(2,null); insert into t2 values(2); select * from t1,t2 where f1=f3 and (f1,f2) = (2,null); f1 f2 f3 select * from t1,t2 where f1=f3 and (f1,f2) <=> (2,null); f1 f2 f3 2 NULL 2 drop table t1,t2;
mysql-test/t/select.test +4 −0 Original line number Diff line number Diff line Loading @@ -2172,6 +2172,10 @@ create table t2(f3 int); select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,1)); select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1)); select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL)); insert into t1 values(1,1),(2,null); insert into t2 values(2); select * from t1,t2 where f1=f3 and (f1,f2) = (2,null); select * from t1,t2 where f1=f3 and (f1,f2) <=> (2,null); drop table t1,t2; # End of 4.1 tests
sql/item.cc +11 −22 Original line number Diff line number Diff line Loading @@ -2872,32 +2872,21 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item) } else if (res_type == ROW_RESULT) { Item_row *item_row= (Item_row*) item; Item_row *comp_item_row= (Item_row*) comp_item; uint col; new_item= 0; /* If item and comp_item are both Item_rows and have same number of cols then process items in Item_row one by one. If Item_row contain nulls substitute it by Item_null. Otherwise just return. */ if (item->result_type() == comp_item->result_type() && ((Item_row*)item)->cols() == ((Item_row*)comp_item)->cols()) { Item_row *item_row= (Item_row*)item,*comp_item_row= (Item_row*)comp_item; if (item_row->null_inside()) new_item= (Item*) new Item_null(name); else { int i= item_row->cols() - 1; for (; i >= 0; i--) { if (item_row->maybe_null && item_row->el(i)->is_null()) { new_item= (Item*) new Item_null(name); break; } resolve_const_item(thd, item_row->addr(i), comp_item_row->el(i)); } } } then process items in Item_row one by one. We can't ignore NULL values here as this item may be used with <=>, in which case NULL's are significant. */ DBUG_ASSERT(item->result_type() == comp_item->result_type()); DBUG_ASSERT(item_row->cols() == comp_item_row->cols()); col= item_row->cols(); while (col-- > 0) resolve_const_item(thd, item_row->addr(col), comp_item_row->el(col)); } else { // It must REAL_RESULT Loading