diff options
author | unknown <knielsen@knielsen-hq.org> | 2009-10-09 12:18:49 +0200 |
---|---|---|
committer | unknown <knielsen@knielsen-hq.org> | 2009-10-09 12:18:49 +0200 |
commit | 698cebb67765686a9e4f0079901a494a783e65f0 (patch) | |
tree | 6b6e9c4dc10254eedf4752170f25874a62e788d4 | |
parent | e702b70d67b113686068a68b8143ce94be54716f (diff) | |
parent | 99ff6ada7b2d0c7edebde49e47d39b74f290858f (diff) | |
download | mariadb-git-698cebb67765686a9e4f0079901a494a783e65f0.tar.gz |
Merge Sanja's fix of BUG#39249 into MariaDB 5.1.38 release clone.
-rwxr-xr-x | BUILD/SETUP.sh | 1 | ||||
-rwxr-xr-x | BUILD/compile-pentium-debug-max-no-qc | 10 | ||||
-rw-r--r-- | sql/mysql_priv.h | 1 | ||||
-rw-r--r-- | storage/maria/ha_maria.cc | 6 | ||||
-rw-r--r-- | storage/maria/ma_state.c | 9 | ||||
-rw-r--r-- | storage/maria/maria_def.h | 6 | ||||
-rw-r--r-- | storage/myisam/ha_myisam.cc | 3 | ||||
-rw-r--r-- | storage/myisam/mi_locking.c | 6 | ||||
-rw-r--r-- | storage/myisam/myisamdef.h | 5 |
9 files changed, 44 insertions, 3 deletions
diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index 84abf2a461b..418ee799a2c 100755 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -172,6 +172,7 @@ local_infile_configs="--enable-local-infile" max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max" +max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache" max_no_ndb_configs="$SSL_LIBRARY --with-plugins=max-no-ndb --with-embedded-server --with-libevent" max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent" # Disable NDB in maria max builds diff --git a/BUILD/compile-pentium-debug-max-no-qc b/BUILD/compile-pentium-debug-max-no-qc new file mode 100755 index 00000000000..6407b4b09ad --- /dev/null +++ b/BUILD/compile-pentium-debug-max-no-qc @@ -0,0 +1,10 @@ +#! /bin/sh +# Builds server without query cache support + +path=`dirname $0` +. "$path/SETUP.sh" + +extra_flags="$pentium_cflags $debug_cflags" +extra_configs="$pentium_configs $debug_configs $max_no_qc_configs" + +. "$path/FINISH.sh" diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 63d5621742e..525ce3fa1d0 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -947,7 +947,6 @@ struct Query_cache_query_flags #define query_cache_abort(A) #define query_cache_end_of_result(A) -#define query_cache_invalidate_by_MyISAM_filename_ref NULL #define query_cache_maybe_disabled(T) 1 #define query_cache_is_cacheable_query(L) 0 #endif /*HAVE_QUERY_CACHE*/ diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index baa40cc0037..a4d72f15285 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -28,6 +28,7 @@ #include <my_bit.h> #include "ha_maria.h" #include "trnman_public.h" +#include "trnman.h" C_MODE_START #include "maria_def.h" @@ -918,6 +919,8 @@ int ha_maria::open(const char *name, int mode, uint test_if_locked) if (!(file= maria_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER))) return (my_errno ? my_errno : -1); + file->s->chst_invalidator= query_cache_invalidate_by_MyISAM_filename_ref; + if (test_if_locked & (HA_OPEN_IGNORE_IF_LOCKED | HA_OPEN_TMP_TABLE)) VOID(maria_extra(file, HA_EXTRA_NO_WAIT_LOCK, 0)); @@ -3238,6 +3241,9 @@ my_bool ha_maria::register_query_cache_table(THD *thd, char *table_name, */ *engine_data= 0; + if (file->s->now_transactional && file->s->have_versioning) + return (file->trn->trid >= file->s->state.last_change_trn); + /* If a concurrent INSERT has happened just before the currently processed SELECT statement, the total size of the table is unknown. diff --git a/storage/maria/ma_state.c b/storage/maria/ma_state.c index a7e3b49e284..0b7fba9f55a 100644 --- a/storage/maria/ma_state.c +++ b/storage/maria/ma_state.c @@ -318,6 +318,13 @@ void _ma_update_status(void* param) DBUG_ASSERT(!info->s->base.born_transactional); share->state.state= *info->state; info->state= &share->state.state; +#ifdef HAVE_QUERY_CACHE + DBUG_PRINT("info", ("invalidator... '%s' (status update)", + info->s->data_file_name.str)); + DBUG_ASSERT(info->s->chst_invalidator != NULL); + (*info->s->chst_invalidator)((const char *)info->s->data_file_name.str); +#endif + } info->append_insert_at_end= 0; } @@ -469,6 +476,8 @@ my_bool _ma_trnman_end_trans_hook(TRN *trn, my_bool commit, tables->state_start.checksum); history->trid= trn->commit_trid; + share->state.last_change_trn= trn->commit_trid; + if (history->next) { /* Remove not visible states */ diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index 9385c8602b0..ada4ae3f426 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -83,6 +83,7 @@ typedef struct st_maria_state_info pgcache_page_no_t first_bitmap_with_space; ulonglong auto_increment; TrID create_trid; /* Minum trid for file */ + TrID last_change_trn; /* selfdescriptive */ ulong update_count; /* Updated for each write lock */ ulong status; double *rec_per_key_part; @@ -337,7 +338,10 @@ typedef struct st_maria_share /* Mapings to read/write the data file */ size_t (*file_read)(MARIA_HA *, uchar *, size_t, my_off_t, myf); size_t (*file_write)(MARIA_HA *, const uchar *, size_t, my_off_t, myf); - invalidator_by_filename invalidator; /* query cache invalidator */ + /* query cache invalidator for merged tables */ + invalidator_by_filename invalidator; + /* query cache invalidator for changing state */ + invalidator_by_filename chst_invalidator; my_off_t key_del_current; /* delete links for index pages */ ulong this_process; /* processid */ ulong last_process; /* For table-change-check */ diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index ea9ba7012c3..fd35410682e 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -690,6 +690,9 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) if (!(file=mi_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER))) return (my_errno ? my_errno : -1); + + file->s->chst_invalidator= query_cache_invalidate_by_MyISAM_filename_ref; + if (!table->s->tmp_table) /* No need to perform a check for tmp table */ { if ((my_errno= table2myisam(table, &keyinfo, &recinfo, &recs))) diff --git a/storage/myisam/mi_locking.c b/storage/myisam/mi_locking.c index ebee8826c3b..b935d517c81 100644 --- a/storage/myisam/mi_locking.c +++ b/storage/myisam/mi_locking.c @@ -329,6 +329,12 @@ void mi_update_status(void* param) #endif info->s->state.state= *info->state; info->state= &info->s->state.state; +#ifdef HAVE_QUERY_CACHE + DBUG_PRINT("info", ("invalidator... '%s' (status update)", + info->filename)); + DBUG_ASSERT(info->s->chst_invalidator != NULL); + (*info->s->chst_invalidator)((const char *)info->filename); +#endif } info->append_insert_at_end= 0; diff --git a/storage/myisam/myisamdef.h b/storage/myisam/myisamdef.h index f311202e47a..c2841c49199 100644 --- a/storage/myisam/myisamdef.h +++ b/storage/myisam/myisamdef.h @@ -190,7 +190,10 @@ typedef struct st_mi_isam_share const uchar *record, my_off_t pos); size_t (*file_read) (MI_INFO *, uchar *, size_t, my_off_t, myf); size_t (*file_write) (MI_INFO *, const uchar *, size_t, my_off_t, myf); - invalidator_by_filename invalidator; /* query cache invalidator */ + /* query cache invalidator for merged tables */ + invalidator_by_filename invalidator; + /* query cache invalidator for changing state */ + invalidator_by_filename chst_invalidator; ulong this_process; /* processid */ ulong last_process; /* For table-change-check */ ulong last_version; /* Version on start */ |