mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	Now we don't take any mutexes when creating or dropping internal HEAP tables during SELECT. Change buffer sizes to size_t to make keycache 64 bit safe on platforms where sizeof(ulong) != sizeof(size_t) BitKeeper/etc/ignore: added support-files/mysqld_multi.server include/heap.h: Added 'internal_table' to HP_CREATE_INFO include/keycache.h: Change buffer sizes to size_t to make keycache 64 bit safe include/my_base.h: Added HA_OPEN_INTERNAL_TABLE to mark temporary tables that should be deleted on close mysys/mf_keycache.c: Change buffer sizes to size_t to make keycache 64 bit safe sql/sql_select.cc: Added HA_OPEN_INTERNAL_TABLE to mark temporary tables that should be deleted on close Removed not anymore needed call to delete_table() storage/heap/ha_heap.cc: Added support for internal temporary tables that should be deleted on close. Internal tables now use dedicated open and close calls to avoid taking mutexes. If heap_open() failes, now delete the newly created table. (This fixes a possible memory leak) Remove never executed info() in create() storage/heap/ha_heap.h: Added slots needed to handle internal temporary tables storage/heap/heapdef.h: Protect against C++ inclusion storage/heap/hp_close.c: Don't call list_delete() for internal temporary tables (They are not in the list) storage/heap/hp_create.c: Added HP_SHARE ** element to heap_create() to store the SHARE of the newly created table. For internal temporary tables: Don't take any mutex and don't put them into the open table list. storage/heap/hp_open.c: Split heap_open() into sub functions to be able to create internal temporary tables without putting them in the heap_share_list. Add faster open() functions for when we already know the 'share'. storage/heap/hp_test1.c: Update call to heap_create() Initialize all keyinfo members. storage/heap/hp_test2.c: Update call to heap_create()
		
			
				
	
	
		
			112 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (C) 2000-2002, 2004 MySQL AB
 | 
						|
 | 
						|
   This program is free software; you can redistribute it and/or modify
 | 
						|
   it under the terms of the GNU General Public License as published by
 | 
						|
   the Free Software Foundation; version 2 of the License.
 | 
						|
 | 
						|
   This program is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
   GNU General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU General Public License
 | 
						|
   along with this program; if not, write to the Free Software
 | 
						|
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 | 
						|
 | 
						|
/* This file is included in all heap-files */
 | 
						|
 | 
						|
#include <my_base.h>			/* This includes global */
 | 
						|
C_MODE_START
 | 
						|
#ifdef THREAD
 | 
						|
#include <my_pthread.h>
 | 
						|
#endif
 | 
						|
#include "heap.h"			/* Structs & some defines */
 | 
						|
#include "my_tree.h"
 | 
						|
 | 
						|
/*
 | 
						|
  When allocating keys /rows in the internal block structure, do it
 | 
						|
  within the following boundaries.
 | 
						|
 | 
						|
  The challenge is to find the balance between allocate as few blocks
 | 
						|
  as possible and keep memory consumption down.
 | 
						|
*/
 | 
						|
 | 
						|
#define HP_MIN_RECORDS_IN_BLOCK 16
 | 
						|
#define HP_MAX_RECORDS_IN_BLOCK 8192
 | 
						|
 | 
						|
	/* Some extern variables */
 | 
						|
 | 
						|
extern LIST *heap_open_list,*heap_share_list;
 | 
						|
 | 
						|
#define test_active(info) \
 | 
						|
if (!(info->update & HA_STATE_AKTIV))\
 | 
						|
{ my_errno=HA_ERR_NO_ACTIVE_RECORD; DBUG_RETURN(-1); }
 | 
						|
#define hp_find_hash(A,B) ((HASH_INFO*) hp_find_block((A),(B)))
 | 
						|
 | 
						|
	/* Find pos for record and update it in info->current_ptr */
 | 
						|
#define hp_find_record(info,pos) (info)->current_ptr= hp_find_block(&(info)->s->block,pos)
 | 
						|
 | 
						|
typedef struct st_hp_hash_info
 | 
						|
{
 | 
						|
  struct st_hp_hash_info *next_key;
 | 
						|
  uchar *ptr_to_rec;
 | 
						|
} HASH_INFO;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  HA_KEYSEG *keyseg;
 | 
						|
  uint key_length;
 | 
						|
  uint search_flag;
 | 
						|
} heap_rb_param;
 | 
						|
      
 | 
						|
	/* Prototypes for intern functions */
 | 
						|
 | 
						|
extern HP_SHARE *hp_find_named_heap(const char *name);
 | 
						|
extern int hp_rectest(HP_INFO *info,const uchar *old);
 | 
						|
extern uchar *hp_find_block(HP_BLOCK *info,ulong pos);
 | 
						|
extern int hp_get_new_block(HP_BLOCK *info, size_t* alloc_length);
 | 
						|
extern void hp_free(HP_SHARE *info);
 | 
						|
extern uchar *hp_free_level(HP_BLOCK *block,uint level,HP_PTRS *pos,
 | 
						|
			   uchar *last_pos);
 | 
						|
extern int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo,
 | 
						|
			const uchar *record, uchar *recpos);
 | 
						|
extern int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, 
 | 
						|
			   const uchar *record, uchar *recpos);
 | 
						|
extern int hp_rb_delete_key(HP_INFO *info,HP_KEYDEF *keyinfo,
 | 
						|
			    const uchar *record,uchar *recpos,int flag);
 | 
						|
extern int hp_delete_key(HP_INFO *info,HP_KEYDEF *keyinfo,
 | 
						|
			 const uchar *record,uchar *recpos,int flag);
 | 
						|
extern HASH_INFO *_heap_find_hash(HP_BLOCK *block,ulong pos);
 | 
						|
extern uchar *hp_search(HP_INFO *info,HP_KEYDEF *keyinfo,const uchar *key,
 | 
						|
		       uint nextflag);
 | 
						|
extern uchar *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo,
 | 
						|
			    const uchar *key, HASH_INFO *pos);
 | 
						|
extern ulong hp_hashnr(HP_KEYDEF *keyinfo,const uchar *key);
 | 
						|
extern ulong hp_rec_hashnr(HP_KEYDEF *keyinfo,const uchar *rec);
 | 
						|
extern ulong hp_mask(ulong hashnr,ulong buffmax,ulong maxlength);
 | 
						|
extern void hp_movelink(HASH_INFO *pos,HASH_INFO *next_link,
 | 
						|
			 HASH_INFO *newlink);
 | 
						|
extern int hp_rec_key_cmp(HP_KEYDEF *keydef,const uchar *rec1,
 | 
						|
			  const uchar *rec2,
 | 
						|
                          my_bool diff_if_only_endspace_difference);
 | 
						|
extern int hp_key_cmp(HP_KEYDEF *keydef,const uchar *rec,
 | 
						|
		      const uchar *key);
 | 
						|
extern void hp_make_key(HP_KEYDEF *keydef,uchar *key,const uchar *rec);
 | 
						|
extern uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key,
 | 
						|
			   const uchar *rec, uchar *recpos);
 | 
						|
extern uint hp_rb_key_length(HP_KEYDEF *keydef, const uchar *key);
 | 
						|
extern uint hp_rb_null_key_length(HP_KEYDEF *keydef, const uchar *key);
 | 
						|
extern uint hp_rb_var_key_length(HP_KEYDEF *keydef, const uchar *key);
 | 
						|
extern my_bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const uchar *record);
 | 
						|
extern int hp_close(register HP_INFO *info);
 | 
						|
extern void hp_clear(HP_SHARE *info);
 | 
						|
extern void hp_clear_keys(HP_SHARE *info);
 | 
						|
extern uint hp_rb_pack_key(HP_KEYDEF *keydef, uchar *key, const uchar *old,
 | 
						|
                           key_part_map keypart_map);
 | 
						|
#ifdef THREAD
 | 
						|
extern pthread_mutex_t THR_LOCK_heap;
 | 
						|
#else
 | 
						|
#define pthread_mutex_lock(A)
 | 
						|
#define pthread_mutex_unlock(A)
 | 
						|
#endif
 | 
						|
C_MODE_END
 |