Commit de96d529 authored by evgen@moonbone.local's avatar evgen@moonbone.local

Manually merged

parents 41f968e1 de8a1b4f
...@@ -202,6 +202,27 @@ select count(*) from t1 where id not in (1,2); ...@@ -202,6 +202,27 @@ select count(*) from t1 where id not in (1,2);
count(*) count(*)
1 1
drop table t1; 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;
CREATE TABLE t1 (a int PRIMARY KEY); CREATE TABLE t1 (a int PRIMARY KEY);
INSERT INTO t1 VALUES (44), (45), (46); INSERT INTO t1 VALUES (44), (45), (46);
SELECT * FROM t1 WHERE a IN (45); SELECT * FROM t1 WHERE a IN (45);
......
...@@ -109,6 +109,18 @@ select count(*) from t1 where id not in (1); ...@@ -109,6 +109,18 @@ select count(*) from t1 where id not in (1);
select count(*) from t1 where id not in (1,2); select count(*) from t1 where id not in (1,2);
drop table t1; 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 # End of 4.1 tests
# #
......
...@@ -76,11 +76,19 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems) ...@@ -76,11 +76,19 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
field= NULL; field= NULL;
type[0]= items[0]->result_type(); type[0]= items[0]->result_type();
for (i= 1; i < nitems; i++) /* Reset to 0 on first occurence of non-const item. 1 otherwise */
bool is_const= items[0]->const_item();
for (i= 1 ; i < nitems ; i++)
{ {
type[0]= item_cmp_type(type[0], items[i]->result_type()); if (!items[i]->const_item())
if (field && convert_constant_item(thd, field, &items[i])) {
type[0]= INT_RESULT; type[0]= is_const ? items[i]->result_type() :
item_cmp_type(type[0], items[i]->result_type());
is_const= 0;
}
else if (is_const)
type[0]= item_cmp_type(type[0], items[i]->result_type());
} }
} }
......
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