MySQL 8.4.2
Source Code Documentation
heapdef.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24/* This file is included in all heap-files */
25
26#include "heap.h" /* Structs & some defines */
27#include "my_base.h" /* This includes global */
28#include "my_sys.h"
29#include "my_thread.h"
30#include "my_thread_local.h"
31#include "my_tree.h"
32
33/*
34 When allocating keys /rows in the internal block structure, do it
35 within the following boundaries.
36
37 The challenge is to find the balance between allocate as few blocks
38 as possible and keep memory consumption down.
39*/
40
41#define HP_MIN_RECORDS_IN_BLOCK 16
42#define HP_MAX_RECORDS_IN_BLOCK 8192
43
44/* Some extern variables */
45
47
48#define test_active(info) \
49 if (!(info->update & HA_STATE_AKTIV)) { \
50 set_my_errno(HA_ERR_NO_ACTIVE_RECORD); \
51 return -1; \
52 }
53#define hp_find_hash(A, B) ((HASH_INFO *)hp_find_block((A), (B)))
54
55/* Find pos for record and update it in info->current_ptr */
56#define hp_find_record(info, pos) \
57 (info)->current_ptr = hp_find_block(&(info)->s->block, pos)
58
59struct HASH_INFO {
62 ulong hash; /* Cached key hash value. */
63};
64
65typedef struct {
70
71/* Prototypes for intern functions */
72
73extern HP_SHARE *hp_find_named_heap(const char *name);
74extern int hp_rectest(HP_INFO *info, const uchar *old);
75extern uchar *hp_find_block(HP_BLOCK *info, ulong pos);
76extern int hp_get_new_block(HP_BLOCK *info, size_t *alloc_length);
77extern void hp_free(HP_SHARE *info);
78extern uchar *hp_free_level(HP_BLOCK *block, uint level, HP_PTRS *pos,
79 uchar *last_pos);
80extern int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *record,
81 uchar *recpos);
82extern int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo,
83 const uchar *record, uchar *recpos);
84extern int hp_rb_delete_key(HP_INFO *info, HP_KEYDEF *keyinfo,
85 const uchar *record, uchar *recpos, int flag);
86extern int hp_delete_key(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *record,
87 uchar *recpos, int flag);
88extern HASH_INFO *_heap_find_hash(HP_BLOCK *block, ulong pos);
89extern uchar *hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *key,
90 uint nextflag);
91extern uchar *hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo,
92 const uchar *key, HASH_INFO *pos);
93extern uint64 hp_hashnr(HP_KEYDEF *keyinfo, const uchar *key);
94extern uint64 hp_rec_hashnr(HP_KEYDEF *keyinfo, const uchar *rec);
95extern uint64 hp_mask(uint64 hashnr, uint64 buffmax, uint64 maxlength);
96extern void hp_movelink(HASH_INFO *pos, HASH_INFO *next_link,
97 HASH_INFO *newlink);
98extern int hp_rec_key_cmp(HP_KEYDEF *keydef, const uchar *rec1,
99 const uchar *rec2);
100extern int hp_key_cmp(HP_KEYDEF *keydef, const uchar *rec, const uchar *key);
101extern void hp_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec);
102extern uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec,
103 uchar *recpos);
104extern uint hp_rb_key_length(HP_KEYDEF *keydef, const uchar *key);
105extern uint hp_rb_null_key_length(HP_KEYDEF *keydef, const uchar *key);
106extern uint hp_rb_var_key_length(HP_KEYDEF *keydef, const uchar *key);
107extern bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const uchar *record);
108extern int hp_close(HP_INFO *info);
109extern void hp_clear(HP_SHARE *info);
110extern void hp_clear_keys(HP_SHARE *info);
111extern uint hp_rb_pack_key(const HP_KEYDEF *keydef, uchar *key,
112 const uchar *old, key_part_map keypart_map);
113
115
120
121#ifdef HAVE_PSI_INTERFACE
122
123void init_heap_psi_keys();
124#endif /* HAVE_PSI_INTERFACE */
unsigned int PSI_memory_key
Instrumented memory key.
Definition: psi_memory_bits.h:49
uchar * hp_free_level(HP_BLOCK *block, uint level, HP_PTRS *pos, uchar *last_pos)
Definition: hp_block.cc:132
LIST * heap_share_list
Definition: heapdef.h:46
uint64 hp_hashnr(HP_KEYDEF *keyinfo, const uchar *key)
Definition: hp_hash.cc:228
void hp_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec)
Definition: hp_hash.cc:527
uint hp_rb_pack_key(const HP_KEYDEF *keydef, uchar *key, const uchar *old, key_part_map keypart_map)
Definition: hp_hash.cc:630
int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *record, uchar *recpos)
Definition: hp_write.cc:204
int hp_rec_key_cmp(HP_KEYDEF *keydef, const uchar *rec1, const uchar *rec2)
Definition: hp_hash.cc:367
uint hp_rb_var_key_length(HP_KEYDEF *keydef, const uchar *key)
Definition: hp_hash.cc:706
uint hp_rb_key_length(HP_KEYDEF *keydef, const uchar *key)
Definition: hp_hash.cc:691
uint hp_rb_make_key(HP_KEYDEF *keydef, uchar *key, const uchar *rec, uchar *recpos)
Definition: hp_hash.cc:558
LIST * heap_open_list
Definition: hp_static.cc:37
PSI_memory_key hp_key_memory_HP_KEYDEF
Definition: hp_static.cc:42
int hp_close(HP_INFO *info)
Definition: hp_close.cc:42
PSI_memory_key hp_key_memory_HP_PTRS
Definition: hp_static.cc:41
uchar * hp_search_next(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *key, HASH_INFO *pos)
Definition: hp_hash.cc:176
int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *record, uchar *recpos)
Definition: hp_write.cc:108
uint hp_rb_null_key_length(HP_KEYDEF *keydef, const uchar *key)
Definition: hp_hash.cc:695
uchar * hp_search(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *key, uint nextflag)
Definition: hp_hash.cc:107
void init_heap_psi_keys()
Definition: hp_static.cc:52
mysql_mutex_t THR_LOCK_heap
Definition: my_thr_init.cc:74
uint64 hp_mask(uint64 hashnr, uint64 buffmax, uint64 maxlength)
Definition: hp_hash.cc:205
int hp_rb_delete_key(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *record, uchar *recpos, int flag)
Definition: hp_delete.cc:76
int hp_rectest(HP_INFO *info, const uchar *old)
Definition: _rectest.cc:31
void hp_free(HP_SHARE *info)
Definition: hp_create.cc:312
uchar * hp_find_block(HP_BLOCK *info, ulong pos)
Definition: hp_block.cc:42
int hp_get_new_block(HP_BLOCK *info, size_t *alloc_length)
Definition: hp_block.cc:68
uint64 hp_rec_hashnr(HP_KEYDEF *keyinfo, const uchar *rec)
Definition: hp_hash.cc:295
bool hp_if_null_in_key(HP_KEYDEF *keyinfo, const uchar *record)
Definition: hp_hash.cc:728
int hp_key_cmp(HP_KEYDEF *keydef, const uchar *rec, const uchar *key)
Definition: hp_hash.cc:445
PSI_memory_key hp_key_memory_HP_SHARE
Definition: hp_static.cc:39
void hp_clear(HP_SHARE *info)
Definition: hp_clear.cc:38
HP_SHARE * hp_find_named_heap(const char *name)
Definition: hp_open.cc:137
void hp_clear_keys(HP_SHARE *info)
Definition: hp_clear.cc:83
int hp_delete_key(HP_INFO *info, HP_KEYDEF *keyinfo, const uchar *record, uchar *recpos, int flag)
Definition: hp_delete.cc:110
HASH_INFO * _heap_find_hash(HP_BLOCK *block, ulong pos)
void hp_movelink(HASH_INFO *pos, HASH_INFO *next_link, HASH_INFO *newlink)
Definition: hp_hash.cc:217
PSI_memory_key hp_key_memory_HP_INFO
Definition: hp_static.cc:40
static int flag
Definition: hp_test1.cc:40
This file includes constants used by all storage engines.
ulong key_part_map
Definition: my_base.h:1008
unsigned char uchar
Definition: my_inttypes.h:52
uint64_t uint64
Definition: my_inttypes.h:69
Common header for many mysys elements.
Defines to make different thread packages compatible.
static int record
Definition: mysqltest.cc:195
required string key
Definition: replication_asynchronous_connection_failover.proto:60
case opt name
Definition: sslopt-case.h:29
Definition: heapdef.h:59
HASH_INFO * next_key
Definition: heapdef.h:60
ulong hash
Definition: heapdef.h:62
uchar * ptr_to_rec
Definition: heapdef.h:61
Definition: my_compare.h:60
Definition: heap.h:109
Definition: heap.h:168
Definition: heap.h:121
Definition: heap.h:71
Definition: heap.h:141
Definition: my_list.h:36
Definition: heapdef.h:65
uint key_length
Definition: heapdef.h:67
uint search_flag
Definition: heapdef.h:68
HA_KEYSEG * keyseg
Definition: heapdef.h:66
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:50