Loading mysql-test/r/func_in.result +0 −21 Original line number Diff line number Diff line Loading @@ -202,24 +202,3 @@ select count(*) from t1 where id not in (1,2); count(*) 1 drop table t1; create table t1 (f1 char(1), f2 int); insert into t1 values (1,0),('a',1),('z',2); select f1 from t1 where f1 in (1,'z'); f1 1 z select f2 from t1 where f2 in (1,'z'); f2 0 1 select f1 from t1 where 'z' in (1,f1); f1 z select * from t1 where 'z' in (f2,f1); f1 f2 z 2 select * from t1 where 1 in (f2,f1); f1 f2 1 0 a 1 drop table t1; mysql-test/t/func_in.test +0 −12 Original line number Diff line number Diff line Loading @@ -109,16 +109,4 @@ select count(*) from t1 where id not in (1); select count(*) from t1 where id not in (1,2); drop table t1; # # Bug#18360 Incorrect type coercion in IN() results in false comparison # create table t1 (f1 char(1), f2 int); insert into t1 values (1,0),('a',1),('z',2); select f1 from t1 where f1 in (1,'z'); select f2 from t1 where f2 in (1,'z'); select f1 from t1 where 'z' in (1,f1); select * from t1 where 'z' in (f2,f1); select * from t1 where 1 in (f2,f1); drop table t1; # End of 4.1 tests sql/item_cmpfunc.cc +8 −20 Original line number Diff line number Diff line Loading @@ -78,9 +78,6 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems) NOTES Aggregation rules: If all items are constants the type will be aggregated from all items. If there are some non-constant items then only types of non-constant items will be used for aggregation. If there are DATE/TIME fields/functions in the list and no string fields/functions in the list then: The INT_RESULT type will be used for aggregation instead of original Loading Loading @@ -167,34 +164,25 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems) } } } /* Reset to 0 on first occurence of non-const item. 1 otherwise */ bool is_const= items[0]->const_item(); /* If the first item is a date/time function then its result should be compared as int */ if (field) { /* Suppose we are comparing dates and some non-constant items are present. */ /* Suppose we are comparing dates */ type[0]= INT_RESULT; is_const= 0; } else type[0]= items[0]->result_type(); for (i= 0; i < nitems ; i++) { if (!items[i]->const_item()) { Item_result result= field && items[i]->result_as_longlong() ? INT_RESULT : items[i]->result_type(); type[0]= is_const ? result : item_cmp_type(type[0], result); is_const= 0; } else if (is_const) type[0]= item_cmp_type(type[0], items[i]->result_type()); else if (field) convert_constant_item(thd, field, &items[i]); Item_result result= items[i]->result_type(); if (field && ((!items[i]->const_item() && items[i]->result_as_longlong()) || (items[i]->const_item() && convert_constant_item(thd, field, &items[i])))) result= INT_RESULT; type[0]= item_cmp_type(type[0], result); } if (res == Item::FUNC_ITEM && field) Loading Loading
mysql-test/r/func_in.result +0 −21 Original line number Diff line number Diff line Loading @@ -202,24 +202,3 @@ select count(*) from t1 where id not in (1,2); count(*) 1 drop table t1; create table t1 (f1 char(1), f2 int); insert into t1 values (1,0),('a',1),('z',2); select f1 from t1 where f1 in (1,'z'); f1 1 z select f2 from t1 where f2 in (1,'z'); f2 0 1 select f1 from t1 where 'z' in (1,f1); f1 z select * from t1 where 'z' in (f2,f1); f1 f2 z 2 select * from t1 where 1 in (f2,f1); f1 f2 1 0 a 1 drop table t1;
mysql-test/t/func_in.test +0 −12 Original line number Diff line number Diff line Loading @@ -109,16 +109,4 @@ select count(*) from t1 where id not in (1); select count(*) from t1 where id not in (1,2); drop table t1; # # Bug#18360 Incorrect type coercion in IN() results in false comparison # create table t1 (f1 char(1), f2 int); insert into t1 values (1,0),('a',1),('z',2); select f1 from t1 where f1 in (1,'z'); select f2 from t1 where f2 in (1,'z'); select f1 from t1 where 'z' in (1,f1); select * from t1 where 'z' in (f2,f1); select * from t1 where 1 in (f2,f1); drop table t1; # End of 4.1 tests
sql/item_cmpfunc.cc +8 −20 Original line number Diff line number Diff line Loading @@ -78,9 +78,6 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems) NOTES Aggregation rules: If all items are constants the type will be aggregated from all items. If there are some non-constant items then only types of non-constant items will be used for aggregation. If there are DATE/TIME fields/functions in the list and no string fields/functions in the list then: The INT_RESULT type will be used for aggregation instead of original Loading Loading @@ -167,34 +164,25 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems) } } } /* Reset to 0 on first occurence of non-const item. 1 otherwise */ bool is_const= items[0]->const_item(); /* If the first item is a date/time function then its result should be compared as int */ if (field) { /* Suppose we are comparing dates and some non-constant items are present. */ /* Suppose we are comparing dates */ type[0]= INT_RESULT; is_const= 0; } else type[0]= items[0]->result_type(); for (i= 0; i < nitems ; i++) { if (!items[i]->const_item()) { Item_result result= field && items[i]->result_as_longlong() ? INT_RESULT : items[i]->result_type(); type[0]= is_const ? result : item_cmp_type(type[0], result); is_const= 0; } else if (is_const) type[0]= item_cmp_type(type[0], items[i]->result_type()); else if (field) convert_constant_item(thd, field, &items[i]); Item_result result= items[i]->result_type(); if (field && ((!items[i]->const_item() && items[i]->result_as_longlong()) || (items[i]->const_item() && convert_constant_item(thd, field, &items[i])))) result= INT_RESULT; type[0]= item_cmp_type(type[0], result); } if (res == Item::FUNC_ITEM && field) Loading