Commit f68a9920 authored by Georgi Kodinov's avatar Georgi Kodinov

Revert of the fix for bug #44399 (joro@sun.com-20090512135917-kal1dvtqpqgnj3yc).

parent 984d0841
...@@ -587,9 +587,4 @@ SELECT CASE c1 WHEN c1 + 1 THEN 1 END, ABS(AVG(c0)) FROM t1; ...@@ -587,9 +587,4 @@ SELECT CASE c1 WHEN c1 + 1 THEN 1 END, ABS(AVG(c0)) FROM t1;
CASE c1 WHEN c1 + 1 THEN 1 END ABS(AVG(c0)) CASE c1 WHEN c1 + 1 THEN 1 END ABS(AVG(c0))
NULL 1.0000 NULL 1.0000
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1(a TEXT);
INSERT INTO t1 VALUES('iynfj');
SELECT SUM( DISTINCT a ) FROM t1 GROUP BY a HAVING a IN ( AVG( 1 ), 1 + a );
SUM( DISTINCT a )
DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
...@@ -439,14 +439,4 @@ SELECT CASE c1 WHEN c1 + 1 THEN 1 END, ABS(AVG(c0)) FROM t1; ...@@ -439,14 +439,4 @@ SELECT CASE c1 WHEN c1 + 1 THEN 1 END, ABS(AVG(c0)) FROM t1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #44399: crash with statement using TEXT columns, aggregates, GROUP BY,
# and HAVING
#
CREATE TABLE t1(a TEXT);
INSERT INTO t1 VALUES('iynfj');
SELECT SUM( DISTINCT a ) FROM t1 GROUP BY a HAVING a IN ( AVG( 1 ), 1 + a );
DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -189,7 +189,6 @@ enum_field_types agg_field_type(Item **items, uint nitems) ...@@ -189,7 +189,6 @@ enum_field_types agg_field_type(Item **items, uint nitems)
collect_cmp_types() collect_cmp_types()
items Array of items to collect types from items Array of items to collect types from
nitems Number of items in the array nitems Number of items in the array
with_sum_func a sum function is referenced
DESCRIPTION DESCRIPTION
This function collects different result types for comparison of the first 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) ...@@ -200,7 +199,7 @@ enum_field_types agg_field_type(Item **items, uint nitems)
Bitmap of collected types - otherwise 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 i;
uint found_types; uint found_types;
...@@ -216,16 +215,6 @@ static uint collect_cmp_types(Item **items, uint nitems, my_bool with_sum_func) ...@@ -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, found_types|= 1<< (uint)item_cmp_type(left_result,
items[i]->result_type()); 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; return found_types;
} }
...@@ -2733,8 +2722,19 @@ void Item_func_case::fix_length_and_dec() ...@@ -2733,8 +2722,19 @@ void Item_func_case::fix_length_and_dec()
for (nagg= 0; nagg < ncases/2 ; nagg++) for (nagg= 0; nagg < ncases/2 ; nagg++)
agg[nagg+1]= args[nagg*2]; agg[nagg+1]= args[nagg*2];
nagg++; nagg++;
if (!(found_types= collect_cmp_types(agg, nagg, with_sum_func))) if (!(found_types= collect_cmp_types(agg, nagg)))
return; 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++) for (i= 0; i <= (uint)DECIMAL_RESULT; i++)
{ {
if (found_types & (1 << i) && !cmp_items[i]) if (found_types & (1 << i) && !cmp_items[i])
...@@ -3525,7 +3525,7 @@ void Item_func_in::fix_length_and_dec() ...@@ -3525,7 +3525,7 @@ void Item_func_in::fix_length_and_dec()
uint type_cnt= 0, i; uint type_cnt= 0, i;
Item_result cmp_type= STRING_RESULT; Item_result cmp_type= STRING_RESULT;
left_result_type= args[0]->result_type(); 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; return;
for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++) for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++)
......
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