Commit 698cebb6 authored by unknown's avatar unknown

Merge Sanja's fix of BUG#39249 into MariaDB 5.1.38 release clone.

parents e702b70d 99ff6ada
...@@ -172,6 +172,7 @@ local_infile_configs="--enable-local-infile" ...@@ -172,6 +172,7 @@ local_infile_configs="--enable-local-infile"
max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max" 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_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" max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent"
# Disable NDB in maria max builds # Disable NDB in maria max builds
......
#! /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"
...@@ -947,7 +947,6 @@ struct Query_cache_query_flags ...@@ -947,7 +947,6 @@ struct Query_cache_query_flags
#define query_cache_abort(A) #define query_cache_abort(A)
#define query_cache_end_of_result(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_maybe_disabled(T) 1
#define query_cache_is_cacheable_query(L) 0 #define query_cache_is_cacheable_query(L) 0
#endif /*HAVE_QUERY_CACHE*/ #endif /*HAVE_QUERY_CACHE*/
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <my_bit.h> #include <my_bit.h>
#include "ha_maria.h" #include "ha_maria.h"
#include "trnman_public.h" #include "trnman_public.h"
#include "trnman.h"
C_MODE_START C_MODE_START
#include "maria_def.h" #include "maria_def.h"
...@@ -918,6 +919,8 @@ int ha_maria::open(const char *name, int mode, uint test_if_locked) ...@@ -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))) if (!(file= maria_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
return (my_errno ? my_errno : -1); 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)) if (test_if_locked & (HA_OPEN_IGNORE_IF_LOCKED | HA_OPEN_TMP_TABLE))
VOID(maria_extra(file, HA_EXTRA_NO_WAIT_LOCK, 0)); 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, ...@@ -3238,6 +3241,9 @@ my_bool ha_maria::register_query_cache_table(THD *thd, char *table_name,
*/ */
*engine_data= 0; *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 If a concurrent INSERT has happened just before the currently processed
SELECT statement, the total size of the table is unknown. SELECT statement, the total size of the table is unknown.
......
...@@ -318,6 +318,13 @@ void _ma_update_status(void* param) ...@@ -318,6 +318,13 @@ void _ma_update_status(void* param)
DBUG_ASSERT(!info->s->base.born_transactional); DBUG_ASSERT(!info->s->base.born_transactional);
share->state.state= *info->state; share->state.state= *info->state;
info->state= &share->state.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; info->append_insert_at_end= 0;
} }
...@@ -469,6 +476,8 @@ my_bool _ma_trnman_end_trans_hook(TRN *trn, my_bool commit, ...@@ -469,6 +476,8 @@ my_bool _ma_trnman_end_trans_hook(TRN *trn, my_bool commit,
tables->state_start.checksum); tables->state_start.checksum);
history->trid= trn->commit_trid; history->trid= trn->commit_trid;
share->state.last_change_trn= trn->commit_trid;
if (history->next) if (history->next)
{ {
/* Remove not visible states */ /* Remove not visible states */
......
...@@ -83,6 +83,7 @@ typedef struct st_maria_state_info ...@@ -83,6 +83,7 @@ typedef struct st_maria_state_info
pgcache_page_no_t first_bitmap_with_space; pgcache_page_no_t first_bitmap_with_space;
ulonglong auto_increment; ulonglong auto_increment;
TrID create_trid; /* Minum trid for file */ TrID create_trid; /* Minum trid for file */
TrID last_change_trn; /* selfdescriptive */
ulong update_count; /* Updated for each write lock */ ulong update_count; /* Updated for each write lock */
ulong status; ulong status;
double *rec_per_key_part; double *rec_per_key_part;
...@@ -337,7 +338,10 @@ typedef struct st_maria_share ...@@ -337,7 +338,10 @@ typedef struct st_maria_share
/* Mapings to read/write the data file */ /* Mapings to read/write the data file */
size_t (*file_read)(MARIA_HA *, uchar *, size_t, my_off_t, myf); 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); 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 */ my_off_t key_del_current; /* delete links for index pages */
ulong this_process; /* processid */ ulong this_process; /* processid */
ulong last_process; /* For table-change-check */ ulong last_process; /* For table-change-check */
......
...@@ -690,6 +690,9 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) ...@@ -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))) if (!(file=mi_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
return (my_errno ? my_errno : -1); 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 (!table->s->tmp_table) /* No need to perform a check for tmp table */
{ {
if ((my_errno= table2myisam(table, &keyinfo, &recinfo, &recs))) if ((my_errno= table2myisam(table, &keyinfo, &recinfo, &recs)))
......
...@@ -329,6 +329,12 @@ void mi_update_status(void* param) ...@@ -329,6 +329,12 @@ void mi_update_status(void* param)
#endif #endif
info->s->state.state= *info->state; info->s->state.state= *info->state;
info->state= &info->s->state.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; info->append_insert_at_end= 0;
......
...@@ -190,7 +190,10 @@ typedef struct st_mi_isam_share ...@@ -190,7 +190,10 @@ typedef struct st_mi_isam_share
const uchar *record, my_off_t pos); const uchar *record, my_off_t pos);
size_t (*file_read) (MI_INFO *, uchar *, size_t, my_off_t, myf); 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); 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 this_process; /* processid */
ulong last_process; /* For table-change-check */ ulong last_process; /* For table-change-check */
ulong last_version; /* Version on start */ ulong last_version; /* Version on start */
......
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