Commit 028fa1e4 authored by unknown's avatar unknown
Browse files

item_cmpfunc.cc, func_in.result, func_in.test:

  Reverted fix for bug#18360


mysql-test/t/func_in.test:
  Reverted fix for bug#18360
mysql-test/r/func_in.result:
  Reverted fix for bug#18360
sql/item_cmpfunc.cc:
  Reverted fix for bug#18360
parent 0d165134
Loading
Loading
Loading
Loading
+0 −21
Original line number Diff line number Diff line
@@ -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;
+0 −12
Original line number Diff line number Diff line
@@ -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
+8 −20
Original line number Diff line number Diff line
@@ -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
@@ -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)