Loading mysql-test/r/group_min_max.result +10 −0 Original line number Diff line number Diff line Loading @@ -2002,3 +2002,13 @@ a count(a) 1 1 NULL 1 drop table t1; create table t1 (f1 int, f2 char(1), primary key(f1,f2)) engine=innodb; insert into t1 values ( 1,"e"),(2,"a"),( 3,"c"),(4,"d"); alter table t1 drop primary key, add primary key (f2, f1); explain select distinct f1 a, f1 b from t1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL PRIMARY 5 NULL 4 Using index; Using temporary explain select distinct f1, f2 from t1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range NULL PRIMARY 5 NULL 3 Using index for group-by; Using temporary drop table t1; mysql-test/t/group_min_max.test +10 −0 Original line number Diff line number Diff line Loading @@ -693,3 +693,13 @@ 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; drop table t1; # # Bug #13293 Wrongly used index results in endless loop. # create table t1 (f1 int, f2 char(1), primary key(f1,f2)) engine=innodb; insert into t1 values ( 1,"e"),(2,"a"),( 3,"c"),(4,"d"); alter table t1 drop primary key, add primary key (f2, f1); explain select distinct f1 a, f1 b from t1; explain select distinct f1, f2 from t1; drop table t1; sql/opt_range.cc +13 −0 Original line number Diff line number Diff line Loading @@ -7197,6 +7197,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree) { select_items_it.rewind(); cur_used_key_parts.clear_all(); uint max_key_part= 0; while ((item= select_items_it++)) { item_field= (Item_field*) item; /* (SA5) already checked above. */ Loading @@ -7214,7 +7215,19 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree) cur_group_prefix_len+= cur_part->store_length; cur_used_key_parts.set_bit(key_part_nr); ++cur_group_key_parts; max_key_part= max(max_key_part,key_part_nr); } /* Check that used key parts forms a prefix of the index. To check this we compare bits in all_parts and cur_parts. all_parts have all bits set from 0 to (max_key_part-1). cur_parts have bits set for only used keyparts. */ ulonglong all_parts, cur_parts; all_parts= (1<<max_key_part) - 1; cur_parts= cur_used_key_parts.to_ulonglong() >> 1; if (all_parts != cur_parts) goto next_index; } else DBUG_ASSERT(FALSE); Loading Loading
mysql-test/r/group_min_max.result +10 −0 Original line number Diff line number Diff line Loading @@ -2002,3 +2002,13 @@ a count(a) 1 1 NULL 1 drop table t1; create table t1 (f1 int, f2 char(1), primary key(f1,f2)) engine=innodb; insert into t1 values ( 1,"e"),(2,"a"),( 3,"c"),(4,"d"); alter table t1 drop primary key, add primary key (f2, f1); explain select distinct f1 a, f1 b from t1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL PRIMARY 5 NULL 4 Using index; Using temporary explain select distinct f1, f2 from t1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range NULL PRIMARY 5 NULL 3 Using index for group-by; Using temporary drop table t1;
mysql-test/t/group_min_max.test +10 −0 Original line number Diff line number Diff line Loading @@ -693,3 +693,13 @@ 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; drop table t1; # # Bug #13293 Wrongly used index results in endless loop. # create table t1 (f1 int, f2 char(1), primary key(f1,f2)) engine=innodb; insert into t1 values ( 1,"e"),(2,"a"),( 3,"c"),(4,"d"); alter table t1 drop primary key, add primary key (f2, f1); explain select distinct f1 a, f1 b from t1; explain select distinct f1, f2 from t1; drop table t1;
sql/opt_range.cc +13 −0 Original line number Diff line number Diff line Loading @@ -7197,6 +7197,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree) { select_items_it.rewind(); cur_used_key_parts.clear_all(); uint max_key_part= 0; while ((item= select_items_it++)) { item_field= (Item_field*) item; /* (SA5) already checked above. */ Loading @@ -7214,7 +7215,19 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree) cur_group_prefix_len+= cur_part->store_length; cur_used_key_parts.set_bit(key_part_nr); ++cur_group_key_parts; max_key_part= max(max_key_part,key_part_nr); } /* Check that used key parts forms a prefix of the index. To check this we compare bits in all_parts and cur_parts. all_parts have all bits set from 0 to (max_key_part-1). cur_parts have bits set for only used keyparts. */ ulonglong all_parts, cur_parts; all_parts= (1<<max_key_part) - 1; cur_parts= cur_used_key_parts.to_ulonglong() >> 1; if (all_parts != cur_parts) goto next_index; } else DBUG_ASSERT(FALSE); Loading