Fix for BUG#29318 "Statements prepared with PREPARE and with one

parameter don't use query cache"
Thanks to the fix of BUG#26842, statements prepared with SQL PREPARE
and having parameters can now use the query cache.
parent 8b8b4415
...@@ -33,7 +33,7 @@ drop table if exists t1; ...@@ -33,7 +33,7 @@ drop table if exists t1;
create table t1(c1 int); create table t1(c1 int);
insert into t1 values(1),(10),(100); insert into t1 values(1),(10),(100);
# Prepared statements has no parameters, query caching should happen # First, prepared statements with no parameters
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
show status like 'Qcache_hits'; show status like 'Qcache_hits';
execute stmt1; execute stmt1;
...@@ -113,7 +113,9 @@ show status like 'Qcache_hits'; ...@@ -113,7 +113,9 @@ show status like 'Qcache_hits';
--echo ---- switch to connection default ---- --echo ---- switch to connection default ----
connection default; connection default;
# Prepared statement has parameters, query caching should not happen # Query caching also works when statement has parameters
# (BUG#29318 Statements prepared with PREPARE and with one parameter don't use
# query cache)
prepare stmt1 from "select * from t1 where c1=?"; prepare stmt1 from "select * from t1 where c1=?";
show status like 'Qcache_hits'; show status like 'Qcache_hits';
set @a=1; set @a=1;
...@@ -127,6 +129,12 @@ set @a=1; ...@@ -127,6 +129,12 @@ set @a=1;
prepare stmt4 from "select * from t1 where c1=?"; prepare stmt4 from "select * from t1 where c1=?";
execute stmt4 using @a; execute stmt4 using @a;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
# verify that presence of user variables forbids caching
prepare stmt4 from "select @a from t1 where c1=?";
execute stmt4 using @a;
show status like 'Qcache_hits';
execute stmt4 using @a;
show status like 'Qcache_hits';
--echo ---- switch to connection default ---- --echo ---- switch to connection default ----
connection default; connection default;
......
...@@ -144,7 +144,7 @@ c1 ...@@ -144,7 +144,7 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 15
---- switch to connection con1 ---- ---- switch to connection con1 ----
set @a=1; set @a=1;
prepare stmt4 from "select * from t1 where c1=?"; prepare stmt4 from "select * from t1 where c1=?";
...@@ -153,50 +153,63 @@ c1 ...@@ -153,50 +153,63 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
prepare stmt4 from "select @a from t1 where c1=?";
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 16
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 16
---- switch to connection default ---- ---- switch to connection default ----
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=100000; set global query_cache_size=100000;
execute stmt1; execute stmt1;
...@@ -204,80 +217,80 @@ c1 ...@@ -204,80 +217,80 @@ c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 15 Qcache_hits 17
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 16 Qcache_hits 18
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 18 Qcache_hits 20
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10"; ...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection con1 ---- ---- switch to connection con1 ----
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=?"; prepare stmt1 from "select * from t1 where c1=?";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
set @a=1; set @a=1;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
set @a=100; set @a=100;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
100 100
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
set @a=10; set @a=10;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 19 Qcache_hits 21
drop table t1; drop table t1;
---- disconnect connection con1 ---- ---- disconnect connection con1 ----
set @@global.query_cache_size=@initial_query_cache_size; set @@global.query_cache_size=@initial_query_cache_size;
......
...@@ -144,7 +144,7 @@ c1 ...@@ -144,7 +144,7 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 13
---- switch to connection con1 ---- ---- switch to connection con1 ----
set @a=1; set @a=1;
prepare stmt4 from "select * from t1 where c1=?"; prepare stmt4 from "select * from t1 where c1=?";
...@@ -153,50 +153,63 @@ c1 ...@@ -153,50 +153,63 @@ c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
prepare stmt4 from "select @a from t1 where c1=?";
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 14
execute stmt4 using @a;
@a
1
show status like 'Qcache_hits';
Variable_name Value
Qcache_hits 14
---- switch to connection default ---- ---- switch to connection default ----
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=100000; set global query_cache_size=100000;
execute stmt1; execute stmt1;
...@@ -204,80 +217,80 @@ c1 ...@@ -204,80 +217,80 @@ c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 12 Qcache_hits 14
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 13 Qcache_hits 15
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 14 Qcache_hits 16
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 15 Qcache_hits 17
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 16 Qcache_hits 18
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection con1 ---- ---- switch to connection con1 ----
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=10"; prepare stmt1 from "select * from t1 where c1=10";
...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10"; ...@@ -287,75 +300,75 @@ prepare stmt3 from "select * from t1 where c1=10";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt1; execute stmt1;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection con1 ---- ---- switch to connection con1 ----
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
execute stmt3; execute stmt3;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
---- switch to connection default ---- ---- switch to connection default ----
set global query_cache_size=0; set global query_cache_size=0;
prepare stmt1 from "select * from t1 where c1=?"; prepare stmt1 from "select * from t1 where c1=?";
set global query_cache_size=100000; set global query_cache_size=100000;
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
set @a=1; set @a=1;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
1 1
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
set @a=100; set @a=100;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
100 100
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
set @a=10; set @a=10;
execute stmt1 using @a; execute stmt1 using @a;
c1 c1
10 10
show status like 'Qcache_hits'; show status like 'Qcache_hits';
Variable_name Value Variable_name Value
Qcache_hits 17 Qcache_hits 19
drop table t1; drop table t1;
---- disconnect connection con1 ---- ---- disconnect connection con1 ----
set @@global.query_cache_size=@initial_query_cache_size; set @@global.query_cache_size=@initial_query_cache_size;
......
...@@ -2922,18 +2922,6 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) ...@@ -2922,18 +2922,6 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
thd->restore_backup_statement(this, &stmt_backup); thd->restore_backup_statement(this, &stmt_backup);
thd->stmt_arena= old_stmt_arena; thd->stmt_arena= old_stmt_arena;
if ((protocol->type() == Protocol::PROTOCOL_TEXT) && (param_count > 0))
{
/*
This is a mysql_sql_stmt_prepare(); query expansion will insert user
variable references, and user variables are uncacheable, thus we have to
mark this statement as uncacheable.
This has to be done before setup_set_params(), as it may make expansion
unneeded.
*/
lex->safe_to_cache_query= FALSE;
}
if (error == 0) if (error == 0)
{ {
setup_set_params(); setup_set_params();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment