From fdc2b921cc529076de68d099b809cb1cb29dfa67 Mon Sep 17 00:00:00 2001
From: "evgen@moonbone.local" <>
Date: Tue, 30 May 2006 23:05:34 +0400
Subject: [PATCH] item_cmpfunc.cc, func_in.result, multi_update.result:   After
 merge fix

---
 mysql-test/r/func_in.result      |  8 ++++++++
 mysql-test/r/multi_update.result |  1 +
 sql/item_cmpfunc.cc              | 23 +++++++++++++++++++++++
 3 files changed, 32 insertions(+)

diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result
index dd355c693d..f758e2adfd 100644
--- a/mysql-test/r/func_in.result
+++ b/mysql-test/r/func_in.result
@@ -212,12 +212,20 @@ select f2 from t1 where f2 in (1,'z');
 f2
 0
 1
+Warnings:
+Warning	1292	Truncated incorrect INTEGER value: 'z'
 select f1 from t1 where 'z' in (1,f1);
 f1
 z
 select * from t1 where 'z' in (f2,f1);
 f1	f2
+1	0
+a	1
 z	2
+Warnings:
+Warning	1292	Truncated incorrect DOUBLE value: 'z'
+Warning	1292	Truncated incorrect DOUBLE value: 'z'
+Warning	1292	Truncated incorrect DOUBLE value: 'z'
 select * from t1 where 1 in (f2,f1);
 f1	f2
 1	0
diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result
index 8d56cf6f2d..b4a7aa5cb7 100644
--- a/mysql-test/r/multi_update.result
+++ b/mysql-test/r/multi_update.result
@@ -480,6 +480,7 @@ create table t1(a int);
 create table t2(a int);
 delete from t1,t2 using t1,t2 where t1.a=(select a from t1);
 ERROR HY000: You can't specify target table 't1' for update in FROM clause
+drop table t1, t2;
 create table t1 ( c char(8) not null ) engine=innodb;
 insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9');
 insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F');
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 1701af2325..cbf77507b8 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -63,6 +63,27 @@ static void agg_result_type(Item_result *type, Item **items, uint nitems)
 }
 
 
+/*
+  Aggregates result types from the array of items.
+
+  SYNOPSIS:
+    agg_cmp_type()
+    type   [out] the aggregated type
+    items        array of items to aggregate the type from
+    nitems       number of items in the array
+
+  DESCRIPTION
+    This function aggregates result types from the array of items. Found type
+    supposed to be used later for comparison of values of these items.
+    Aggregation itself is performed by the item_cmp_type() function.
+
+  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.
+*/
+
 static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
 {
   uint i;
@@ -89,6 +110,8 @@ static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
     }
     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]))
+      type[0]= INT_RESULT;
   }
 }
 
-- 
2.30.9