summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2003-08-12 23:45:04 +0300
committerunknown <bell@sanja.is.com.ua>2003-08-12 23:45:04 +0300
commitff9f600f7d777e1e6fe9160109d3a5b37752832a (patch)
tree9cab30ce5d275a228192d659d1cdc373545ea825
parent01450dbb79540c01e6b0381ce0760418dcdfc133 (diff)
downloadmariadb-git-ff9f600f7d777e1e6fe9160109d3a5b37752832a.tar.gz
fixed query cache intercommunication with innodb engine
mysql-test/r/innodb_cache.result: new results
-rw-r--r--mysql-test/r/innodb_cache.result8
-rw-r--r--sql/sql_cache.cc42
-rw-r--r--sql/sql_cache.h2
3 files changed, 48 insertions, 4 deletions
diff --git a/mysql-test/r/innodb_cache.result b/mysql-test/r/innodb_cache.result
index c422dca36f1..7706e60d143 100644
--- a/mysql-test/r/innodb_cache.result
+++ b/mysql-test/r/innodb_cache.result
@@ -10,7 +10,7 @@ a
3
show status like "Qcache_queries_in_cache";
Variable_name Value
-Qcache_queries_in_cache 1
+Qcache_queries_in_cache 0
drop table t1;
commit;
set autocommit=1;
@@ -24,7 +24,7 @@ a
3
show status like "Qcache_queries_in_cache";
Variable_name Value
-Qcache_queries_in_cache 1
+Qcache_queries_in_cache 0
drop table t1;
commit;
create table t1 (a int not null) type=innodb;
@@ -90,14 +90,14 @@ a
2
show status like "Qcache_queries_in_cache";
Variable_name Value
-Qcache_queries_in_cache 3
+Qcache_queries_in_cache 1
show status like "Qcache_hits";
Variable_name Value
Qcache_hits 4
commit;
show status like "Qcache_queries_in_cache";
Variable_name Value
-Qcache_queries_in_cache 3
+Qcache_queries_in_cache 1
drop table if exists t1;
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) TYPE=InnoDB;
select count(*) from t1;
diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc
index ac6471e794c..bae2718c8b6 100644
--- a/sql/sql_cache.cc
+++ b/sql/sql_cache.cc
@@ -769,9 +769,18 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
STRUCT_LOCK(&structure_guard_mutex);
if (query_cache_size == 0)
+ {
+ STRUCT_UNLOCK(&structure_guard_mutex);
DBUG_VOID_RETURN;
+ }
DUMP(this);
+ if (ask_handler_allowance(thd, tables_used))
+ {
+ STRUCT_UNLOCK(&structure_guard_mutex);
+ DBUG_VOID_RETURN;
+ }
+
/* Key is query + database + flag */
if (thd->db_length)
{
@@ -2548,6 +2557,39 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len,
DBUG_RETURN(0);
}
+/*
+ Check handler allowence to cache query with this tables
+
+ SYNOPSYS
+ Query_cache::ask_handler_allowance()
+ thd - thread handlers
+ tables_used - tables list used in query
+
+ RETURN
+ 0 - caching allowed
+ 1 - caching disallowed
+*/
+my_bool Query_cache::ask_handler_allowance(THD *thd,
+ TABLE_LIST *tables_used)
+{
+ DBUG_ENTER("Query_cache::is_cacheable");
+
+ for (; tables_used; tables_used= tables_used->next)
+ {
+ TABLE *table= tables_used->table;
+ if (!handler::caching_allowed(thd, table->table_cache_key,
+ table->key_length,
+ table->file->table_cache_type()))
+ {
+ DBUG_PRINT("qcache", ("Handler does not allow caching for %s.%s",
+ tables_used->db, tables_used->alias));
+ thd->lex.safe_to_cache_query= 0; // Don't try to cache this
+ DBUG_RETURN(1);
+ }
+ }
+ DBUG_RETURN(0);
+}
+
/*****************************************************************************
Packing
diff --git a/sql/sql_cache.h b/sql/sql_cache.h
index eea542e9d06..af23b97aade 100644
--- a/sql/sql_cache.h
+++ b/sql/sql_cache.h
@@ -345,6 +345,8 @@ protected:
TABLE_COUNTER_TYPE is_cacheable(THD *thd, uint32 query_len, char *query,
LEX *lex, TABLE_LIST *tables_used,
uint8 *tables_type);
+
+ static my_bool ask_handler_allowance(THD *thd, TABLE_LIST *tables_used);
public:
Query_cache(ulong query_cache_limit = ULONG_MAX,