Commit a20c835c authored by unknown's avatar unknown

temporary tables of subquery in the from clause just skipped during processing...

temporary tables of subquery in the from clause just skipped during processing QC tables (BUG#11522)


mysql-test/r/query_cache.result:
  queries with subquery in the FROM clause
mysql-test/t/query_cache.test:
  queries with subquery in the FROM clause
sql/sql_cache.cc:
  temporary tables of subquery in the from clause just skipped during processing QC tables
parent 4c36fc00
This diff is collapsed.
...@@ -730,4 +730,30 @@ flush query cache; ...@@ -730,4 +730,30 @@ flush query cache;
drop table t1, t2; drop table t1, t2;
create table t1 (a int);
insert into t1 values (1);
reset query cache;
flush status;
#
# queries with subquery in the FROM clause (BUG#11522)
#
select * from (select * from t1) a;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
select * from (select * from t1) a;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
insert into t1 values (2);
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
select * from (select * from t1) a;
show status like "Qcache_queries_in_cache";
show status like "Qcache_inserts";
show status like "Qcache_hits";
drop table t1;
set GLOBAL query_cache_size=0; set GLOBAL query_cache_size=0;
...@@ -2114,6 +2114,13 @@ my_bool Query_cache::register_all_tables(Query_cache_block *block, ...@@ -2114,6 +2114,13 @@ my_bool Query_cache::register_all_tables(Query_cache_block *block,
for (n=0; tables_used; tables_used=tables_used->next, n++, block_table++) for (n=0; tables_used; tables_used=tables_used->next, n++, block_table++)
{ {
if (tables_used->derived)
{
DBUG_PRINT("qcache", ("derived table skipped"));
n--;
block_table--;
continue;
}
DBUG_PRINT("qcache", DBUG_PRINT("qcache",
("table %s, db %s, openinfo at 0x%lx, keylen %u, key at 0x%lx", ("table %s, db %s, openinfo at 0x%lx, keylen %u, key at 0x%lx",
tables_used->real_name, tables_used->db, tables_used->real_name, tables_used->db,
...@@ -2671,7 +2678,8 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len, ...@@ -2671,7 +2678,8 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len,
table_alias_charset used here because it depends of table_alias_charset used here because it depends of
lower_case_table_names variable lower_case_table_names variable
*/ */
if (tables_used->table->tmp_table != NO_TMP_TABLE || if ((tables_used->table->tmp_table != NO_TMP_TABLE &&
!tables_used->derived) ||
(*tables_type & HA_CACHE_TBL_NOCACHE) || (*tables_type & HA_CACHE_TBL_NOCACHE) ||
(tables_used->db_length == 5 && (tables_used->db_length == 5 &&
my_strnncoll(table_alias_charset, (uchar*)tables_used->db, 6, my_strnncoll(table_alias_charset, (uchar*)tables_used->db, 6,
...@@ -2682,7 +2690,12 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len, ...@@ -2682,7 +2690,12 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len,
other non-cacheable table(s)")); other non-cacheable table(s)"));
DBUG_RETURN(0); DBUG_RETURN(0);
} }
if (tables_used->table->db_type == DB_TYPE_MRG_MYISAM) if (tables_used->derived)
{
table_count--;
DBUG_PRINT("qcache", ("derived table skipped"));
}
else if (tables_used->table->db_type == DB_TYPE_MRG_MYISAM)
{ {
ha_myisammrg *handler = (ha_myisammrg *)tables_used->table->file; ha_myisammrg *handler = (ha_myisammrg *)tables_used->table->file;
MYRG_INFO *file = handler->myrg_info(); MYRG_INFO *file = handler->myrg_info();
......
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