diff options
author | He Zhenxing <zhenxing.he@sun.com> | 2009-05-20 21:26:43 +0800 |
---|---|---|
committer | He Zhenxing <zhenxing.he@sun.com> | 2009-05-20 21:26:43 +0800 |
commit | 0130162452e57c677ef71d16b28794c9abb48043 (patch) | |
tree | a80ed7e676d55e61c59597607fcff3c4702314f4 | |
parent | 65d15fcd2a7cf1a0a9d508fc929ab1e8f6467da5 (diff) | |
parent | 54d36955b2109d638d630366d91d88f37961ca6c (diff) | |
download | mariadb-git-0130162452e57c677ef71d16b28794c9abb48043.tar.gz |
Auto merge
-rw-r--r-- | mysql-test/r/func_in.result | 5 | ||||
-rw-r--r-- | mysql-test/t/func_in.test | 10 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 28 |
3 files changed, 14 insertions, 29 deletions
diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result index b19edbd1a00..1e967b668c5 100644 --- a/mysql-test/r/func_in.result +++ b/mysql-test/r/func_in.result @@ -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)) NULL 1.0000 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 diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test index 795a92180db..3fc1697f146 100644 --- a/mysql-test/t/func_in.test +++ b/mysql-test/t/func_in.test @@ -439,14 +439,4 @@ SELECT CASE c1 WHEN c1 + 1 THEN 1 END, ABS(AVG(c0)) FROM 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 diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 5017464f968..a9bfea1b806 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -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++) |