mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
BUG#39249 Maria:query cache returns out of date results
BUG#41098 Query Cache returns wrong result with concurent insert BUILD/SETUP.sh: test build without query cache setup BUILD/compile-pentium-debug-max-no-qc: test build without query cache sql/mysql_priv.h: removed double declaration storage/maria/ha_maria.cc: query cache invalidation fixed storage/maria/ma_state.c: query cache invalidation fixed storage/maria/maria_def.h: last transaction ID added invalidation fixed storage/myisam/ha_myisam.cc: invalidation fixed storage/myisam/mi_locking.c: invalidation fixed storage/myisam/myisamdef.h: invalidation fixed
This commit is contained in:
parent
d50e99c9f6
commit
0c0e1f2e35
9 changed files with 43 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
9
BUILD/compile-pentium-debug-max-no-qc
Executable file
9
BUILD/compile-pentium-debug-max-no-qc
Executable file
|
|
@ -0,0 +1,9 @@
|
|||
#! /bin/sh
|
||||
|
||||
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"
|
||||
|
|
@ -933,7 +933,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*/
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
@ -907,6 +908,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));
|
||||
|
||||
|
|
@ -3227,6 +3230,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.
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -660,6 +660,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)))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue