Commit ccee4f84 authored by unknown's avatar unknown

fixed query cache intercommunication with innodb engine


mysql-test/r/innodb_cache.result:
  new results
parent 20a2f6c5
......@@ -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;
......
......@@ -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
......
......@@ -345,6 +345,8 @@ class Query_cache
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,
......
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