From f9dac8752ed0299dd408cbaa74aa8c0736e1fd38 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 7 Aug 2002 15:29:49 +0300 Subject: [PATCH] Fixed bug in query cache after temporary table creation. Docs/manual.texi: change log entry mysql-test/r/query_cache.result: bug test suite mysql-test/t/query_cache.test: bug test suite --- Docs/manual.texi | 2 ++ mysql-test/r/query_cache.result | 20 ++++++++++++++++++++ mysql-test/t/query_cache.test | 15 +++++++++++++++ sql/sql_cache.cc | 7 ++++--- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index ccbfdc493f8..ed4ec15af63 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -50147,6 +50147,8 @@ each individual 4.0.x release. @itemize @bullet @item +Fixed bug in query cache after temporary table creation. +@item Fixed bug in multi-table @code{UPDATE}: when updating a table, @code{do_select()} became confused about reading records from a cache. @item diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index f5dc994c7c3..7c53074b6da 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -506,3 +506,23 @@ set GLOBAL query_cache_size=1900; show global variables like "query_cache_size"; Variable_name Value query_cache_size 1024 +set GLOBAL query_cache_size=1048576; +create table t1 (i int not null); +create table t2 (i int not null); +select * from t1; +i +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 1 +create temporary table t3 (i int not null); +select * from t2; +i +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 2 +select * from t3; +i +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 2 +drop table t1, t2, t3; diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index 1c9f7c51bcc..5dc6d1047f4 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -352,3 +352,18 @@ set GLOBAL query_cache_size=1700; set GLOBAL query_cache_size=1800; set GLOBAL query_cache_size=1900; show global variables like "query_cache_size"; + +# +# Temporary tables +# +set GLOBAL query_cache_size=1048576; +create table t1 (i int not null); +create table t2 (i int not null); +select * from t1; +show status like "Qcache_queries_in_cache"; +create temporary table t3 (i int not null); +select * from t2; +show status like "Qcache_queries_in_cache"; +select * from t3; +show status like "Qcache_queries_in_cache"; +drop table t1, t2, t3; diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 7b5e1bf4e59..6cfcff8a7ff 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2395,7 +2395,6 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len, DBUG_ENTER("Query_cache::is_cacheable"); if (lex->sql_command == SQLCOM_SELECT && - thd->temporary_tables == 0 && (thd->variables.query_cache_type == 1 || (thd->variables.query_cache_type == 2 && (lex->select->options & OPTION_TO_QUERY_CACHE))) && @@ -2416,9 +2415,11 @@ TABLE_COUNTER_TYPE Query_cache::is_cacheable(THD *thd, uint32 query_len, has_transactions = (has_transactions || tables_used->table->file->has_transactions()); - if (tables_used->table->db_type == DB_TYPE_MRG_ISAM) + if (tables_used->table->db_type == DB_TYPE_MRG_ISAM || + tables_used->table->tmp_table != NO_TMP_TABLE) { - DBUG_PRINT("qcache", ("select not cacheable: used MRG_ISAM table(s)")); + DBUG_PRINT("qcache", + ("select not cacheable: used MRG_ISAM or temporary table(s)")); DBUG_RETURN(0); } if (tables_used->table->db_type == DB_TYPE_MRG_MYISAM)