Description:
If a query with UNION uses memory tmp_table bigger than tmp_table_size, it may get a wrong result. It is worth mentioning:
1. using UNION ALL instead of UNION can get true result.
2. setting tmp_table_size to a properly big value can get true result.
How to repeat:
wrong_result_with_union_and_small_memory_tmp_table.test
```
--disable_query_log
--disable_result_log
# 1. prepare
drop table if exists t1;
create table t1(id varchar(50));
# 2. create PROCEDURE
delimiter $$;
drop PROCEDURE if exists bulk_insert1;
CREATE PROCEDURE bulk_insert1(IN count INTEGER)
BEGIN
declare i int default 1;
declare s1 varchar(50);
declare s2 varchar(50);
declare s3 varchar(50);
declare s4 varchar(50);
declare s5 varchar(50);
declare str varchar(50);
START TRANSACTION;
while i<=count DO
set s1 = substring(md5(rand()),1,10);
set s2 = substring(md5(rand()),1,4);
set s3 = substring(md5(rand()),1,4);
set s4 = substring(md5(rand()),1,4);
set s5 = substring(md5(rand()),1,10);
set str = concat(s1,'-',s2,'-',s3,'-',s4,'-',s5);
insert into t1(id)values(str);
set i=i+1;
end while;
COMMIT;
END$$
delimiter ;$$
# 3. insert data
insert into t1(id)values('1234567890-1234-1234-1234567890');
call bulk_insert1(11999);
--enable_query_log
--enable_result_log
# 4. test with tmp_table_size=2*1024*1024
set session internal_tmp_mem_storage_engine='memory';
set session tmp_table_size=2097152; # 2*1024*1024
select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890';
select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890';
select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890';
# 5. test with tmp_table_size=16*1024*1024
set session tmp_table_size=16777216; # 16*1024*1024
select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890';
select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890';
select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890';
--disable_query_log
--disable_result_log
# 6. cleanup
drop table t1;
drop PROCEDURE bulk_insert1;
--enable_query_log
--enable_result_log
```
wrong_result_with_union_and_small_memory_tmp_table.result
```
set session internal_tmp_mem_storage_engine='memory';
set session tmp_table_size=2097152;
select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890';
count(*)
1
select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890';
count(*)
0
select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890';
count(*)
1
set session tmp_table_size=16777216;
select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890';
count(*)
1
select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890';
count(*)
1
select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890';
count(*)
1
```
Description: If a query with UNION uses memory tmp_table bigger than tmp_table_size, it may get a wrong result. It is worth mentioning: 1. using UNION ALL instead of UNION can get true result. 2. setting tmp_table_size to a properly big value can get true result. How to repeat: wrong_result_with_union_and_small_memory_tmp_table.test ``` --disable_query_log --disable_result_log # 1. prepare drop table if exists t1; create table t1(id varchar(50)); # 2. create PROCEDURE delimiter $$; drop PROCEDURE if exists bulk_insert1; CREATE PROCEDURE bulk_insert1(IN count INTEGER) BEGIN declare i int default 1; declare s1 varchar(50); declare s2 varchar(50); declare s3 varchar(50); declare s4 varchar(50); declare s5 varchar(50); declare str varchar(50); START TRANSACTION; while i<=count DO set s1 = substring(md5(rand()),1,10); set s2 = substring(md5(rand()),1,4); set s3 = substring(md5(rand()),1,4); set s4 = substring(md5(rand()),1,4); set s5 = substring(md5(rand()),1,10); set str = concat(s1,'-',s2,'-',s3,'-',s4,'-',s5); insert into t1(id)values(str); set i=i+1; end while; COMMIT; END$$ delimiter ;$$ # 3. insert data insert into t1(id)values('1234567890-1234-1234-1234567890'); call bulk_insert1(11999); --enable_query_log --enable_result_log # 4. test with tmp_table_size=2*1024*1024 set session internal_tmp_mem_storage_engine='memory'; set session tmp_table_size=2097152; # 2*1024*1024 select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890'; select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890'; select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890'; # 5. test with tmp_table_size=16*1024*1024 set session tmp_table_size=16777216; # 16*1024*1024 select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890'; select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890'; select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890'; --disable_query_log --disable_result_log # 6. cleanup drop table t1; drop PROCEDURE bulk_insert1; --enable_query_log --enable_result_log ``` wrong_result_with_union_and_small_memory_tmp_table.result ``` set session internal_tmp_mem_storage_engine='memory'; set session tmp_table_size=2097152; select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890'; count(*) 1 select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890'; count(*) 0 select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890'; count(*) 1 set session tmp_table_size=16777216; select count(*) from ((select id from t1 limit 1000) union select 1) as t where id='1234567890-1234-1234-1234567890'; count(*) 1 select count(*) from ((select id from t1 limit 12000) union select 1) as t where id='1234567890-1234-1234-1234567890'; count(*) 1 select count(*) from ((select id from t1 limit 12000) union all select 1) as t where id='1234567890-1234-1234-1234567890'; count(*) 1 ```