mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
processing trunsactional tables in query cache
mysql-test/r/innodb_cache.result: new test for query cache with transactions mysql-test/t/innodb_cache.test: new test for query cache with transactions sql/sql_cache.cc: processing trunsactional tables in query cache & removing strlen sql/sql_class.cc: processing trunsactional tables in query cache & added transaction-live memory sql/sql_class.h: processing trunsactional tables in query cache & added transaction-live memory sql/sql_parse.cc: processing trunsactional tables in query cache & added transaction-live memory sql/table.h: removing strlen operation from query cache
This commit is contained in:
@@ -34,6 +34,8 @@
|
||||
#ifdef __WIN__
|
||||
#include <io.h>
|
||||
#endif
|
||||
#include <mysys_err.h>
|
||||
#include <assert.h>
|
||||
|
||||
/*****************************************************************************
|
||||
** Instansiate templates
|
||||
@@ -105,6 +107,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
|
||||
net.vio=0;
|
||||
ull=0;
|
||||
system_thread=cleanup_done=0;
|
||||
transaction.changed_tables = 0;
|
||||
#ifdef __WIN__
|
||||
real_id = 0;
|
||||
#endif
|
||||
@@ -136,6 +139,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
|
||||
|
||||
/* Initialize sub structures */
|
||||
bzero((char*) &mem_root,sizeof(mem_root));
|
||||
bzero((char*) &transaction.mem_root,sizeof(transaction.mem_root));
|
||||
user_connect=(UC *)0;
|
||||
hash_init(&user_vars, USER_VARS_HASH_SIZE, 0, 0,
|
||||
(hash_get_key) get_var_key,
|
||||
@@ -211,6 +215,7 @@ THD::~THD()
|
||||
safeFree(db);
|
||||
safeFree(ip);
|
||||
free_root(&mem_root,MYF(0));
|
||||
free_root(&transaction.mem_root,MYF(0));
|
||||
mysys_var=0; // Safety (shouldn't be needed)
|
||||
#ifdef SIGNAL_WITH_VIO_CLOSE
|
||||
pthread_mutex_destroy(&active_vio_lock);
|
||||
@@ -255,6 +260,88 @@ bool THD::store_globals()
|
||||
my_pthread_setspecific_ptr(THR_NET, &net));
|
||||
}
|
||||
|
||||
/* routings to adding tables to list of changed in transaction tables */
|
||||
|
||||
inline static void list_include(CHANGED_TABLE_LIST** prev,
|
||||
CHANGED_TABLE_LIST* curr,
|
||||
CHANGED_TABLE_LIST* new_table)
|
||||
{
|
||||
if (new_table)
|
||||
{
|
||||
*prev = new_table;
|
||||
(*prev)->next = curr;
|
||||
}
|
||||
}
|
||||
|
||||
/* add table to list of changed in transaction tables */
|
||||
void THD::add_changed_table(TABLE *table)
|
||||
{
|
||||
DBUG_ENTER("THD::add_changed_table (table)");
|
||||
|
||||
DBUG_ASSERT((options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN)) &&
|
||||
table->file->has_transactions());
|
||||
|
||||
CHANGED_TABLE_LIST** prev = &transaction.changed_tables;
|
||||
CHANGED_TABLE_LIST* curr = transaction.changed_tables;
|
||||
|
||||
for(; curr; prev = &(curr->next), curr = curr->next)
|
||||
{
|
||||
int cmp = (long)curr->key_length - (long)table->key_length;
|
||||
if (cmp < 0)
|
||||
{
|
||||
list_include(prev, curr, changed_table_dup(table));
|
||||
DBUG_PRINT("info",
|
||||
("key_length %u %u", table->key_length, (*prev)->key_length));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
else if (cmp == 0)
|
||||
{
|
||||
cmp = memcmp(curr->key ,table->table_cache_key, curr->key_length);
|
||||
if (cmp < 0)
|
||||
{
|
||||
list_include(prev, curr, changed_table_dup(table));
|
||||
DBUG_PRINT("info",
|
||||
("key_length %u %u", table->key_length, (*prev)->key_length));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
else if (cmp == 0)
|
||||
{
|
||||
DBUG_PRINT("info", ("already in list"));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
}
|
||||
}
|
||||
*prev = changed_table_dup(table);
|
||||
DBUG_PRINT("info", ("key_length %u %u", table->key_length, (*prev)->key_length));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
CHANGED_TABLE_LIST* THD::changed_table_dup(TABLE *table)
|
||||
{
|
||||
CHANGED_TABLE_LIST* new_table =
|
||||
(CHANGED_TABLE_LIST*) trans_alloc(ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST))+
|
||||
table->key_length + 1);
|
||||
if (!new_table)
|
||||
{
|
||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL),
|
||||
ALIGN_SIZE(sizeof(TABLE_LIST)) + table->key_length + 1);
|
||||
killed= 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
new_table->key = (char *) (((byte*)new_table)+
|
||||
ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST)));
|
||||
new_table->next = 0;
|
||||
new_table->key_length = table->key_length;
|
||||
uint32 db_len = ((new_table->table_name =
|
||||
::strmake(new_table->key, table->table_cache_key,
|
||||
table->key_length) + 1) - new_table->key);
|
||||
::memcpy(new_table->key + db_len, table->table_cache_key + db_len,
|
||||
table->key_length - db_len);
|
||||
return new_table;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
** Functions to provide a interface to select results
|
||||
*****************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user