summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2006-06-20 00:50:09 +0400
committerunknown <evgen@moonbone.local>2006-06-20 00:50:09 +0400
commit028fa1e454459e0732b00fc4adc1c0fb7fe6632f (patch)
treed08d774a5dac12d2ed7e5c5125595417b44fd7aa
parent0d165134cc8cea8322e89443f0a0aea2dedb6ca9 (diff)
downloadmariadb-git-028fa1e454459e0732b00fc4adc1c0fb7fe6632f.tar.gz
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
-rw-r--r--mysql-test/r/func_in.result21
-rw-r--r--mysql-test/t/func_in.test12
-rw-r--r--sql/item_cmpfunc.cc28
3 files changed, 8 insertions, 53 deletions
diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result
index 0632dddb87e..3cf2afc83d1 100644
--- a/mysql-test/r/func_in.result
+++ b/mysql-test/r/func_in.result
@@ -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;
diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test
index 3481f2c7b11..2ffe5a2d5f7 100644
--- a/mysql-test/t/func_in.test
+++ b/mysql-test/t/func_in.test
@@ -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
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 126037a24d8..5055b5f4197 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -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)