|  |  | @ -189,7 +189,6 @@ enum_field_types agg_field_type(Item **items, uint nitems) | 
			
		
	
		
			
				
					|  |  |  |     collect_cmp_types() | 
			
		
	
		
			
				
					|  |  |  |       items             Array of items to collect types from | 
			
		
	
		
			
				
					|  |  |  |       nitems            Number of items in the array | 
			
		
	
		
			
				
					|  |  |  |       with_sum_func     a sum function is referenced | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |   DESCRIPTION | 
			
		
	
		
			
				
					|  |  |  |     This function collects different result types for comparison of the first | 
			
		
	
	
		
			
				
					|  |  | @ -200,7 +199,7 @@ enum_field_types agg_field_type(Item **items, uint nitems) | 
			
		
	
		
			
				
					|  |  |  |     Bitmap of collected types - otherwise | 
			
		
	
		
			
				
					|  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | static uint collect_cmp_types(Item **items, uint nitems, my_bool with_sum_func) | 
			
		
	
		
			
				
					|  |  |  | static uint collect_cmp_types(Item **items, uint nitems) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |   uint i; | 
			
		
	
		
			
				
					|  |  |  |   uint found_types; | 
			
		
	
	
		
			
				
					|  |  | @ -216,16 +215,6 @@ static uint collect_cmp_types(Item **items, uint nitems, my_bool with_sum_func) | 
			
		
	
		
			
				
					|  |  |  |     found_types|= 1<< (uint)item_cmp_type(left_result, | 
			
		
	
		
			
				
					|  |  |  |                                            items[i]->result_type()); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |   if (with_sum_func || current_thd->lex->current_select->group_list.elements) | 
			
		
	
		
			
				
					|  |  |  |   { | 
			
		
	
		
			
				
					|  |  |  |     /*
 | 
			
		
	
		
			
				
					|  |  |  |       See TODO commentary in the setup_copy_fields function: | 
			
		
	
		
			
				
					|  |  |  |       item in a group may be wrapped with an Item_copy_string item. | 
			
		
	
		
			
				
					|  |  |  |       That item has a STRING_RESULT result type, so we need | 
			
		
	
		
			
				
					|  |  |  |       to take this type into account. | 
			
		
	
		
			
				
					|  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |     found_types |= (1 << item_cmp_type(left_result, STRING_RESULT)); | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |   return found_types; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -2733,8 +2722,19 @@ void Item_func_case::fix_length_and_dec() | 
			
		
	
		
			
				
					|  |  |  |     for (nagg= 0; nagg < ncases/2 ; nagg++) | 
			
		
	
		
			
				
					|  |  |  |       agg[nagg+1]= args[nagg*2]; | 
			
		
	
		
			
				
					|  |  |  |     nagg++; | 
			
		
	
		
			
				
					|  |  |  |     if (!(found_types= collect_cmp_types(agg, nagg, with_sum_func))) | 
			
		
	
		
			
				
					|  |  |  |     if (!(found_types= collect_cmp_types(agg, nagg))) | 
			
		
	
		
			
				
					|  |  |  |       return; | 
			
		
	
		
			
				
					|  |  |  |     if (with_sum_func || current_thd->lex->current_select->group_list.elements) | 
			
		
	
		
			
				
					|  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |       /*
 | 
			
		
	
		
			
				
					|  |  |  |         See TODO commentary in the setup_copy_fields function: | 
			
		
	
		
			
				
					|  |  |  |         item in a group may be wrapped with an Item_copy_string item. | 
			
		
	
		
			
				
					|  |  |  |         That item has a STRING_RESULT result type, so we need | 
			
		
	
		
			
				
					|  |  |  |         to take this type into account. | 
			
		
	
		
			
				
					|  |  |  |       */ | 
			
		
	
		
			
				
					|  |  |  |       found_types |= (1 << item_cmp_type(left_result_type, STRING_RESULT)); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     for (i= 0; i <= (uint)DECIMAL_RESULT; i++) | 
			
		
	
		
			
				
					|  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |       if (found_types & (1 << i) && !cmp_items[i]) | 
			
		
	
	
		
			
				
					|  |  | @ -3525,7 +3525,7 @@ void Item_func_in::fix_length_and_dec() | 
			
		
	
		
			
				
					|  |  |  |   uint type_cnt= 0, i; | 
			
		
	
		
			
				
					|  |  |  |   Item_result cmp_type= STRING_RESULT; | 
			
		
	
		
			
				
					|  |  |  |   left_result_type= args[0]->result_type(); | 
			
		
	
		
			
				
					|  |  |  |   if (!(found_types= collect_cmp_types(args, arg_count, with_sum_func))) | 
			
		
	
		
			
				
					|  |  |  |   if (!(found_types= collect_cmp_types(args, arg_count))) | 
			
		
	
		
			
				
					|  |  |  |     return; | 
			
		
	
		
			
				
					|  |  |  |    | 
			
		
	
		
			
				
					|  |  |  |   for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++) | 
			
		
	
	
		
			
				
					|  |  | 
 |