mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
ecfdc3560c
The problem is that the query cache was storing partial results if the statement failed when sending the results to the client. This could cause clients to hang when trying to read the results from the cache as they would, for example, wait indefinitely for a eof packet that wasn't saved. The solution is to always discard the caching of a query that failed to send its results to the associated client. mysql-test/r/query_cache_notembedded.result: Add test case result for Bug#40264 mysql-test/t/query_cache_notembedded.test: Add test case for Bug#40264 sql/sql_cache.cc: Abort if a unreported error was raised.
255 lines
6.2 KiB
Text
255 lines
6.2 KiB
Text
-- source include/have_query_cache.inc
|
|
-- source include/not_embedded.inc
|
|
|
|
#
|
|
# Tests with query cache
|
|
#
|
|
set GLOBAL query_cache_size=1355776;
|
|
|
|
# Reset query cache variables.
|
|
|
|
flush query cache; # This crashed in some versions
|
|
flush query cache; # This crashed in some versions
|
|
reset query cache;
|
|
flush status;
|
|
--disable_warnings
|
|
drop table if exists t1, t2, t3, t11, t21;
|
|
--enable_warnings
|
|
#
|
|
# FLUSH QUERY CACHE
|
|
#
|
|
create table t1 (a int not null);
|
|
insert into t1 values (1),(2),(3);
|
|
create table t2 (a int not null);
|
|
insert into t2 values (1),(2),(3);
|
|
select * from t1;
|
|
select * from t2;
|
|
insert into t1 values (4);
|
|
show status like "Qcache_free_blocks";
|
|
flush query cache;
|
|
show status like "Qcache_free_blocks";
|
|
drop table t1, t2;
|
|
# With join results...
|
|
create table t1 (a text not null);
|
|
create table t11 (a text not null);
|
|
create table t2 (a text not null);
|
|
create table t21 (a text not null);
|
|
create table t3 (a text not null);
|
|
insert into t1 values("1111111111111111111111111111111111111111111111111111");
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
# t11 and t21 must be over 4Kb (QUERY_CACHE_MIN_RESULT_DATA_SIZE)
|
|
insert into t11 select * from t1;
|
|
insert into t21 select * from t1;
|
|
insert into t1 select * from t2;
|
|
insert into t2 select * from t1;
|
|
insert into t1 select * from t2;
|
|
#results of t3 must be > 0.5Mb
|
|
insert into t3 select * from t1;
|
|
insert into t3 select * from t2;
|
|
insert into t3 select * from t1;
|
|
disable_result_log;
|
|
select * from t11;
|
|
select * from t21;
|
|
enable_result_log;
|
|
show status like "Qcache_total_blocks";
|
|
show status like "Qcache_free_blocks";
|
|
disable_result_log;
|
|
insert into t11 values("");
|
|
select * from t3;
|
|
enable_result_log;
|
|
show status like "Qcache_total_blocks";
|
|
show status like "Qcache_free_blocks";
|
|
flush query cache;
|
|
show status like "Qcache_total_blocks";
|
|
show status like "Qcache_free_blocks";
|
|
drop table t1, t2, t3, t11, t21;
|
|
|
|
#
|
|
# do not use QC if tables locked (BUG#12385)
|
|
#
|
|
connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
|
connection root;
|
|
CREATE TABLE t1 ( a INT NOT NULL PRIMARY KEY AUTO_INCREMENT ) ENGINE =
|
|
MyISAM;
|
|
LOCK TABLE t1 READ LOCAL;
|
|
connect (root2,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
|
|
connection root2;
|
|
INSERT INTO t1 VALUES (), (), ();
|
|
connection root;
|
|
SELECT * FROM t1;
|
|
connection root2;
|
|
SELECT * FROM t1;
|
|
connection root;
|
|
SELECT * FROM t1;
|
|
drop table t1;
|
|
|
|
#
|
|
# query in QC from normal execution and SP (BUG#6897)
|
|
# improved to also test BUG#3583 and BUG#12990
|
|
#
|
|
flush query cache;
|
|
reset query cache;
|
|
flush status;
|
|
delimiter //;
|
|
create table t1 (s1 int)//
|
|
create procedure f1 () begin
|
|
select sql_cache * from t1;
|
|
select sql_cache * from t1;
|
|
select sql_cache * from t1;
|
|
end;//
|
|
create procedure f2 () begin
|
|
select sql_cache * from t1 where s1=1;
|
|
select sql_cache * from t1;
|
|
end;//
|
|
create procedure f3 () begin
|
|
select sql_cache * from t1;
|
|
select sql_cache * from t1 where s1=1;
|
|
end;//
|
|
create procedure f4 () begin
|
|
select sql_cache * from t1;
|
|
select sql_cache * from t1 where s1=1;
|
|
select sql_cache * from t1;
|
|
select sql_cache * from t1 where s1=1;
|
|
select sql_cache * from t1 where s1=1;
|
|
end;//
|
|
delimiter ;//
|
|
call f1();
|
|
--replace_result 1 3
|
|
show status like "Qcache_queries_in_cache";
|
|
show status like "Qcache_inserts";
|
|
show status like "Qcache_hits";
|
|
call f1();
|
|
show status like "Qcache_queries_in_cache";
|
|
show status like "Qcache_inserts";
|
|
show status like "Qcache_hits";
|
|
call f1();
|
|
select sql_cache * from t1;
|
|
show status like "Qcache_queries_in_cache";
|
|
show status like "Qcache_inserts";
|
|
show status like "Qcache_hits";
|
|
insert into t1 values (1);
|
|
select sql_cache * from t1;
|
|
show status like "Qcache_queries_in_cache";
|
|
show status like "Qcache_inserts";
|
|
show status like "Qcache_hits";
|
|
call f1();
|
|
call f1();
|
|
select sql_cache * from t1;
|
|
show status like "Qcache_queries_in_cache";
|
|
show status like "Qcache_inserts";
|
|
show status like "Qcache_hits";
|
|
flush query cache;
|
|
reset query cache;
|
|
flush status;
|
|
select sql_cache * from t1;
|
|
select sql_cache * from t1 where s1=1;
|
|
call f1();
|
|
call f2();
|
|
call f3();
|
|
call f4();
|
|
call f4();
|
|
call f3();
|
|
call f2();
|
|
select sql_cache * from t1 where s1=1;
|
|
insert into t1 values (2);
|
|
call f1();
|
|
select sql_cache * from t1 where s1=1;
|
|
select sql_cache * from t1;
|
|
call f1();
|
|
call f3();
|
|
call f3();
|
|
call f1();
|
|
|
|
drop procedure f1;
|
|
drop procedure f2;
|
|
drop procedure f3;
|
|
drop procedure f4;
|
|
drop table t1;
|
|
|
|
#
|
|
# bug#14767: INSERT in SF + concurrent SELECT with query cache
|
|
#
|
|
reset query cache;
|
|
--disable_warnings
|
|
drop function if exists f1;
|
|
--enable_warnings
|
|
create table t1 (id int);
|
|
delimiter |;
|
|
create function f1 ()
|
|
returns int
|
|
begin
|
|
declare i_var int;
|
|
set i_var = sleep(3);
|
|
insert into t1 values(3);
|
|
set i_var = sleep(3);
|
|
return 0;
|
|
end;|
|
|
delimiter ;|
|
|
|
|
connect (con1,localhost,root,,);
|
|
connect (con2,localhost,root,,);
|
|
|
|
connection con1;
|
|
send select f1();
|
|
connection con2;
|
|
select sleep(4);
|
|
select * from t1;
|
|
connection con1;
|
|
reap;
|
|
connection con2;
|
|
# This gives wrong result i.e. 't' table seems to be empty
|
|
select * from t1;
|
|
reset query cache;
|
|
select * from t1;
|
|
drop table t1;
|
|
drop function f1;
|
|
disconnect con1;
|
|
disconnect con2;
|
|
connection default;
|
|
|
|
set GLOBAL query_cache_size=0;
|
|
|
|
#
|
|
# Bug#40264: Aborted cached query causes query to hang indefinitely on next cache hit
|
|
#
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--enable_warnings
|
|
|
|
FLUSH STATUS;
|
|
SET GLOBAL query_cache_size=1048576;
|
|
CREATE TABLE t1 (a INT);
|
|
INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
|
|
SHOW STATUS LIKE 'Qcache_queries_in_cache';
|
|
LOCK TABLES t1 WRITE;
|
|
connect(con1,localhost,root,,);
|
|
--send SELECT * FROM t1
|
|
connection default;
|
|
let $show_type= open tables where `table`='t1' and in_use=2;
|
|
let $show_pattern= '%t1%2%';
|
|
--source include/wait_show_pattern.inc
|
|
dirty_close con1;
|
|
UNLOCK TABLES;
|
|
let $show_type= open tables where `table`='t1' and in_use=0;
|
|
let $show_pattern= '%t1%0%';
|
|
--source include/wait_show_pattern.inc
|
|
SHOW STATUS LIKE 'Qcache_queries_in_cache';
|
|
DROP TABLE t1;
|
|
SET GLOBAL query_cache_size= default;
|
|
|
|
# End of 5.0 tests
|