Commit 5d2f2cc1 authored by Olav Sandstaa's avatar Olav Sandstaa

Backporting of jorgen.loland@sun.com-20100618093212-lifp1psig3hbj6jj

from mysql-next-mr-opt-backporting.

Bug#54515: Crash in opt_range.cc::get_best_group_min_max on 
           SELECT from VIEW with GROUP BY
      
When handling the grouping items in get_best_group_min_max, the
items need to be of type Item_field. In this bug, an ASSERT 
triggered because the item used for grouping was an 
Item_direct_view_ref (i.e., the group column is from a view). 
The fix is to get the real_item since Item_ref* pointing to 
Item_field is ok.

mysql-test/r/select.result:
  Add test for BUG#54515
mysql-test/t/select.test:
  Add test for BUG#54515
sql/opt_range.cc:
  Get the real_item() when processing grouping items in 
  get_best_group_min_max.
parent 18bde950
...@@ -4857,3 +4857,22 @@ SELECT * FROM t1 WHERE 102 < c; ...@@ -4857,3 +4857,22 @@ SELECT * FROM t1 WHERE 102 < c;
a b c a b c
DROP TABLE t1; DROP TABLE t1;
End of 5.1 tests End of 5.1 tests
#
# Bug#54515: Crash in opt_range.cc::get_best_group_min_max on
# SELECT from VIEW with GROUP BY
#
CREATE TABLE t1 (
col_int_key int DEFAULT NULL,
KEY int_key (col_int_key)
) ;
INSERT INTO t1 VALUES (1),(2);
CREATE VIEW view_t1 AS
SELECT t1.col_int_key AS col_int_key
FROM t1;
SELECT col_int_key FROM view_t1 GROUP BY col_int_key;
col_int_key
1
2
DROP VIEW view_t1;
DROP TABLE t1;
# End of test BUG#54515
...@@ -4118,3 +4118,26 @@ DROP TABLE t1; ...@@ -4118,3 +4118,26 @@ DROP TABLE t1;
--echo End of 5.1 tests --echo End of 5.1 tests
--echo #
--echo # Bug#54515: Crash in opt_range.cc::get_best_group_min_max on
--echo # SELECT from VIEW with GROUP BY
--echo #
CREATE TABLE t1 (
col_int_key int DEFAULT NULL,
KEY int_key (col_int_key)
) ;
INSERT INTO t1 VALUES (1),(2);
CREATE VIEW view_t1 AS
SELECT t1.col_int_key AS col_int_key
FROM t1;
SELECT col_int_key FROM view_t1 GROUP BY col_int_key;
DROP VIEW view_t1;
DROP TABLE t1;
--echo # End of test BUG#54515
...@@ -9570,8 +9570,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree, double read_time) ...@@ -9570,8 +9570,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree, double read_time)
first Item? If so, then why? What is the array for? first Item? If so, then why? What is the array for?
*/ */
/* Above we already checked that all group items are fields. */ /* Above we already checked that all group items are fields. */
DBUG_ASSERT((*tmp_group->item)->type() == Item::FIELD_ITEM); DBUG_ASSERT((*tmp_group->item)->real_item()->type() == Item::FIELD_ITEM);
Item_field *group_field= (Item_field *) (*tmp_group->item); Item_field *group_field= (Item_field *) (*tmp_group->item)->real_item();
if (group_field->field->eq(cur_part->field)) if (group_field->field->eq(cur_part->field))
{ {
cur_group_prefix_len+= cur_part->store_length; cur_group_prefix_len+= cur_part->store_length;
......
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