MySQL 8.4.2
Source Code Documentation
ha_myisam.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2000, 2024, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License, version 2.0, for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
24
25/**
26 @file storage/myisam/ha_myisam.h
27 MyISAM storage engine.
28*/
29
30#include <stddef.h>
31#include <sys/types.h>
32
33#include "ft_global.h"
34#include "my_icp.h"
35#include "my_inttypes.h"
36#include "myisam.h"
37#include "sql/handler.h" /* handler */
38#include "sql/table.h" /* TABLE_SHARE */
39#include "sql_string.h"
40#include "typelib.h"
41
42struct TABLE_SHARE;
43struct HA_CREATE_INFO;
44
45#define HA_RECOVER_DEFAULT 1 /* Automatic recover active */
46#define HA_RECOVER_BACKUP 2 /* Make a backupfile on recover */
47#define HA_RECOVER_FORCE 4 /* Recover even if we loose rows */
48#define HA_RECOVER_QUICK 8 /* Don't check rows in data file */
49#define HA_RECOVER_OFF 16 /* No automatic recover */
50
52extern const char *myisam_recover_names[];
54extern const char *myisam_stats_method_names[];
55
56int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out,
57 MI_COLUMNDEF **recinfo_out, uint *records_out);
58int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo,
59 uint t1_keys, uint t1_recs, MI_KEYDEF *t2_keyinfo,
60 MI_COLUMNDEF *t2_recinfo, uint t2_keys, uint t2_recs,
61 bool strict);
62
64
66 public:
68 ~Myisam_handler_share() override = default;
70};
71
72class ha_myisam : public handler {
77 int repair(THD *thd, MI_CHECK &param, bool optimize);
78
79 public:
80 ha_myisam(handlerton *hton, TABLE_SHARE *table_arg);
81 ~ha_myisam() override = default;
82 handler *clone(const char *name, MEM_ROOT *mem_root) override;
83 const char *table_type() const override { return "MyISAM"; }
85 return HA_KEY_ALG_BTREE;
86 }
87 bool is_index_algorithm_supported(enum ha_key_alg key_alg) const override {
88 return key_alg == HA_KEY_ALG_BTREE || key_alg == HA_KEY_ALG_RTREE;
89 }
90 ulonglong table_flags() const override { return int_table_flags; }
91 int index_init(uint idx, bool sorted) override;
92 int index_end() override;
93 int rnd_end() override;
94
95 ulong index_flags(uint inx, uint, bool) const override {
96 if (table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) return 0;
97
100
101 // @todo: Check if spatial indexes really have all these properties
104
105 return flags;
106 }
107 uint max_supported_keys() const override { return MI_MAX_KEY; }
108 uint max_supported_key_length() const override { return MI_MAX_KEY_LENGTH; }
110 [[maybe_unused]]) const override {
111 return MI_MAX_KEY_LENGTH;
112 }
113 uint checksum() const override;
114
115 int open(const char *name, int mode, uint test_if_locked,
116 const dd::Table *table_def) override;
117 int close(void) override;
118 int write_row(uchar *buf) override;
119 int update_row(const uchar *old_data, uchar *new_data) override;
120 int delete_row(const uchar *buf) override;
121 int index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map,
122 enum ha_rkey_function find_flag) override;
123 int index_read_idx_map(uchar *buf, uint index, const uchar *key,
124 key_part_map keypart_map,
125 enum ha_rkey_function find_flag) override;
127 key_part_map keypart_map) override;
128 int index_next(uchar *buf) override;
129 int index_prev(uchar *buf) override;
130 int index_first(uchar *buf) override;
131 int index_last(uchar *buf) override;
132 int index_next_same(uchar *buf, const uchar *key, uint keylen) override;
133 int ft_init() override {
134 if (!ft_handler) return 1;
136 return 0;
137 }
138 FT_INFO *ft_init_ext(uint flags, uint inx, String *key) override {
139 return ft_init_search(flags, file, inx, pointer_cast<uchar *>(key->ptr()),
140 (uint)key->length(), key->charset(),
141 table->record[0]);
142 }
143 int ft_read(uchar *buf) override;
144 int rnd_init(bool scan) override;
145 int rnd_next(uchar *buf) override;
146 int rnd_pos(uchar *buf, uchar *pos) override;
147 void position(const uchar *record) override;
148 int info(uint) override;
149 int extra(enum ha_extra_function operation) override;
150 int extra_opt(enum ha_extra_function operation, ulong cache_size) override;
151 int reset(void) override;
152 int external_lock(THD *thd, int lock_type) override;
153 int delete_all_rows(void) override;
154 int disable_indexes(uint mode) override;
155 int enable_indexes(uint mode) override;
156 int indexes_are_disabled(void) override;
157 void start_bulk_insert(ha_rows rows) override;
158 int end_bulk_insert() override;
159 ha_rows records_in_range(uint inx, key_range *min_key,
160 key_range *max_key) override;
161 void update_create_info(HA_CREATE_INFO *create_info) override;
162 int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info,
163 dd::Table *table_def) override;
165 enum thr_lock_type lock_type) override;
166 void get_auto_increment(ulonglong offset, ulonglong increment,
167 ulonglong nb_desired_values, ulonglong *first_value,
168 ulonglong *nb_reserved_values) override;
169 int rename_table(const char *from, const char *to,
170 const dd::Table *from_table_def,
171 dd::Table *to_table_def) override;
172 int delete_table(const char *name, const dd::Table *table_def) override;
173 int check(THD *thd, HA_CHECK_OPT *check_opt) override;
174 int analyze(THD *thd, HA_CHECK_OPT *check_opt) override;
175 int repair(THD *thd, HA_CHECK_OPT *check_opt) override;
176 bool check_and_repair(THD *thd) override;
177 bool is_crashed() const override;
178 bool auto_repair() const override {
180 }
181 int optimize(THD *thd, HA_CHECK_OPT *check_opt) override;
182 int assign_to_keycache(THD *thd, HA_CHECK_OPT *check_opt) override;
183 int preload_keys(THD *thd, HA_CHECK_OPT *check_opt) override;
185 uint table_changes) override;
186 MI_INFO *file_ptr(void) { return file; }
187
188 public:
189 /**
190 * Multi Range Read interface
191 */
192 int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
193 uint n_ranges, uint mode,
194 HANDLER_BUFFER *buf) override;
195 int multi_range_read_next(char **range_info) override;
197 void *seq_init_param, uint n_ranges,
198 uint *bufsz, uint *flags,
199 Cost_estimate *cost) override;
200 ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys,
201 uint *bufsz, uint *flags,
202 Cost_estimate *cost) override;
203
204 /* Index condition pushdown implementation */
205 Item *idx_cond_push(uint keyno, Item *idx_cond) override;
206
207 private:
209 friend ICP_RESULT index_cond_func_myisam(void *arg);
210};
app_data_ptr new_data(u_int n, char *val, cons_type consensus)
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:251
Used to store optimizer cost estimates.
Definition: handler.h:3865
Definition: handler.h:7271
Base class to be used by handlers different shares.
Definition: handler.h:4115
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:936
ulong flags
dupp key and pack flags
Definition: key.h:118
Definition: ha_myisam.h:65
Myisam_handler_share()
Definition: ha_myisam.h:67
~Myisam_handler_share() override=default
MYISAM_SHARE * m_share
Definition: ha_myisam.h:69
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: table.h:47
Definition: ha_myisam.h:72
int enable_indexes(uint mode) override
Enable indexes again.
Definition: ha_myisam.cc:1299
MI_INFO * file
Definition: ha_myisam.h:73
int extra_opt(enum ha_extra_function operation, ulong cache_size) override
Definition: ha_myisam.cc:1710
int rnd_pos(uchar *buf, uchar *pos) override
Definition: ha_myisam.cc:1611
int disable_indexes(uint mode) override
Disable indexes for a while.
Definition: ha_myisam.cc:1254
void start_bulk_insert(ha_rows rows) override
Definition: ha_myisam.cc:1393
int info(uint) override
General method to gather info from handler.
Definition: ha_myisam.cc:1622
int write_row(uchar *buf) override
Write a row.
Definition: ha_myisam.cc:819
int index_end() override
Definition: ha_myisam.cc:1506
bool is_crashed() const override
Check if the table is crashed.
Definition: ha_myisam.cc:1474
DsMrr_impl ds_mrr
Definition: ha_myisam.h:208
int extra(enum ha_extra_function operation) override
Storage engine specific implementation of ha_extra()
Definition: ha_myisam.cc:1695
void get_auto_increment(ulonglong offset, ulonglong increment, ulonglong nb_desired_values, ulonglong *first_value, ulonglong *nb_reserved_values) override
Reserves an interval of auto_increment values from the handler.
Definition: ha_myisam.cc:1816
int check(THD *thd, HA_CHECK_OPT *check_opt) override
Definition: ha_myisam.cc:833
int external_lock(THD *thd, int lock_type) override
Is not invoked for non-transactional temporary tables.
Definition: ha_myisam.cc:1720
void position(const uchar *record) override
Definition: ha_myisam.cc:1617
int assign_to_keycache(THD *thd, HA_CHECK_OPT *check_opt) override
Definition: ha_myisam.cc:1139
Item * idx_cond_push(uint keyno, Item *idx_cond) override
Push down an index condition to the handler.
Definition: ha_myisam.cc:2052
int open(const char *name, int mode, uint test_if_locked, const dd::Table *table_def) override
Definition: ha_myisam.cc:701
char * index_file_name
Definition: ha_myisam.h:75
uint max_supported_key_part_length(HA_CREATE_INFO *create_info) const override
Definition: ha_myisam.h:109
int multi_range_read_next(char **range_info) override
Get next record in MRR scan.
Definition: ha_myisam.cc:2022
uint max_supported_keys() const override
Definition: ha_myisam.h:107
int index_next_same(uchar *buf, const uchar *key, uint keylen) override
Definition: ha_myisam.cc:1589
void update_create_info(HA_CREATE_INFO *create_info) override
Update create info as part of ALTER TABLE.
Definition: ha_myisam.cc:1736
int index_read_idx_map(uchar *buf, uint index, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag) override
Positions an index cursor to the index specified in argument.
Definition: ha_myisam.cc:1533
ulonglong table_flags() const override
Definition: ha_myisam.h:90
int preload_keys(THD *thd, HA_CHECK_OPT *check_opt) override
Definition: ha_myisam.cc:1179
int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint mode, HANDLER_BUFFER *buf) override
Multi Range Read interface.
Definition: ha_myisam.cc:2015
THR_LOCK_DATA ** store_lock(THD *thd, THR_LOCK_DATA **to, enum thr_lock_type lock_type) override
Is not invoked for non-transactional temporary tables.
Definition: ha_myisam.cc:1728
int index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map) override
The following functions works like index_read, but it find the last row with the current key value or...
Definition: ha_myisam.cc:1547
ulong index_flags(uint inx, uint, bool) const override
Definition: ha_myisam.h:95
int end_bulk_insert() override
Definition: ha_myisam.cc:1429
int index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag) override
Positions an index cursor to the index specified in the handle ('active_index').
Definition: ha_myisam.cc:1520
int rename_table(const char *from, const char *to, const dd::Table *from_table_def, dd::Table *to_table_def) override
Default rename_table() and delete_table() rename/delete files with a given name and extensions from h...
Definition: ha_myisam.cc:1811
int rnd_init(bool scan) override
rnd_init() can be called two times without rnd_end() in between (it only makes sense if scan=1).
Definition: ha_myisam.cc:1600
int delete_row(const uchar *buf) override
Definition: ha_myisam.cc:1484
bool is_index_algorithm_supported(enum ha_key_alg key_alg) const override
Check if SE supports specific key algorithm.
Definition: ha_myisam.h:87
bool auto_repair() const override
Check if the table can be automatically repaired.
Definition: ha_myisam.h:178
ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys, uint *bufsz, uint *flags, Cost_estimate *cost) override
Get cost and other information about MRR scan over some sequence of ranges.
Definition: ha_myisam.cc:2041
int delete_all_rows(void) override
Delete all rows in a table.
Definition: ha_myisam.cc:1714
int index_next(uchar *buf) override
Definition: ha_myisam.cc:1561
int analyze(THD *thd, HA_CHECK_OPT *check_opt) override
Definition: ha_myisam.cc:912
FT_INFO * ft_init_ext(uint flags, uint inx, String *key) override
Definition: ha_myisam.h:138
int update_row(const uchar *old_data, uchar *new_data) override
Update a single row.
Definition: ha_myisam.cc:1479
int ft_read(uchar *buf) override
Definition: ha_myisam.cc:1889
MI_INFO * file_ptr(void)
Definition: ha_myisam.h:186
uint checksum() const override
Definition: ha_myisam.cc:1901
enum ha_key_alg get_default_index_algorithm() const override
Get default key algorithm for SE.
Definition: ha_myisam.h:84
int rnd_end() override
Definition: ha_myisam.cc:1515
ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key) override
Find number of records in a range.
Definition: ha_myisam.cc:1884
bool can_enable_indexes
Definition: ha_myisam.h:76
handler * clone(const char *name, MEM_ROOT *mem_root) override
Definition: ha_myisam.cc:640
int delete_table(const char *name, const dd::Table *table_def) override
Delete a table.
Definition: ha_myisam.cc:1716
char * data_file_name
Definition: ha_myisam.h:75
int repair(THD *thd, MI_CHECK &param, bool optimize)
Definition: ha_myisam.cc:1003
int close(void) override
Definition: ha_myisam.cc:799
int index_last(uchar *buf) override
Definition: ha_myisam.cc:1582
int index_init(uint idx, bool sorted) override
Definition: ha_myisam.cc:1499
~ha_myisam() override=default
ha_myisam(handlerton *hton, TABLE_SHARE *table_arg)
Definition: ha_myisam.cc:626
uint max_supported_key_length() const override
Definition: ha_myisam.h:108
int indexes_are_disabled(void) override
Check if indexes are disabled.
Definition: ha_myisam.cc:1375
int index_first(uchar *buf) override
Definition: ha_myisam.cc:1575
ulonglong int_table_flags
Definition: ha_myisam.h:74
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info, dd::Table *table_def) override
Create table (implementation).
Definition: ha_myisam.cc:1745
const char * table_type() const override
The following can be called without an open handler.
Definition: ha_myisam.h:83
int index_prev(uchar *buf) override
Definition: ha_myisam.cc:1568
ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint *bufsz, uint *flags, Cost_estimate *cost) override
Get cost and other information about MRR scan over a known list of ranges.
Definition: ha_myisam.cc:2026
bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes) override
Part of old, deprecated in-place ALTER API.
Definition: ha_myisam.cc:1903
int ft_init() override
Definition: ha_myisam.h:133
bool check_and_repair(THD *thd) override
Check and repair the table if necessary.
Definition: ha_myisam.cc:1450
friend ICP_RESULT index_cond_func_myisam(void *arg)
Definition: ha_myisam.cc:1489
int reset(void) override
Reset state of file to after 'open'.
Definition: ha_myisam.cc:1699
int rnd_next(uchar *buf) override
Definition: ha_myisam.cc:1605
int optimize(THD *thd, HA_CHECK_OPT *check_opt) override
Definition: ha_myisam.cc:983
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4573
TABLE_SHARE * table_share
Definition: handler.h:4580
FT_INFO * ft_handler
Definition: handler.h:4658
TABLE * table
Definition: handler.h:4581
A table definition from the master.
Definition: rpl_utility.h:248
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
Some definitions for full-text indices.
FT_INFO * ft_init_search(uint, void *, uint, uchar *, uint, const CHARSET_INFO *, uchar *)
Definition: ft_static.cc:66
const char * myisam_recover_names[]
Definition: ha_myisam.cc:77
ulonglong myisam_recover_options
Definition: ha_myisam.cc:68
int check_definition(MI_KEYDEF *t1_keyinfo, MI_COLUMNDEF *t1_recinfo, uint t1_keys, uint t1_recs, MI_KEYDEF *t2_keyinfo, MI_COLUMNDEF *t2_recinfo, uint t2_keys, uint t2_recs, bool strict)
Definition: ha_myisam.cc:435
TYPELIB myisam_recover_typelib
Definition: ha_myisam.cc:79
int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, MI_COLUMNDEF **recinfo_out, uint *records_out)
Definition: ha_myisam.cc:242
const char * myisam_stats_method_names[]
Definition: ha_myisam.cc:82
ICP_RESULT index_cond_func_myisam(void *arg)
Definition: ha_myisam.cc:1489
#define HA_RECOVER_OFF
Definition: ha_myisam.h:49
static int flags[50]
Definition: hp_test1.cc:40
static uint keys
Definition: hp_test2.cc:49
#define HA_SPATIAL
Spatial key.
Definition: my_base.h:509
ha_key_alg
Definition: my_base.h:98
@ HA_KEY_ALG_RTREE
Definition: my_base.h:109
@ HA_KEY_ALG_BTREE
Definition: my_base.h:108
@ HA_KEY_ALG_FULLTEXT
Definition: my_base.h:111
ha_rkey_function
Definition: my_base.h:78
ulong key_part_map
Definition: my_base.h:1008
my_off_t ha_rows
Definition: my_base.h:1141
ha_extra_function
Definition: my_base.h:185
enum icp_result ICP_RESULT
Values returned by index_cond_func_xxx functions.
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
unsigned char uchar
Definition: my_inttypes.h:52
This file should be included when using myisam functions.
#define MI_MAX_KEY_LENGTH
Definition: myisam.h:63
#define MI_MAX_KEY
Definition: myisam.h:55
static int record
Definition: mysqltest.cc:195
Definition: buf0block_hint.cc:30
Definition: os0file.h:89
mode
Definition: file_handle.h:61
required string key
Definition: replication_asynchronous_connection_failover.proto:60
#define HA_READ_NEXT
Definition: handler.h:534
#define HA_KEY_SCAN_NOT_ROR
Definition: handler.h:584
#define HA_KEYREAD_ONLY
Definition: handler.h:579
#define HA_READ_ORDER
Definition: handler.h:550
#define HA_READ_RANGE
Definition: handler.h:557
#define HA_DO_INDEX_COND_PUSHDOWN
Definition: handler.h:585
#define HA_READ_PREV
Definition: handler.h:538
Our own string classes, used pervasively throughout the executor.
case opt name
Definition: sslopt-case.h:29
Definition: ft_global.h:72
struct _ft_vft * please
Definition: ft_global.h:73
Definition: handler.h:3804
Definition: handler.h:3791
Struct to hold information about the table that should be created.
Definition: handler.h:3202
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: myisam.h:343
Definition: myisam.h:228
Definition: myisamdef.h:253
Definition: myisam.h:173
Definition: myisamdef.h:178
Definition: handler.h:3812
This structure is shared between different table objects.
Definition: table.h:701
KEY * key_info
Definition: table.h:751
Definition: table.h:1406
uchar * record[2]
Definition: table.h:1453
Definition: thr_lock.h:124
Definition: typelib.h:35
void(* reinit_search)(FT_INFO *)
Definition: ft_global.h:53
handlerton is a singleton structure - one instance per storage engine - to provide access to storage ...
Definition: handler.h:2734
Definition: my_base.h:1125
thr_lock_type
Definition: thr_lock.h:51
static uint64_t cache_size
Definition: xcom_cache.cc:362