mirror of
https://github.com/MariaDB/server.git
synced 2025-03-05 10:43:18 +01:00

------------------------------------------------------------------------ r3572 | marko | 2008-12-17 11:19:56 +0200 (Wed, 17 Dec 2008) | 3 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/btr/btr0sea.c M /branches/zip/buf/buf0buf.c M /branches/zip/buf/buf0lru.c M /branches/zip/ha/ha0ha.c M /branches/zip/ha/hash0hash.c M /branches/zip/include/buf0buf.h M /branches/zip/include/ha0ha.h M /branches/zip/include/ha0ha.ic M /branches/zip/include/hash0hash.h M /branches/zip/include/univ.i branches/zip: Introduce UNIV_AHI_DEBUG for debugging the adaptive hash index without enabling UNIV_DEBUG. ------------------------------------------------------------------------ r3574 | marko | 2008-12-17 12:44:31 +0200 (Wed, 17 Dec 2008) | 2 lines Changed paths: M /branches/zip/ChangeLog branches/zip: ChangeLog: Document recent changes that were not included in InnoDB Plugin 1.0.2, except changes to source code comments. ------------------------------------------------------------------------ r3575 | marko | 2008-12-17 14:40:58 +0200 (Wed, 17 Dec 2008) | 12 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/include/row0sel.h M /branches/zip/include/row0upd.h M /branches/zip/pars/pars0pars.c M /branches/zip/row/row0mysql.c M /branches/zip/row/row0sel.c M /branches/zip/row/row0upd.c branches/zip: Remove update-in-place-in-select from the internal SQL interpreter. It was only used for updating the InnoDB internal data dictionary when renaming or dropping tables. It could have caused deadlocks after acquiring latches on insert buffer bitmap pages. This and r3544 should fix Issue #135. Furthermore, the update-in-place-in-select does not account for compression failure. That was not a problem yet, since the InnoDB SQL interpreter has so far assumed ROW_FORMAT=REDUNDANT. rb://63 approved by Heikki Tuuri ------------------------------------------------------------------------
198 lines
4.8 KiB
Text
198 lines
4.8 KiB
Text
/************************************************************************
|
|
The hash table with external chains
|
|
|
|
(c) 1994-1997 Innobase Oy
|
|
|
|
Created 8/18/1994 Heikki Tuuri
|
|
*************************************************************************/
|
|
|
|
#include "ut0rnd.h"
|
|
#include "mem0mem.h"
|
|
|
|
/***************************************************************
|
|
Deletes a hash node. */
|
|
UNIV_INTERN
|
|
void
|
|
ha_delete_hash_node(
|
|
/*================*/
|
|
hash_table_t* table, /* in: hash table */
|
|
ha_node_t* del_node); /* in: node to be deleted */
|
|
|
|
/**********************************************************************
|
|
Gets a hash node data. */
|
|
UNIV_INLINE
|
|
void*
|
|
ha_node_get_data(
|
|
/*=============*/
|
|
/* out: pointer to the data */
|
|
ha_node_t* node) /* in: hash chain node */
|
|
{
|
|
return(node->data);
|
|
}
|
|
|
|
/**********************************************************************
|
|
Sets hash node data. */
|
|
UNIV_INLINE
|
|
void
|
|
ha_node_set_data_func(
|
|
/*==================*/
|
|
ha_node_t* node, /* in: hash chain node */
|
|
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
|
buf_block_t* block, /* in: buffer block containing the data */
|
|
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
|
void* data) /* in: pointer to the data */
|
|
{
|
|
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
|
node->block = block;
|
|
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
|
node->data = data;
|
|
}
|
|
|
|
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
|
# define ha_node_set_data(n,b,d) ha_node_set_data_func(n,b,d)
|
|
#else /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
|
# define ha_node_set_data(n,b,d) ha_node_set_data_func(n,d)
|
|
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
|
|
|
/**********************************************************************
|
|
Gets the next node in a hash chain. */
|
|
UNIV_INLINE
|
|
ha_node_t*
|
|
ha_chain_get_next(
|
|
/*==============*/
|
|
/* out: next node, NULL if none */
|
|
ha_node_t* node) /* in: hash chain node */
|
|
{
|
|
return(node->next);
|
|
}
|
|
|
|
/**********************************************************************
|
|
Gets the first node in a hash chain. */
|
|
UNIV_INLINE
|
|
ha_node_t*
|
|
ha_chain_get_first(
|
|
/*===============*/
|
|
/* out: first node, NULL if none */
|
|
hash_table_t* table, /* in: hash table */
|
|
ulint fold) /* in: fold value determining the chain */
|
|
{
|
|
return((ha_node_t*)
|
|
hash_get_nth_cell(table, hash_calc_hash(fold, table))->node);
|
|
}
|
|
|
|
/*****************************************************************
|
|
Looks for an element in a hash table. */
|
|
UNIV_INLINE
|
|
ha_node_t*
|
|
ha_search(
|
|
/*======*/
|
|
/* out: pointer to the first hash table node
|
|
in chain having the fold number, NULL if not
|
|
found */
|
|
hash_table_t* table, /* in: hash table */
|
|
ulint fold) /* in: folded value of the searched data */
|
|
{
|
|
ha_node_t* node;
|
|
|
|
ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold)));
|
|
|
|
node = ha_chain_get_first(table, fold);
|
|
|
|
while (node) {
|
|
if (node->fold == fold) {
|
|
|
|
return(node);
|
|
}
|
|
|
|
node = ha_chain_get_next(node);
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
/*****************************************************************
|
|
Looks for an element in a hash table. */
|
|
UNIV_INLINE
|
|
void*
|
|
ha_search_and_get_data(
|
|
/*===================*/
|
|
/* out: pointer to the data of the first hash
|
|
table node in chain having the fold number,
|
|
NULL if not found */
|
|
hash_table_t* table, /* in: hash table */
|
|
ulint fold) /* in: folded value of the searched data */
|
|
{
|
|
ha_node_t* node;
|
|
|
|
ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold)));
|
|
|
|
node = ha_chain_get_first(table, fold);
|
|
|
|
while (node) {
|
|
if (node->fold == fold) {
|
|
|
|
return(node->data);
|
|
}
|
|
|
|
node = ha_chain_get_next(node);
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
/*************************************************************
|
|
Looks for an element when we know the pointer to the data. */
|
|
UNIV_INLINE
|
|
ha_node_t*
|
|
ha_search_with_data(
|
|
/*================*/
|
|
/* out: pointer to the hash table node, NULL
|
|
if not found in the table */
|
|
hash_table_t* table, /* in: hash table */
|
|
ulint fold, /* in: folded value of the searched data */
|
|
void* data) /* in: pointer to the data */
|
|
{
|
|
ha_node_t* node;
|
|
|
|
ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold)));
|
|
|
|
node = ha_chain_get_first(table, fold);
|
|
|
|
while (node) {
|
|
if (node->data == data) {
|
|
|
|
return(node);
|
|
}
|
|
|
|
node = ha_chain_get_next(node);
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
/*************************************************************
|
|
Looks for an element when we know the pointer to the data, and deletes
|
|
it from the hash table, if found. */
|
|
UNIV_INLINE
|
|
ibool
|
|
ha_search_and_delete_if_found(
|
|
/*==========================*/
|
|
/* out: TRUE if found */
|
|
hash_table_t* table, /* in: hash table */
|
|
ulint fold, /* in: folded value of the searched data */
|
|
void* data) /* in: pointer to the data */
|
|
{
|
|
ha_node_t* node;
|
|
|
|
ut_ad(!table->mutexes || mutex_own(hash_get_mutex(table, fold)));
|
|
|
|
node = ha_search_with_data(table, fold, data);
|
|
|
|
if (node) {
|
|
ha_delete_hash_node(table, node);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|