diff options
author | unknown <kostja@bodhi.(none)> | 2007-07-16 23:31:36 +0400 |
---|---|---|
committer | unknown <kostja@bodhi.(none)> | 2007-07-16 23:31:36 +0400 |
commit | 9562c54a5c1172fa536d27bb67e86d7af93183d8 (patch) | |
tree | 53d9d30f94c45fc9b3f51662dd10574784b16e0a /storage/myisam | |
parent | b6c0fb605d613df14405e1d7c5621d22b35bc4fe (diff) | |
parent | 8023d91929247f1b2e2f81ca10daca4dde4ab2e2 (diff) | |
download | mariadb-git-9562c54a5c1172fa536d27bb67e86d7af93183d8.tar.gz |
Merge bodhi.(none):/opt/local/work/mysql-5.0-runtime
into bodhi.(none):/opt/local/work/mysql-5.1-runtime
mysql-test/r/trigger.result:
Auto merged
mysql-test/t/query_cache.test:
Auto merged
mysql-test/t/sp.test:
Auto merged
mysql-test/t/trigger.test:
Auto merged
sql/item.cc:
Auto merged
sql/item.h:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/sp_head.h:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_db.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/sql_trigger.h:
Auto merged
sql/sql_view.cc:
Auto merged
sql/table.cc:
Auto merged
storage/myisam/ha_myisam.h:
Auto merged
mysql-test/include/mix1.inc:
Manual merge.
mysql-test/r/information_schema.result:
Manual merge.
mysql-test/r/innodb_mysql.result:
Manual merge.
mysql-test/r/query_cache.result:
Manual merge.
mysql-test/r/sp.result:
Manual merge.
mysql-test/t/information_schema.test:
Manual merge.
sql/handler.h:
Manual merge.
sql/sp.cc:
Manual merge.
sql/sp_head.cc:
Manual merge.
sql/sql_prepare.cc:
Manual merge.
sql/sql_trigger.cc:
Manual merge.
sql/sql_yacc.yy:
Manual merge.
sql/table.h:
Manual merge.
storage/myisam/ha_myisam.cc:
Manual merge.
Diffstat (limited to 'storage/myisam')
-rw-r--r-- | storage/myisam/ha_myisam.cc | 75 | ||||
-rw-r--r-- | storage/myisam/ha_myisam.h | 7 |
2 files changed, 82 insertions, 0 deletions
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 98f74247707..20f55545282 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -2075,3 +2075,78 @@ mysql_declare_plugin(myisam) } mysql_declare_plugin_end; + +#ifdef HAVE_QUERY_CACHE +/** + @brief Register a named table with a call back function to the query cache. + + @param thd The thread handle + @param table_key A pointer to the table name in the table cache + @param key_length The length of the table name + @param[out] engine_callback The pointer to the storage engine call back + function, currently 0 + @param[out] engine_data Engine data will be set to 0. + + @note Despite the name of this function, it is used to check each statement + before it is cached and not to register a table or callback function. + + @see handler::register_query_cache_table + + @return The error code. The engine_data and engine_callback will be set to 0. + @retval TRUE Success + @retval FALSE An error occured +*/ + +my_bool ha_myisam::register_query_cache_table(THD *thd, char *table_name, + uint table_name_len, + qc_engine_callback + *engine_callback, + ulonglong *engine_data) +{ + /* + No call back function is needed to determine if a cached statement + is valid or not. + */ + *engine_callback= 0; + + /* + No engine data is needed. + */ + *engine_data= 0; + + /* + If a concurrent INSERT has happened just before the currently processed + SELECT statement, the total size of the table is unknown. + + To determine if the table size is known, the current thread's snap shot of + the table size with the actual table size are compared. + + If the table size is unknown the SELECT statement can't be cached. + */ + ulonglong actual_data_file_length; + ulonglong current_data_file_length; + + /* + POSIX visibility rules specify that "2. Whatever memory values a + thread can see when it unlocks a mutex <...> can also be seen by any + thread that later locks the same mutex". In this particular case, + concurrent insert thread had modified the data_file_length in + MYISAM_SHARE before it has unlocked (or even locked) + structure_guard_mutex. So, here we're guaranteed to see at least that + value after we've locked the same mutex. We can see a later value + (modified by some other thread) though, but it's ok, as we only want + to know if the variable was changed, the actual new value doesn't matter + */ + actual_data_file_length= file->s->state.state.data_file_length; + current_data_file_length= file->save_state.data_file_length; + + if (current_data_file_length != actual_data_file_length) + { + /* Don't cache current statement. */ + return FALSE; + } + + /* It is ok to try to cache current statement. */ + return TRUE; +} +#endif diff --git a/storage/myisam/ha_myisam.h b/storage/myisam/ha_myisam.h index 6cc9f4811b0..024675075c2 100644 --- a/storage/myisam/ha_myisam.h +++ b/storage/myisam/ha_myisam.h @@ -137,4 +137,11 @@ class ha_myisam: public handler int dump(THD* thd, int fd); int net_read_dump(NET* net); #endif +#ifdef HAVE_QUERY_CACHE + my_bool register_query_cache_table(THD *thd, char *table_key, + uint key_length, + qc_engine_callback + *engine_callback, + ulonglong *engine_data); +#endif }; |