Commit 51e86278 authored by unknown's avatar unknown

Fix for bug #9798: Rollup crash with InnoDB in setup_sum_funcs().


sql/opt_range.cc:
  Fix for bug #9798: Rollup crash with InnoDB in setup_sum_funcs().
  Disable mix/max group by optimization for queries with rollup for now.
  Note: the actual bug was hidden; if this optimization works with rollup
  queries we will have to change some code:
  
  the problem is that we call the join->make_sum_func_list() function against 
  changed thd->mem_root (see SQL_SELECT::test_quick_select()) which creates some
  items for rollup, then we free that mem_root, then we try to reuse (free) those
  items.
parent 848611b5
...@@ -1961,3 +1961,10 @@ a varchar(30), b varchar(30), primary key(a), key(b) ...@@ -1961,3 +1961,10 @@ a varchar(30), b varchar(30), primary key(a), key(b)
select distinct a from t1; select distinct a from t1;
a a
drop table t1; drop table t1;
create table t1(a int, key(a)) engine=innodb;
insert into t1 values(1);
select a, count(a) from t1 group by a with rollup;
a count(a)
1 1
NULL 1
drop table t1;
...@@ -610,3 +610,14 @@ create table t1 ( ...@@ -610,3 +610,14 @@ create table t1 (
--enable_warnings --enable_warnings
select distinct a from t1; select distinct a from t1;
drop table t1; drop table t1;
#
# Bug #9798: group by with rollup
#
--disable_warnings
create table t1(a int, key(a)) engine=innodb;
--enable_warnings
insert into t1 values(1);
select a, count(a) from t1 group by a with rollup;
drop table t1;
...@@ -6670,6 +6670,8 @@ cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts, ...@@ -6670,6 +6670,8 @@ cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts,
- NGA = QA - (GA union C) = {NG_1, ..., NG_m} - the ones not in - NGA = QA - (GA union C) = {NG_1, ..., NG_m} - the ones not in
GROUP BY and not referenced by MIN/MAX functions. GROUP BY and not referenced by MIN/MAX functions.
with the following properties specified below. with the following properties specified below.
B3. If Q has a GROUP BY WITH ROLLUP clause the access method is not
applicable.
SA1. There is at most one attribute in SA referenced by any number of SA1. There is at most one attribute in SA referenced by any number of
MIN and/or MAX functions which, which if present, is denoted as C. MIN and/or MAX functions which, which if present, is denoted as C.
...@@ -6754,6 +6756,8 @@ cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts, ...@@ -6754,6 +6756,8 @@ cost_group_min_max(TABLE* table, KEY *index_info, uint used_key_parts,
other field as in: "select min(a) from t1 group by a" ? other field as in: "select min(a) from t1 group by a" ?
- We assume that the general correctness of the GROUP-BY query was checked - We assume that the general correctness of the GROUP-BY query was checked
before this point. Is this correct, or do we have to check it completely? before this point. Is this correct, or do we have to check it completely?
- Lift the limitation in condition (B3), that is, make this access method
applicable to ROLLUP queries.
RETURN RETURN
If mem_root != NULL If mem_root != NULL
...@@ -6793,7 +6797,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree) ...@@ -6793,7 +6797,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
DBUG_RETURN(NULL); /* This is not a select statement. */ DBUG_RETURN(NULL); /* This is not a select statement. */
if ((join->tables != 1) || /* The query must reference one table. */ if ((join->tables != 1) || /* The query must reference one table. */
((!join->group_list) && /* Neither GROUP BY nor a DISTINCT query. */ ((!join->group_list) && /* Neither GROUP BY nor a DISTINCT query. */
(!join->select_distinct))) (!join->select_distinct)) ||
(thd->lex->select_lex.olap == ROLLUP_TYPE)) /* Check (B3) for ROLLUP */
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
if (table->s->keys == 0) /* There are no indexes to use. */ if (table->s->keys == 0) /* There are no indexes to use. */
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
......
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