diff --git a/mysql-test/r/bugfix_const_access_disk_temporary_table.result b/mysql-test/r/bugfix_const_access_disk_temporary_table.result new file mode 100644 index 00000000000..76f342a8774 --- /dev/null +++ b/mysql-test/r/bugfix_const_access_disk_temporary_table.result @@ -0,0 +1,54 @@ +CREATE TABLE t1 ( +id int PRIMARY KEY, +col1 varchar(32), +key index_col1(col1) +); +CREATE TABLE t2 ( +id int PRIMARY KEY, +col1 varchar(32) +); +CREATE PROCEDURE insert_data() +BEGIN +DECLARE num int; +SET num = 1; +WHILE num < 100 DO +INSERT INTO t1 +VALUES (num, md5(num)); +INSERT INTO t2 +VALUES (num, md5(num)); +SET num = num + 1; +END WHILE; +END;// +CALL insert_data(); +SET internal_tmp_mem_storage_engine = 'MEMORY'; +SET @old_tmp_table_size=@@tmp_table_size; +SET tmp_table_size=102400; +SELECT count(DISTINCT d.col1) +FROM ( +SELECT t1.col1 +FROM t1 +UNION +SELECT t1.col1 +FROM t1 +) d +JOIN t2 ON d.col1 = t2.col1 +WHERE t2.id = 1; +count(DISTINCT d.col1) +1 +SET tmp_table_size=1024; +SELECT count(DISTINCT d.col1) +FROM ( +SELECT t1.col1 +FROM t1 +UNION +SELECT t1.col1 +FROM t1 +) d +JOIN t2 ON d.col1 = t2.col1 +WHERE t2.id = 1; +count(DISTINCT d.col1) +1 +SET tmp_table_size=@old_tmp_table_size; +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE insert_data; diff --git a/mysql-test/t/bugfix_const_access_disk_temporary_table.test b/mysql-test/t/bugfix_const_access_disk_temporary_table.test new file mode 100644 index 00000000000..cd450d7fff0 --- /dev/null +++ b/mysql-test/t/bugfix_const_access_disk_temporary_table.test @@ -0,0 +1,60 @@ +CREATE TABLE t1 ( + id int PRIMARY KEY, + col1 varchar(32), + key index_col1(col1) +); + +CREATE TABLE t2 ( + id int PRIMARY KEY, + col1 varchar(32) +); + +delimiter //; +CREATE PROCEDURE insert_data() +BEGIN + DECLARE num int; + SET num = 1; + WHILE num < 100 DO + INSERT INTO t1 + VALUES (num, md5(num)); + INSERT INTO t2 + VALUES (num, md5(num)); + SET num = num + 1; + END WHILE; +END;// +delimiter ;// + +CALL insert_data(); + +SET internal_tmp_mem_storage_engine = 'MEMORY'; +SET @old_tmp_table_size=@@tmp_table_size; +SET tmp_table_size=102400; + +SELECT count(DISTINCT d.col1) +FROM ( + SELECT t1.col1 + FROM t1 + UNION + SELECT t1.col1 + FROM t1 +) d + JOIN t2 ON d.col1 = t2.col1 +WHERE t2.id = 1; + +SET tmp_table_size=1024; + +SELECT count(DISTINCT d.col1) +FROM ( + SELECT t1.col1 + FROM t1 + UNION + SELECT t1.col1 + FROM t1 +) d + JOIN t2 ON d.col1 = t2.col1 +WHERE t2.id = 1; + +SET tmp_table_size=@old_tmp_table_size; +DROP TABLE t1; +DROP TABLE t2; +DROP PROCEDURE insert_data; diff --git a/sql/sql_tmp_table.cc b/sql/sql_tmp_table.cc index caa9fecadb6..32596ba0439 100644 --- a/sql/sql_tmp_table.cc +++ b/sql/sql_tmp_table.cc @@ -2858,6 +2858,13 @@ bool create_ondisk_from_heap(THD *thd, TABLE *wtable, int error, thd_proc_info(thd, (!strcmp(save_proc_info, "Copying to tmp table") ? "Copying to tmp table on disk" : save_proc_info)); + + /* + Reading data from an in memory table will change the wtable's + STATUS_NOT_STARTED status, so need to reset it back here. + */ + wtable->set_not_started(); + return false; err_after_open: