Merge sanja.is.com.ua:/home/bell/mysql/bk/work-top3-4.1
into sanja.is.com.ua:/home/bell/mysql/bk/work-simple_in-4.1
This commit is contained in:
commit
acece34bce
@ -1270,3 +1270,15 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
2 DEPENDENT SUBQUERY t1 ref a a 5 func 10 Using where
|
2 DEPENDENT SUBQUERY t1 ref a a 5 func 10 Using where
|
||||||
2 DEPENDENT SUBQUERY t3 index a a 5 NULL 3 Using where; Using index
|
2 DEPENDENT SUBQUERY t3 index a a 5 NULL 3 Using where; Using index
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
create table t1 (a int, b int);
|
||||||
|
create table t2 (a int, b int);
|
||||||
|
create table t3 (a int, b int);
|
||||||
|
insert into t1 values (0,100),(1,2), (1,3), (2,2), (2,7), (2,-1), (3,10);
|
||||||
|
insert into t2 values (0,0), (1,1), (2,1), (3,1), (4,1);
|
||||||
|
insert into t3 values (3,3), (2,2), (1,1);
|
||||||
|
select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3;
|
||||||
|
a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1)
|
||||||
|
3 1
|
||||||
|
2 2
|
||||||
|
1 2
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
@ -844,3 +844,14 @@ explain select * from t2 where t2.a in (select a from t1);
|
|||||||
select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
||||||
explain select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
explain select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
#
|
||||||
|
# alloc_group_fields() working
|
||||||
|
#
|
||||||
|
create table t1 (a int, b int);
|
||||||
|
create table t2 (a int, b int);
|
||||||
|
create table t3 (a int, b int);
|
||||||
|
insert into t1 values (0,100),(1,2), (1,3), (2,2), (2,7), (2,-1), (3,10);
|
||||||
|
insert into t2 values (0,0), (1,1), (2,1), (3,1), (4,1);
|
||||||
|
insert into t3 values (3,3), (2,2), (1,1);
|
||||||
|
select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3;
|
||||||
|
drop table t1,t2,t3;s
|
||||||
|
@ -142,6 +142,7 @@ static ORDER *create_distinct_group(THD *thd, ORDER *order,
|
|||||||
static bool test_if_subpart(ORDER *a,ORDER *b);
|
static bool test_if_subpart(ORDER *a,ORDER *b);
|
||||||
static TABLE *get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables);
|
static TABLE *get_sort_by_table(ORDER *a,ORDER *b,TABLE_LIST *tables);
|
||||||
static void calc_group_buffer(JOIN *join,ORDER *group);
|
static void calc_group_buffer(JOIN *join,ORDER *group);
|
||||||
|
static bool make_group_fields(JOIN *main_join, JOIN *curr_join);
|
||||||
static bool alloc_group_fields(JOIN *join,ORDER *group);
|
static bool alloc_group_fields(JOIN *join,ORDER *group);
|
||||||
// Create list for using with tempory table
|
// Create list for using with tempory table
|
||||||
static bool change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
|
static bool change_to_use_tmp_fields(THD *thd, Item **ref_pointer_array,
|
||||||
@ -1175,12 +1176,12 @@ JOIN::exec()
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
curr_join->exec_tmp_table2= exec_tmp_table2;
|
curr_join->exec_tmp_table2= exec_tmp_table2;
|
||||||
}
|
}
|
||||||
if (group_list)
|
if (curr_join->group_list)
|
||||||
{
|
{
|
||||||
thd->proc_info= "Creating sort index";
|
thd->proc_info= "Creating sort index";
|
||||||
if (create_sort_index(thd, curr_join->join_tab, curr_join->group_list,
|
if (create_sort_index(thd, curr_join->join_tab, curr_join->group_list,
|
||||||
HA_POS_ERROR, HA_POS_ERROR) ||
|
HA_POS_ERROR, HA_POS_ERROR) ||
|
||||||
alloc_group_fields(curr_join, curr_join->group_list))
|
make_group_fields(this, curr_join))
|
||||||
{
|
{
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
@ -1189,6 +1190,20 @@ JOIN::exec()
|
|||||||
|
|
||||||
thd->proc_info="Copying to group table";
|
thd->proc_info="Copying to group table";
|
||||||
tmp_error= -1;
|
tmp_error= -1;
|
||||||
|
if (curr_join != this)
|
||||||
|
{
|
||||||
|
if (sum_funcs2)
|
||||||
|
{
|
||||||
|
curr_join->sum_funcs= sum_funcs2;
|
||||||
|
curr_join->sum_funcs_end= sum_funcs_end2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
curr_join->alloc_func_list();
|
||||||
|
sum_funcs2= curr_join->sum_funcs;
|
||||||
|
sum_funcs_end2= curr_join->sum_funcs_end;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
|
if (curr_join->make_sum_func_list(*curr_all_fields, *curr_fields_list,
|
||||||
1) ||
|
1) ||
|
||||||
(tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table,
|
(tmp_error= do_select(curr_join, (List<Item> *) 0, curr_tmp_table,
|
||||||
@ -1247,7 +1262,10 @@ JOIN::exec()
|
|||||||
if (curr_join->group || curr_join->tmp_table_param.sum_func_count ||
|
if (curr_join->group || curr_join->tmp_table_param.sum_func_count ||
|
||||||
(procedure && (procedure->flags & PROC_GROUP)))
|
(procedure && (procedure->flags & PROC_GROUP)))
|
||||||
{
|
{
|
||||||
alloc_group_fields(curr_join, curr_join->group_list);
|
if (make_group_fields(this, curr_join))
|
||||||
|
{
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
if (!items3)
|
if (!items3)
|
||||||
{
|
{
|
||||||
if (!items0)
|
if (!items0)
|
||||||
@ -7709,6 +7727,37 @@ calc_group_buffer(JOIN *join,ORDER *group)
|
|||||||
join->tmp_table_param.group_null_parts=null_parts;
|
join->tmp_table_param.group_null_parts=null_parts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
alloc group fields or take prepared (chached)
|
||||||
|
|
||||||
|
SYNOPSYS
|
||||||
|
make_group_fields()
|
||||||
|
main_join - join of current select
|
||||||
|
curr_join - current join (join of current select or temporary copy of it)
|
||||||
|
|
||||||
|
RETURN
|
||||||
|
0 - ok
|
||||||
|
1 - failed
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool
|
||||||
|
make_group_fields(JOIN *main_join, JOIN *curr_join)
|
||||||
|
{
|
||||||
|
if (main_join->group_fields_cache.elements)
|
||||||
|
{
|
||||||
|
curr_join->group_fields= main_join->group_fields_cache;
|
||||||
|
curr_join->sort_and_group= 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (alloc_group_fields(curr_join, curr_join->group_list))
|
||||||
|
{
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
main_join->group_fields_cache= curr_join->group_fields;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get a list of buffers for saveing last group
|
Get a list of buffers for saveing last group
|
||||||
@ -7735,6 +7784,7 @@ alloc_group_fields(JOIN *join,ORDER *group)
|
|||||||
static int
|
static int
|
||||||
test_if_group_changed(List<Item_buff> &list)
|
test_if_group_changed(List<Item_buff> &list)
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("test_if_group_changed");
|
||||||
List_iterator<Item_buff> li(list);
|
List_iterator<Item_buff> li(list);
|
||||||
int idx= -1,i;
|
int idx= -1,i;
|
||||||
Item_buff *buff;
|
Item_buff *buff;
|
||||||
@ -7744,7 +7794,8 @@ test_if_group_changed(List<Item_buff> &list)
|
|||||||
if (buff->cmp())
|
if (buff->cmp())
|
||||||
idx=i;
|
idx=i;
|
||||||
}
|
}
|
||||||
return idx;
|
DBUG_PRINT("info", ("idx: %d", idx));
|
||||||
|
DBUG_RETURN(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -141,12 +141,14 @@ class JOIN :public Sql_alloc
|
|||||||
POSITION positions[MAX_TABLES+1],best_positions[MAX_TABLES+1];
|
POSITION positions[MAX_TABLES+1],best_positions[MAX_TABLES+1];
|
||||||
double best_read;
|
double best_read;
|
||||||
List<Item> *fields;
|
List<Item> *fields;
|
||||||
List<Item_buff> group_fields;
|
List<Item_buff> group_fields, group_fields_cache;
|
||||||
TABLE *tmp_table;
|
TABLE *tmp_table;
|
||||||
// used to store 2 possible tmp table of SELECT
|
// used to store 2 possible tmp table of SELECT
|
||||||
TABLE *exec_tmp_table1, *exec_tmp_table2;
|
TABLE *exec_tmp_table1, *exec_tmp_table2;
|
||||||
THD *thd;
|
THD *thd;
|
||||||
Item_sum **sum_funcs, ***sum_funcs_end;
|
Item_sum **sum_funcs, ***sum_funcs_end;
|
||||||
|
/* second copy of sumfuncs (for queries with 2 temporary tables */
|
||||||
|
Item_sum **sum_funcs2, ***sum_funcs_end2;
|
||||||
Procedure *procedure;
|
Procedure *procedure;
|
||||||
Item *having;
|
Item *having;
|
||||||
Item *tmp_having; // To store Having when processed temporary table
|
Item *tmp_having; // To store Having when processed temporary table
|
||||||
@ -213,7 +215,7 @@ class JOIN :public Sql_alloc
|
|||||||
exec_tmp_table1= 0;
|
exec_tmp_table1= 0;
|
||||||
exec_tmp_table2= 0;
|
exec_tmp_table2= 0;
|
||||||
thd= thd_arg;
|
thd= thd_arg;
|
||||||
sum_funcs= 0;
|
sum_funcs= sum_funcs2= 0;
|
||||||
procedure= 0;
|
procedure= 0;
|
||||||
having= 0;
|
having= 0;
|
||||||
tmp_having= 0;
|
tmp_having= 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user