Commit 3dcf2056 authored by unknown's avatar unknown

Review of new code since last pull

- Use %lx instead of %p as %p is not portable
- Don't replace ROW item with Item_null


myisam/mi_rkey.c:
  Use %lx instead of %p as %p is not portable
myisam/mi_search.c:
  Use %lx instead of %p as %p is not portable
mysql-test/r/select.result:
  More test for ROW comparison
mysql-test/t/select.test:
  More test for ROW comparison
sql/item.cc:
  We can't replace a ROW item with Item_null because:
  - Arg_comparator is still using the orignal row items and it's not good to have args[0] different from what is actually compared
  - If we are using the <=> comparator, NULL can still be compared as true
  - We would break things if we would ever use resolve_const_item() for operators like >, < etc.
parent e4470578
...@@ -31,8 +31,8 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, ...@@ -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; HA_KEYSEG *last_used_keyseg;
uint pack_key_length, use_key_length, nextflag; uint pack_key_length, use_key_length, nextflag;
DBUG_ENTER("mi_rkey"); DBUG_ENTER("mi_rkey");
DBUG_PRINT("enter", ("base: %p buf: %p inx: %d search_flag: %d", DBUG_PRINT("enter", ("base: %lx buf: %lx inx: %d search_flag: %d",
info, buf, inx, search_flag)); (long) info, (long) buf, inx, search_flag));
if ((inx = _mi_check_index(info,inx)) < 0) if ((inx = _mi_check_index(info,inx)) < 0)
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
......
...@@ -257,15 +257,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ...@@ -257,15 +257,16 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
if (length == 0 || page > end) if (length == 0 || page > end)
{ {
my_errno=HA_ERR_CRASHED; my_errno=HA_ERR_CRASHED;
DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p", DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx",
length, page, end)); length, (long) page, (long) end));
DBUG_RETURN(MI_FOUND_WRONG_KEY); DBUG_RETURN(MI_FOUND_WRONG_KEY);
} }
if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag, if ((flag=ha_key_cmp(keyinfo->seg,t_buff,key,key_len,comp_flag,
&not_used)) >= 0) &not_used)) >= 0)
break; break;
#ifdef EXTRA_DEBUG #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 #endif
memcpy(buff,t_buff,length); memcpy(buff,t_buff,length);
*ret_pos=page; *ret_pos=page;
...@@ -273,7 +274,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ...@@ -273,7 +274,7 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
if (flag == 0) if (flag == 0)
memcpy(buff,t_buff,length); /* Result is first key */ memcpy(buff,t_buff,length); /* Result is first key */
*last_key= page == end; *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); DBUG_RETURN(flag);
} /* _mi_seq_search */ } /* _mi_seq_search */
...@@ -412,8 +413,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ...@@ -412,8 +413,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
if (page > end) if (page > end)
{ {
my_errno=HA_ERR_CRASHED; my_errno=HA_ERR_CRASHED;
DBUG_PRINT("error",("Found wrong key: length: %u page: %p end: %p", DBUG_PRINT("error",("Found wrong key: length: %u page: %lx end: %lx",
length, page, end)); length, (long) page, (long) end));
DBUG_RETURN(MI_FOUND_WRONG_KEY); DBUG_RETURN(MI_FOUND_WRONG_KEY);
} }
...@@ -546,7 +547,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, ...@@ -546,7 +547,7 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
*last_key= page == end; *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); DBUG_RETURN(flag);
} /* _mi_prefix_search */ } /* _mi_prefix_search */
...@@ -807,8 +808,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, ...@@ -807,8 +808,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
if (length > keyseg->length) if (length > keyseg->length)
{ {
DBUG_PRINT("error", DBUG_PRINT("error",
("Found too long null packed key: %u of %u at %p", ("Found too long null packed key: %u of %u at %lx",
length, keyseg->length, *page_pos)); length, keyseg->length, (long) *page_pos));
DBUG_DUMP("key",(char*) *page_pos,16); DBUG_DUMP("key",(char*) *page_pos,16);
my_errno=HA_ERR_CRASHED; my_errno=HA_ERR_CRASHED;
return 0; return 0;
...@@ -863,8 +864,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, ...@@ -863,8 +864,8 @@ uint _mi_get_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
} }
if (length > (uint) keyseg->length) if (length > (uint) keyseg->length)
{ {
DBUG_PRINT("error",("Found too long packed key: %u of %u at %p", DBUG_PRINT("error",("Found too long packed key: %u of %u at %lx",
length, keyseg->length, *page_pos)); length, keyseg->length, (long) *page_pos));
DBUG_DUMP("key",(char*) *page_pos,16); DBUG_DUMP("key",(char*) *page_pos,16);
my_errno=HA_ERR_CRASHED; my_errno=HA_ERR_CRASHED;
return 0; /* Error */ return 0; /* Error */
...@@ -928,8 +929,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, ...@@ -928,8 +929,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
{ {
if (length > keyinfo->maxlength) if (length > keyinfo->maxlength)
{ {
DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %p", DBUG_PRINT("error",("Found too long binary packed key: %u of %u at %lx",
length, keyinfo->maxlength, *page_pos)); length, keyinfo->maxlength, (long) *page_pos));
DBUG_DUMP("key",(char*) *page_pos,16); DBUG_DUMP("key",(char*) *page_pos,16);
my_errno=HA_ERR_CRASHED; my_errno=HA_ERR_CRASHED;
DBUG_RETURN(0); /* Wrong key */ DBUG_RETURN(0); /* Wrong key */
...@@ -975,8 +976,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag, ...@@ -975,8 +976,8 @@ uint _mi_get_binary_pack_key(register MI_KEYDEF *keyinfo, uint nod_flag,
length-=tmp; length-=tmp;
from=page; from_end=page_end; from=page; from_end=page_end;
} }
DBUG_PRINT("info",("key: %p from: %p length: %u", DBUG_PRINT("info",("key: %lx from: %lx length: %u",
key, from, length)); (long) key, (long) from, length));
memcpy_overlap((byte*) key, (byte*) from, (size_t) length); memcpy_overlap((byte*) key, (byte*) from, (size_t) length);
key+=length; key+=length;
from+=length; from+=length;
...@@ -1031,7 +1032,8 @@ uchar *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, ...@@ -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); DBUG_RETURN(page);
} /* _mi_get_key */ } /* _mi_get_key */
...@@ -1082,7 +1084,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, ...@@ -1082,7 +1084,7 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
uint nod_flag; uint nod_flag;
uchar *lastpos; uchar *lastpos;
DBUG_ENTER("_mi_get_last_key"); 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); nod_flag=mi_test_if_nod(page);
if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY))) if (! (keyinfo->flag & (HA_VAR_LENGTH_KEY | HA_BINARY_PACK_KEY)))
...@@ -1102,13 +1104,15 @@ uchar *_mi_get_last_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page, ...@@ -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); *return_key_length=(*keyinfo->get_key)(keyinfo,nod_flag,&page,lastkey);
if (*return_key_length == 0) 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; my_errno=HA_ERR_CRASHED;
DBUG_RETURN(0); 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); DBUG_RETURN(lastpos);
} /* _mi_get_last_key */ } /* _mi_get_last_key */
...@@ -1644,7 +1648,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key, ...@@ -1644,7 +1648,8 @@ _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,uchar *next_key,
ref_length=0; ref_length=0;
next_length_pack=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; uint tmp_length;
......
...@@ -2625,4 +2625,11 @@ select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1)); ...@@ -2625,4 +2625,11 @@ select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1));
f1 f1
select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL)); select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL));
f1 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; drop table t1,t2;
...@@ -2172,6 +2172,10 @@ create table t2(f3 int); ...@@ -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,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,NULL) = ((1,1));
select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL)); 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; drop table t1,t2;
# End of 4.1 tests # End of 4.1 tests
...@@ -2872,32 +2872,21 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item) ...@@ -2872,32 +2872,21 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
} }
else if (res_type == ROW_RESULT) 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; new_item= 0;
/* /*
If item and comp_item are both Item_rows and have same number of cols 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 then process items in Item_row one by one.
substitute it by Item_null. Otherwise just return. We can't ignore NULL values here as this item may be used with <=>, in
which case NULL's are significant.
*/ */
if (item->result_type() == comp_item->result_type() && DBUG_ASSERT(item->result_type() == comp_item->result_type());
((Item_row*)item)->cols() == ((Item_row*)comp_item)->cols()) DBUG_ASSERT(item_row->cols() == comp_item_row->cols());
{ col= item_row->cols();
Item_row *item_row= (Item_row*)item,*comp_item_row= (Item_row*)comp_item; while (col-- > 0)
if (item_row->null_inside()) resolve_const_item(thd, item_row->addr(col), comp_item_row->el(col));
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));
}
}
}
} }
else else
{ // It must REAL_RESULT { // It must REAL_RESULT
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment