MDEV-7586: Merged derived tables/VIEWs increment created_tmp_tables
Temporary table count fix. The number of temporary tables was increased when the table is not actually created. (when do_not_open was passed as TRUE to create_tmp_table).
This commit is contained in:
parent
5c66abf0b0
commit
ec4ff9a2e7
83
mysql-test/r/tmp_table_count-7586.result
Normal file
83
mysql-test/r/tmp_table_count-7586.result
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(2),(3);
|
||||||
|
create view v2 as select a from t2;
|
||||||
|
flush status;
|
||||||
|
select * from v2;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
Variable_name Value
|
||||||
|
Created_tmp_disk_tables 0
|
||||||
|
Created_tmp_files 0
|
||||||
|
Created_tmp_tables 0
|
||||||
|
explain select * from v2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 3
|
||||||
|
select * from (select * from t2) T1;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
Variable_name Value
|
||||||
|
Created_tmp_disk_tables 0
|
||||||
|
Created_tmp_files 0
|
||||||
|
Created_tmp_tables 0
|
||||||
|
explain select * from (select * from t2) T1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 3
|
||||||
|
drop view v2;
|
||||||
|
drop table t2;
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
INSERT INTO t1 values(1),(2);
|
||||||
|
CREATE TABLE t2(a int);
|
||||||
|
INSERT INTO t2 values(1),(2);
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a HAVING a > 1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 test.t1.a 1
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 2 Using temporary
|
||||||
|
truncate table performance_schema.events_statements_history_long;
|
||||||
|
flush status;
|
||||||
|
CREATE TABLE t3 SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a HAVING a > 1);
|
||||||
|
# Performance schema should be the same as "Created_tmp_tables" variable below
|
||||||
|
select sum(created_tmp_tables) from performance_schema.events_statements_history_long;
|
||||||
|
sum(created_tmp_tables)
|
||||||
|
2
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
Variable_name Value
|
||||||
|
Created_tmp_disk_tables 0
|
||||||
|
Created_tmp_files 0
|
||||||
|
Created_tmp_tables 2
|
||||||
|
drop table t3;
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 2
|
||||||
|
truncate table performance_schema.events_statements_history_long;
|
||||||
|
flush status;
|
||||||
|
CREATE TABLE t3 SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a);
|
||||||
|
# Performance schema should be the same as "Created_tmp_tables" variable below
|
||||||
|
select sum(created_tmp_tables) from performance_schema.events_statements_history_long;
|
||||||
|
sum(created_tmp_tables)
|
||||||
|
1
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
Variable_name Value
|
||||||
|
Created_tmp_disk_tables 0
|
||||||
|
Created_tmp_files 0
|
||||||
|
Created_tmp_tables 1
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
truncate table performance_schema.events_statements_history_long;
|
||||||
|
flush status;
|
||||||
|
# Performance schema should be the same as "Created_tmp_tables" variable below
|
||||||
|
select sum(created_tmp_tables) from performance_schema.events_statements_history_long;
|
||||||
|
sum(created_tmp_tables)
|
||||||
|
0
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
Variable_name Value
|
||||||
|
Created_tmp_disk_tables 0
|
||||||
|
Created_tmp_files 0
|
||||||
|
Created_tmp_tables 0
|
53
mysql-test/t/tmp_table_count-7586.test
Normal file
53
mysql-test/t/tmp_table_count-7586.test
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# MDEV-7586 regression test.
|
||||||
|
# Test if created_tmp_tables status variable is correctly incremented.
|
||||||
|
--source include/have_perfschema.inc
|
||||||
|
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(2),(3);
|
||||||
|
create view v2 as select a from t2;
|
||||||
|
|
||||||
|
flush status;
|
||||||
|
select * from v2;
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
|
||||||
|
explain select * from v2;
|
||||||
|
|
||||||
|
select * from (select * from t2) T1;
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
|
||||||
|
explain select * from (select * from t2) T1;
|
||||||
|
|
||||||
|
|
||||||
|
drop view v2;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE t1(a int);
|
||||||
|
INSERT INTO t1 values(1),(2);
|
||||||
|
CREATE TABLE t2(a int);
|
||||||
|
INSERT INTO t2 values(1),(2);
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a HAVING a > 1);
|
||||||
|
truncate table performance_schema.events_statements_history_long;
|
||||||
|
flush status;
|
||||||
|
CREATE TABLE t3 SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a HAVING a > 1);
|
||||||
|
--echo # Performance schema should be the same as "Created_tmp_tables" variable below
|
||||||
|
select sum(created_tmp_tables) from performance_schema.events_statements_history_long;
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
drop table t3;
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a);
|
||||||
|
truncate table performance_schema.events_statements_history_long;
|
||||||
|
flush status;
|
||||||
|
CREATE TABLE t3 SELECT * FROM t1 WHERE a IN (SELECT * FROM t2 GROUP BY a);
|
||||||
|
--echo # Performance schema should be the same as "Created_tmp_tables" variable below
|
||||||
|
select sum(created_tmp_tables) from performance_schema.events_statements_history_long;
|
||||||
|
show status like '%Created_tmp%';
|
||||||
|
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
|
||||||
|
truncate table performance_schema.events_statements_history_long;
|
||||||
|
flush status;
|
||||||
|
--echo # Performance schema should be the same as "Created_tmp_tables" variable below
|
||||||
|
select sum(created_tmp_tables) from performance_schema.events_statements_history_long;
|
||||||
|
show status like '%Created_tmp%';
|
@ -3890,7 +3890,6 @@ SJ_TMP_TABLE::create_sj_weedout_tmp_table(THD *thd)
|
|||||||
/*
|
/*
|
||||||
STEP 1: Get temporary table name
|
STEP 1: Get temporary table name
|
||||||
*/
|
*/
|
||||||
thd->inc_status_created_tmp_tables();
|
|
||||||
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
|
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
|
||||||
temp_pool_slot = bitmap_lock_set_next(&temp_pool);
|
temp_pool_slot = bitmap_lock_set_next(&temp_pool);
|
||||||
|
|
||||||
|
@ -15809,7 +15809,6 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields,
|
|||||||
(int) distinct, (int) save_sum_fields,
|
(int) distinct, (int) save_sum_fields,
|
||||||
(ulong) rows_limit, MY_TEST(group)));
|
(ulong) rows_limit, MY_TEST(group)));
|
||||||
|
|
||||||
thd->inc_status_created_tmp_tables();
|
|
||||||
thd->query_plan_flags|= QPLAN_TMP_TABLE;
|
thd->query_plan_flags|= QPLAN_TMP_TABLE;
|
||||||
|
|
||||||
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
|
if (use_temp_pool && !(test_flags & TEST_KEEP_TMP_TABLES))
|
||||||
@ -16763,14 +16762,19 @@ bool open_tmp_table(TABLE *table)
|
|||||||
HA_OPEN_TMP_TABLE |
|
HA_OPEN_TMP_TABLE |
|
||||||
HA_OPEN_INTERNAL_TABLE)))
|
HA_OPEN_INTERNAL_TABLE)))
|
||||||
{
|
{
|
||||||
table->file->print_error(error,MYF(0)); /* purecov: inspected */
|
table->file->print_error(error, MYF(0)); /* purecov: inspected */
|
||||||
table->db_stat=0;
|
table->db_stat= 0;
|
||||||
return(1);
|
return 1;
|
||||||
}
|
}
|
||||||
table->db_stat= HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
|
table->db_stat= HA_OPEN_KEYFILE+HA_OPEN_RNDFILE;
|
||||||
(void) table->file->extra(HA_EXTRA_QUICK); /* Faster */
|
(void) table->file->extra(HA_EXTRA_QUICK); /* Faster */
|
||||||
table->created= TRUE;
|
if (!table->created)
|
||||||
return(0);
|
{
|
||||||
|
table->created= TRUE;
|
||||||
|
table->in_use->inc_status_created_tmp_tables();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -16937,8 +16941,10 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
table->in_use->inc_status_created_tmp_disk_tables();
|
table->in_use->inc_status_created_tmp_disk_tables();
|
||||||
|
table->in_use->inc_status_created_tmp_tables();
|
||||||
table->in_use->query_plan_flags|= QPLAN_TMP_DISK;
|
table->in_use->query_plan_flags|= QPLAN_TMP_DISK;
|
||||||
share->db_record_offset= 1;
|
share->db_record_offset= 1;
|
||||||
|
table->created= TRUE;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
err:
|
err:
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -17083,6 +17089,7 @@ bool create_internal_tmp_table(TABLE *table, KEY *keyinfo,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
table->in_use->inc_status_created_tmp_disk_tables();
|
table->in_use->inc_status_created_tmp_disk_tables();
|
||||||
|
table->in_use->inc_status_created_tmp_tables();
|
||||||
table->in_use->query_plan_flags|= QPLAN_TMP_DISK;
|
table->in_use->query_plan_flags|= QPLAN_TMP_DISK;
|
||||||
share->db_record_offset= 1;
|
share->db_record_offset= 1;
|
||||||
table->created= TRUE;
|
table->created= TRUE;
|
||||||
|
@ -1788,10 +1788,6 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
|
|||||||
bool table_cant_handle_bit_fields,
|
bool table_cant_handle_bit_fields,
|
||||||
bool make_copy_field,
|
bool make_copy_field,
|
||||||
uint convert_blob_length);
|
uint convert_blob_length);
|
||||||
bool create_internal_tmp_table(TABLE *table, KEY *keyinfo,
|
|
||||||
TMP_ENGINE_COLUMNDEF *start_recinfo,
|
|
||||||
TMP_ENGINE_COLUMNDEF **recinfo,
|
|
||||||
ulonglong options, my_bool big_tables);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
General routine to change field->ptr of a NULL-terminated array of Field
|
General routine to change field->ptr of a NULL-terminated array of Field
|
||||||
|
Loading…
x
Reference in New Issue
Block a user