MDEV-14592: Custom Aggregates Usage Status Variable
Introduced new status variable for custom aggregate functions.
This commit is contained in:
parent
87ee85634c
commit
cbc45d2914
94
mysql-test/main/custom_aggregates_i_s.result
Normal file
94
mysql-test/main/custom_aggregates_i_s.result
Normal file
@ -0,0 +1,94 @@
|
||||
flush status;
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 0
|
||||
create table t2 (sal int(10));
|
||||
create table t3 (sal int(10),id int);
|
||||
insert into t3 values (0,1),(1,2),(2,3),(3,4);
|
||||
create aggregate function f1(x INT) returns int
|
||||
begin
|
||||
declare tot_sum int default 0;
|
||||
declare continue handler for not found return tot_sum;
|
||||
loop
|
||||
fetch group next row;
|
||||
set tot_sum= tot_sum + x;
|
||||
end loop;
|
||||
end|
|
||||
create aggregate function f2 (x int) returns int
|
||||
begin
|
||||
declare counter int default 0;
|
||||
declare continue handler for not found return 0;
|
||||
loop
|
||||
fetch group next row;
|
||||
set counter =counter + (select f1(sal) from t1);
|
||||
end loop;
|
||||
end|
|
||||
create table t1 (sal int(10),id int(10));
|
||||
INSERT INTO t1 (sal,id) VALUES (5000,1);
|
||||
INSERT INTO t1 (sal,id) VALUES (2000,2);
|
||||
INSERT INTO t1 (sal,id) VALUES (1000,3);
|
||||
Normal select with custom aggregate function
|
||||
select f1(sal) from t1 where id>= 1;
|
||||
f1(sal)
|
||||
8000
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 1
|
||||
subqueries with custom aggregates
|
||||
explain
|
||||
select * from t1, (select f1(sal) as a from t1 where id>= 1) q where q.a=t1.sal;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
1 PRIMARY <derived2> ref key0 key0 5 test.t1.sal 2
|
||||
2 DERIVED t1 ALL NULL NULL NULL NULL 3 Using where
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 2
|
||||
explain
|
||||
select * from t1, (select sal as a from t1 where (select f1(t3.sal) from t3) >=-1 ) q where q.a=t1.sal;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Using where; Using join buffer (flat, BNL join)
|
||||
3 SUBQUERY t3 ALL NULL NULL NULL NULL 4
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 3
|
||||
explain
|
||||
select (select f1(sal) as a from t3 where t3.id= t1.id ) from t1 ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
2 DEPENDENT SUBQUERY t3 ALL NULL NULL NULL NULL 4 Using where
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 4
|
||||
explain
|
||||
select (select f1(sal) as a from t3 where t3.id= t1.id ) from t1 ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
||||
2 DEPENDENT SUBQUERY t3 ALL NULL NULL NULL NULL 4 Using where
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 5
|
||||
custom aggregates inside other customm aggregates
|
||||
explain
|
||||
select f2(sal) from t1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 3
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 6
|
||||
cte with custom aggregates
|
||||
with agg_sum as (
|
||||
select f1(sal) from t1 where t1.id >=1 group by t1.id
|
||||
)
|
||||
select * from agg_sum;
|
||||
f1(sal)
|
||||
5000
|
||||
2000
|
||||
1000
|
||||
show status like "%custom_aggregate%";
|
||||
Variable_name Value
|
||||
Feature_custom_aggregate_functions 7
|
||||
drop table t2,t1,t3;
|
||||
drop function f1;
|
||||
drop function f2;
|
73
mysql-test/main/custom_aggregates_i_s.test
Normal file
73
mysql-test/main/custom_aggregates_i_s.test
Normal file
@ -0,0 +1,73 @@
|
||||
flush status;
|
||||
show status like "%custom_aggregate%";
|
||||
create table t2 (sal int(10));
|
||||
create table t3 (sal int(10),id int);
|
||||
insert into t3 values (0,1),(1,2),(2,3),(3,4);
|
||||
delimiter |;
|
||||
|
||||
create aggregate function f1(x INT) returns int
|
||||
begin
|
||||
declare tot_sum int default 0;
|
||||
declare continue handler for not found return tot_sum;
|
||||
loop
|
||||
fetch group next row;
|
||||
set tot_sum= tot_sum + x;
|
||||
end loop;
|
||||
end|
|
||||
|
||||
create aggregate function f2 (x int) returns int
|
||||
begin
|
||||
declare counter int default 0;
|
||||
declare continue handler for not found return 0;
|
||||
loop
|
||||
fetch group next row;
|
||||
set counter =counter + (select f1(sal) from t1);
|
||||
end loop;
|
||||
end|
|
||||
|
||||
delimiter ;|
|
||||
|
||||
create table t1 (sal int(10),id int(10));
|
||||
INSERT INTO t1 (sal,id) VALUES (5000,1);
|
||||
INSERT INTO t1 (sal,id) VALUES (2000,2);
|
||||
INSERT INTO t1 (sal,id) VALUES (1000,3);
|
||||
|
||||
--echo Normal select with custom aggregate function
|
||||
select f1(sal) from t1 where id>= 1;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
|
||||
--echo subqueries with custom aggregates
|
||||
explain
|
||||
select * from t1, (select f1(sal) as a from t1 where id>= 1) q where q.a=t1.sal;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
explain
|
||||
select * from t1, (select sal as a from t1 where (select f1(t3.sal) from t3) >=-1 ) q where q.a=t1.sal;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
explain
|
||||
select (select f1(sal) as a from t3 where t3.id= t1.id ) from t1 ;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
explain
|
||||
select (select f1(sal) as a from t3 where t3.id= t1.id ) from t1 ;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
--echo custom aggregates inside other customm aggregates
|
||||
|
||||
explain
|
||||
select f2(sal) from t1;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
--echo cte with custom aggregates
|
||||
|
||||
with agg_sum as (
|
||||
select f1(sal) from t1 where t1.id >=1 group by t1.id
|
||||
)
|
||||
select * from agg_sum;
|
||||
show status like "%custom_aggregate%";
|
||||
|
||||
drop table t2,t1,t3;
|
||||
drop function f1;
|
||||
drop function f2;
|
@ -4,6 +4,7 @@ flush status;
|
||||
show status like "feature%";
|
||||
Variable_name Value
|
||||
Feature_check_constraint 0
|
||||
Feature_custom_aggregate_functions 0
|
||||
Feature_delay_key_write 0
|
||||
Feature_dynamic_columns 0
|
||||
Feature_fulltext 0
|
||||
|
@ -313,6 +313,8 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
|
||||
}
|
||||
}
|
||||
aggr_sel->set_agg_func_used(true);
|
||||
if (sum_func() == SP_AGGREGATE_FUNC)
|
||||
aggr_sel->set_custom_agg_func_used(true);
|
||||
update_used_tables();
|
||||
thd->lex->in_sum_func= in_sum_func;
|
||||
return FALSE;
|
||||
|
@ -8527,6 +8527,7 @@ SHOW_VAR status_vars[]= {
|
||||
{"Executed_events", (char*) &executed_events, SHOW_LONG_NOFLUSH },
|
||||
{"Executed_triggers", (char*) offsetof(STATUS_VAR, executed_triggers), SHOW_LONG_STATUS},
|
||||
{"Feature_check_constraint", (char*) &feature_check_constraint, SHOW_LONG },
|
||||
{"Feature_custom_aggregate_functions", (char*) offsetof(STATUS_VAR, feature_custom_aggregate_functions), SHOW_LONG_STATUS},
|
||||
{"Feature_delay_key_write", (char*) &feature_files_opened_with_delayed_keys, SHOW_LONG },
|
||||
{"Feature_dynamic_columns", (char*) offsetof(STATUS_VAR, feature_dynamic_columns), SHOW_LONG_STATUS},
|
||||
{"Feature_fulltext", (char*) offsetof(STATUS_VAR, feature_fulltext), SHOW_LONG_STATUS},
|
||||
|
@ -814,6 +814,8 @@ typedef struct system_status_var
|
||||
ulong filesort_pq_sorts_;
|
||||
|
||||
/* Features used */
|
||||
ulong feature_custom_aggregate_functions; /* +1 when custom aggregate
|
||||
functions are used */
|
||||
ulong feature_dynamic_columns; /* +1 when creating a dynamic column */
|
||||
ulong feature_fulltext; /* +1 when MATCH is used */
|
||||
ulong feature_gis; /* +1 opening a table with GIS features */
|
||||
|
@ -2266,6 +2266,7 @@ void st_select_lex::init_query()
|
||||
select_list_tables= 0;
|
||||
m_non_agg_field_used= false;
|
||||
m_agg_func_used= false;
|
||||
m_custom_agg_func_used= false;
|
||||
window_specs.empty();
|
||||
window_funcs.empty();
|
||||
tvc= 0;
|
||||
@ -2305,6 +2306,7 @@ void st_select_lex::init_select()
|
||||
merged_into= 0;
|
||||
m_non_agg_field_used= false;
|
||||
m_agg_func_used= false;
|
||||
m_custom_agg_func_used= false;
|
||||
name_visibility_map= 0;
|
||||
with_dep= 0;
|
||||
join= 0;
|
||||
|
@ -1221,9 +1221,11 @@ public:
|
||||
*/
|
||||
bool non_agg_field_used() const { return m_non_agg_field_used; }
|
||||
bool agg_func_used() const { return m_agg_func_used; }
|
||||
bool custom_agg_func_used() const { return m_custom_agg_func_used; }
|
||||
|
||||
void set_non_agg_field_used(bool val) { m_non_agg_field_used= val; }
|
||||
void set_agg_func_used(bool val) { m_agg_func_used= val; }
|
||||
void set_custom_agg_func_used(bool val) { m_custom_agg_func_used= val; }
|
||||
inline void set_with_clause(With_clause *with_clause);
|
||||
With_clause *get_with_clause()
|
||||
{
|
||||
@ -1267,6 +1269,7 @@ public:
|
||||
private:
|
||||
bool m_non_agg_field_used;
|
||||
bool m_agg_func_used;
|
||||
bool m_custom_agg_func_used;
|
||||
|
||||
/* current index hint kind. used in filling up index_hints */
|
||||
enum index_hint_type current_index_hint_type;
|
||||
|
@ -3255,6 +3255,8 @@ bool JOIN::make_aggr_tables_info()
|
||||
/* Count that we're using window functions. */
|
||||
status_var_increment(thd->status_var.feature_window_functions);
|
||||
}
|
||||
if (select_lex->custom_agg_func_used())
|
||||
status_var_increment(thd->status_var.feature_custom_aggregate_functions);
|
||||
|
||||
fields= curr_fields_list;
|
||||
// Reset before execution
|
||||
|
Loading…
x
Reference in New Issue
Block a user