MySQL 8.0.37
Source Code Documentation
handler.h
Go to the documentation of this file.
1#ifndef HANDLER_INCLUDED
2#define HANDLER_INCLUDED
3
4/*
5 Copyright (c) 2000, 2024, Oracle and/or its affiliates.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License, version 2.0,
9 as published by the Free Software Foundation.
10
11 This program is designed to work with certain software (including
12 but not limited to OpenSSL) that is licensed under separate terms,
13 as designated in a particular file or component or in included license
14 documentation. The authors of MySQL hereby grant you an additional
15 permission to link the program and your derivative works with the
16 separately licensed software that they have either included with
17 the program or referenced in the documentation.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License, version 2.0, for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27*/
28
29/* Definitions for parameters to do with handler-routines */
30
31#include <fcntl.h>
32#include <float.h>
33#include <string.h>
34#include <sys/types.h>
35#include <time.h>
36#include <algorithm>
37#include <bitset>
38#include <functional>
39#include <map>
40#include <optional>
41#include <random> // std::mt19937
42#include <set>
43#include <string>
44#include <string_view>
45
47#include "ft_global.h" // ft_hints
48#include "lex_string.h"
49#include "m_ctype.h"
50#include "map_helpers.h"
51#include "my_alloc.h"
52#include "my_base.h"
53#include "my_bitmap.h"
54#include "my_checksum.h" // ha_checksum
55#include "my_compiler.h"
56#include "my_dbug.h"
57#include "my_double2ulonglong.h"
58#include "my_inttypes.h"
59#include "my_io.h"
60#include "my_sys.h"
61#include "my_table_map.h"
62#include "my_thread_local.h" // my_errno
64#include "sql/dd/object_id.h" // dd::Object_id
65#include "sql/dd/string_type.h"
66#include "sql/dd/types/object_table.h" // dd::Object_table
67#include "sql/discrete_interval.h" // Discrete_interval
68#include "sql/key.h"
69#include "sql/sql_const.h" // SHOW_COMP_OPTION
70#include "sql/sql_list.h" // SQL_I_List
71#include "sql/sql_plugin_ref.h" // plugin_ref
72#include "thr_lock.h" // thr_lock_type
73#include "typelib.h"
74
75class Alter_info;
76class Create_field;
77class Field;
78class Item;
79class JOIN;
80class Json_dom;
82class Plugin_table;
84class Record_buffer;
85class SE_cost_constants; // see opt_costconstants.h
86class String;
87class THD;
88class handler;
89class partition_info;
91
92namespace dd {
93class Properties;
94} // namespace dd
95struct AccessPath;
96struct JoinHypergraph;
97struct KEY_CACHE;
98struct LEX;
99struct MY_BITMAP;
100struct SAVEPOINT;
101struct TABLE;
102class Table_ref;
103struct TABLE_SHARE;
104struct Tablespace_options;
105struct handlerton;
106
107typedef struct xid_t XID;
109struct MDL_key;
110
111namespace dd {
112enum class enum_column_types;
113class Table;
114class Tablespace;
115} // namespace dd
116
117constexpr const ha_rows EXTRA_RECORDS{10};
118
119/** Id for identifying Table SDIs */
120constexpr const uint32 SDI_TYPE_TABLE = 1;
121
122/** Id for identifying Tablespace SDIs */
123constexpr const uint32 SDI_TYPE_TABLESPACE = 2;
124
125/** Key to identify a dictionary object */
126struct sdi_key_t {
127 /** Type of Object, For ex: column, index, etc */
129
130 /** Object id which should be unique in tablespsace */
132};
133
134using sdi_container = std::vector<sdi_key_t>;
137};
138
139typedef bool (*qc_engine_callback)(THD *thd, const char *table_key,
140 uint key_length, ulonglong *engine_data);
141
142typedef bool(stat_print_fn)(THD *thd, const char *type, size_t type_len,
143 const char *file, size_t file_len,
144 const char *status, size_t status_len);
145
146class ha_statistics;
148class Unique_on_insert;
149
150extern ulong savepoint_alloc_size;
151
152/// Maps from slot to plugin. May return NULL if plugin has been unloaded.
154/// Returns the size of the array holding pointers to plugins.
155size_t num_hton2plugins();
156
157/**
158 For unit testing.
159 Insert plugin into arbitrary slot in array.
160 Remove plugin from arbitrary slot in array.
161*/
164
165extern const char *ha_row_type[];
166extern const char *tx_isolation_names[];
167extern const char *binlog_format_names[];
169extern ulong total_ha_2pc;
170
171// the following is for checking tables
172
173#define HA_ADMIN_ALREADY_DONE 1
174#define HA_ADMIN_OK 0
175#define HA_ADMIN_NOT_IMPLEMENTED -1
176#define HA_ADMIN_FAILED -2
177#define HA_ADMIN_CORRUPT -3
178#define HA_ADMIN_INTERNAL_ERROR -4
179#define HA_ADMIN_INVALID -5
180#define HA_ADMIN_REJECT -6
181#define HA_ADMIN_TRY_ALTER -7
182#define HA_ADMIN_WRONG_CHECKSUM -8
183#define HA_ADMIN_NOT_BASE_TABLE -9
184#define HA_ADMIN_NEEDS_UPGRADE -10
185#define HA_ADMIN_NEEDS_ALTER -11
186#define HA_ADMIN_NEEDS_CHECK -12
187#define HA_ADMIN_STATS_UPD_ERR -13
188/** User needs to dump and re-create table to fix pre 5.0 decimal types */
189#define HA_ADMIN_NEEDS_DUMP_UPGRADE -14
190
191/**
192 Return values for check_if_supported_inplace_alter().
193
194 @see check_if_supported_inplace_alter() for description of
195 the individual values.
196*/
207
208/* Bits in table_flags() to show what database can do */
209
210#define HA_NO_TRANSACTIONS (1 << 0) /* Doesn't support transactions */
211#define HA_PARTIAL_COLUMN_READ (1 << 1) /* read may not return all columns */
212/*
213 Used to avoid scanning full tables on an index. If this flag is set then
214 the handler always has a primary key (hidden if not defined) and this
215 index is used for scanning rather than a full table scan in all
216 situations. No separate data/index file.
217*/
218#define HA_TABLE_SCAN_ON_INDEX (1 << 2)
219
220/// Not in use.
221#define HA_UNUSED3 (1 << 3)
222
223/*
224 Can the storage engine handle spatial data.
225 Used to check that no spatial attributes are declared unless
226 the storage engine is capable of handling it.
227*/
228#define HA_CAN_GEOMETRY (1 << 4)
229/*
230 Reading keys in random order is as fast as reading keys in sort order
231 (Used by filesort to decide if we should sort key + data or key +
232 pointer-to-row.)
233*/
234#define HA_FAST_KEY_READ (1 << 5)
235/*
236 Set the following flag if we on delete should force all key to be read
237 and on update read all keys that changes
238*/
239#define HA_REQUIRES_KEY_COLUMNS_FOR_DELETE (1 << 6)
240/*
241 Is NULL values allowed in indexes.
242 If this is not allowed then it is not possible to use an index on a
243 NULLable field.
244*/
245#define HA_NULL_IN_KEY (1 << 7)
246/*
247 Tells that we can the position for the conflicting duplicate key
248 record is stored in table->file->dupp_ref. (insert uses rnd_pos() on
249 this to find the duplicated row)
250*/
251#define HA_DUPLICATE_POS (1 << 8)
252#define HA_NO_BLOBS (1 << 9) /* Doesn't support blobs */
253/*
254 Is the storage engine capable of defining an index of a prefix on
255 a BLOB attribute.
256*/
257#define HA_CAN_INDEX_BLOBS (1 << 10)
258/*
259 Auto increment fields can be part of a multi-part key. For second part
260 auto-increment keys, the auto_incrementing is done in handler.cc
261*/
262#define HA_AUTO_PART_KEY (1 << 11)
263/*
264 Can't define a table without primary key (and cannot handle a table
265 with hidden primary key)
266*/
267#define HA_REQUIRE_PRIMARY_KEY (1 << 12)
268/*
269 Does the counter of records after the info call specify an exact
270 value or not. If it does this flag is set.
271*/
272#define HA_STATS_RECORDS_IS_EXACT (1 << 13)
273/// Not in use.
274#define HA_UNUSED14 (1 << 14)
275/*
276 This parameter is set when the handler will also return the primary key
277 when doing read-only-key on another index, i.e., if we get the primary
278 key columns for free when we do an index read (usually, it also implies
279 that HA_PRIMARY_KEY_REQUIRED_FOR_POSITION flag is set).
280*/
281#define HA_PRIMARY_KEY_IN_READ_INDEX (1 << 15)
282/*
283 If HA_PRIMARY_KEY_REQUIRED_FOR_POSITION is set, it means that to position()
284 uses a primary key given by the record argument.
285 Without primary key, we can't call position().
286 If not set, the position is returned as the current rows position
287 regardless of what argument is given.
288*/
289#define HA_PRIMARY_KEY_REQUIRED_FOR_POSITION (1 << 16)
290#define HA_CAN_RTREEKEYS (1 << 17)
291/// Not in use.
292#define HA_UNUSED18
293/*
294 The following is we need to a primary key to delete (and update) a row.
295 If there is no primary key, all columns needs to be read on update and delete
296*/
297#define HA_PRIMARY_KEY_REQUIRED_FOR_DELETE (1 << 19)
298/*
299 Indexes on prefixes of character fields are not allowed.
300*/
301#define HA_NO_PREFIX_CHAR_KEYS (1 << 20)
302/*
303 Does the storage engine support fulltext indexes.
304*/
305#define HA_CAN_FULLTEXT (1 << 21)
306/*
307 Can the HANDLER interface in the MySQL API be used towards this
308 storage engine.
309*/
310#define HA_CAN_SQL_HANDLER (1 << 22)
311/*
312 Set if the storage engine does not support auto increment fields.
313*/
314#define HA_NO_AUTO_INCREMENT (1 << 23)
315/*
316 Supports CHECKSUM option in CREATE TABLE (MyISAM feature).
317*/
318#define HA_HAS_CHECKSUM (1 << 24)
319/*
320 Table data are stored in separate files (for lower_case_table_names).
321 Should file names always be in lower case (used by engines that map
322 table names to file names.
323*/
324#define HA_FILE_BASED (1 << 26)
325#define HA_NO_VARCHAR (1 << 27)
326/*
327 Is the storage engine capable of handling bit fields.
328*/
329#define HA_CAN_BIT_FIELD (1 << 28)
330#define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30)
331#define HA_NO_COPY_ON_ALTER (1LL << 31)
332#define HA_COUNT_ROWS_INSTANT (1LL << 32) /* records() gives exact count*/
333/* Has it's own method of binlog logging */
334#define HA_HAS_OWN_BINLOGGING (1LL << 33)
335/*
336 Engine is capable of row-format and statement-format logging,
337 respectively
338*/
339#define HA_BINLOG_ROW_CAPABLE (1LL << 34)
340#define HA_BINLOG_STMT_CAPABLE (1LL << 35)
341/*
342 When a multiple key conflict happens in a REPLACE command mysql
343 expects the conflicts to be reported in the ascending order of
344 key names.
345
346 For e.g.
347
348 CREATE TABLE t1 (a INT, UNIQUE (a), b INT NOT NULL, UNIQUE (b), c INT NOT
349 NULL, INDEX(c));
350
351 REPLACE INTO t1 VALUES (1,1,1),(2,2,2),(2,1,3);
352
353 MySQL expects the conflict with 'a' to be reported before the conflict with
354 'b'.
355
356 If the underlying storage engine does not report the conflicting keys in
357 ascending order, it causes unexpected errors when the REPLACE command is
358 executed.
359
360 This flag helps the underlying SE to inform the server that the keys are not
361 ordered.
362*/
363#define HA_DUPLICATE_KEY_NOT_IN_ORDER (1LL << 36)
364/*
365 Engine supports REPAIR TABLE. Used by CHECK TABLE FOR UPGRADE if an
366 incompatible table is detected. If this flag is set, CHECK TABLE FOR UPGRADE
367 will report ER_TABLE_NEEDS_UPGRADE, otherwise ER_TABLE_NEED_REBUILD.
368*/
369#define HA_CAN_REPAIR (1LL << 37)
370
371/*
372 Set of all binlog flags. Currently only contain the capabilities
373 flags.
374 */
375#define HA_BINLOG_FLAGS (HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE)
376
377/**
378 The handler supports read before write removal optimization
379
380 Read before write removal may be used for storage engines which support
381 write without previous read of the row to be updated. Handler returning
382 this flag must implement start_read_removal() and end_read_removal().
383 The handler may return "fake" rows constructed from the key of the row
384 asked for. This is used to optimize UPDATE and DELETE by reducing the
385 number of round-trips between handler and storage engine.
386
387 Example:
388 UPDATE a=1 WHERE pk IN (@<keys@>)
389
390 @verbatim
391 mysql_update()
392 {
393 if (<conditions for starting read removal>)
394 start_read_removal()
395 -> handler returns true if read removal supported for this table/query
396
397 while(read_record("pk=<key>"))
398 -> handler returns fake row with column "pk" set to <key>
399
400 ha_update_row()
401 -> handler sends write "a=1" for row with "pk=<key>"
402
403 end_read_removal()
404 -> handler returns the number of rows actually written
405 }
406 @endverbatim
407
408 @note This optimization in combination with batching may be used to
409 remove even more round-trips.
410*/
411#define HA_READ_BEFORE_WRITE_REMOVAL (1LL << 38)
412
413/*
414 Engine supports extended fulltext API
415 */
416#define HA_CAN_FULLTEXT_EXT (1LL << 39)
417
418/*
419 Storage engine doesn't synchronize result set with expected table contents.
420 Used by replication slave to check if it is possible to retrieve rows from
421 the table when deciding whether to do a full table scan, index scan or hash
422 scan while applying a row event.
423 */
424#define HA_READ_OUT_OF_SYNC (1LL << 40)
425
426/*
427 Storage engine supports table export using the
428 FLUSH TABLE <table_list> FOR EXPORT statement.
429 */
430#define HA_CAN_EXPORT (1LL << 41)
431
432/*
433 The handler don't want accesses to this table to
434 be const-table optimized
435*/
436#define HA_BLOCK_CONST_TABLE (1LL << 42)
437
438/*
439 Handler supports FULLTEXT hints
440*/
441#define HA_CAN_FULLTEXT_HINTS (1LL << 43)
442
443/**
444 Storage engine doesn't support LOCK TABLE ... READ LOCAL locks
445 but doesn't want to use handler::store_lock() API for upgrading
446 them to LOCK TABLE ... READ locks, for example, because it doesn't
447 use THR_LOCK locks at all.
448*/
449#define HA_NO_READ_LOCAL_LOCK (1LL << 44)
450
451/**
452 A storage engine is compatible with the attachable transaction requirements
453 means that
454
455 - either SE detects the fact that THD::ha_data was reset and starts a new
456 attachable transaction, closes attachable transaction on close_connection
457 and resumes regular (outer) transaction when THD::ha_data is restored;
458
459 - or SE completely ignores THD::ha_data and close_connection like MyISAM
460 does.
461*/
462#define HA_ATTACHABLE_TRX_COMPATIBLE (1LL << 45)
463
464/**
465 Handler supports Generated Columns
466*/
467#define HA_GENERATED_COLUMNS (1LL << 46)
468
469/**
470 Supports index on virtual generated column
471*/
472#define HA_CAN_INDEX_VIRTUAL_GENERATED_COLUMN (1LL << 47)
473
474/**
475 Supports descending indexes
476*/
477#define HA_DESCENDING_INDEX (1LL << 48)
478
479/**
480 Supports partial update of BLOB columns.
481*/
482#define HA_BLOB_PARTIAL_UPDATE (1LL << 49)
483
484/**
485 If this isn't defined, only columns/indexes with Cartesian coordinate systems
486 (projected SRS or SRID 0) is supported. Columns/indexes without SRID
487 restriction is also supported if this isn't defined.
488*/
489#define HA_SUPPORTS_GEOGRAPHIC_GEOMETRY_COLUMN (1LL << 50)
490
491/**
492 Handler supports expressions as DEFAULT for a column.
493*/
494#define HA_SUPPORTS_DEFAULT_EXPRESSION (1LL << 51)
495
496/**
497 Handlers with this flag set do not support UPDATE operations.
498*/
499#define HA_UPDATE_NOT_SUPPORTED (1LL << 52)
500
501/**
502 Handlers with this flag set do not support DELETE operations.
503*/
504#define HA_DELETE_NOT_SUPPORTED (1LL << 53)
505
506/**
507 The storage engine does not support using indexes for access. Indexes can only
508 be used for estimating cost.
509*/
510#define HA_NO_INDEX_ACCESS (1LL << 54)
511
512/**
513 Supports multi-valued index
514*/
515#define HA_MULTI_VALUED_KEY_SUPPORT (1LL << 55)
516
517/*
518 Bits in index_flags(index_number) for what you can do with index.
519 If you do not implement indexes, just return zero here.
520*/
521/*
522 Does the index support read next, this is assumed in the server
523 code and never checked so all indexes must support this.
524 Note that the handler can be used even if it doesn't have any index.
525*/
526#define HA_READ_NEXT 1 /* TODO really use this flag */
527/*
528 Can the index be used to scan backwards (supports ::index_prev).
529*/
530#define HA_READ_PREV 2
531/*
532 Can the index deliver its record in index order. Typically true for
533 all ordered indexes and not true for hash indexes. Used to set keymap
534 part_of_sortkey.
535 This keymap is only used to find indexes usable for resolving an ORDER BY
536 in the query. Thus in most cases index_read will work just fine without
537 order in result production. When this flag is set it is however safe to
538 order all output started by index_read since most engines do this. With
539 read_multi_range calls there is a specific flag setting order or not
540 order so in those cases ordering of index output can be avoided.
541*/
542#define HA_READ_ORDER 4
543/*
544 Specify whether index can handle ranges, typically true for all
545 ordered indexes and not true for hash indexes.
546 Used by optimiser to check if ranges (as key >= 5) can be optimised
547 by index.
548*/
549#define HA_READ_RANGE 8
550/*
551 Can't use part key searches. This is typically true for hash indexes
552 and typically not true for ordered indexes.
553*/
554#define HA_ONLY_WHOLE_INDEX 16
555/*
556 Index does not store NULL values, even if the column is nullable.
557 (KEY::flags may still contain HA_NULL_PART_KEY)
558 If the key has a NULL-value, the handler need to do a full table scan
559 instead of using this key. This is typically true for NDB hash indexes.
560*/
561#define HA_TABLE_SCAN_ON_NULL 32
562/*
563 Does the storage engine support index-only scans on this index.
564 Enables use of HA_EXTRA_KEYREAD and HA_EXTRA_NO_KEYREAD
565 Used to set Key_map keys_for_keyread and to check in optimiser for
566 index-only scans. When doing a read under HA_EXTRA_KEYREAD the handler
567 only have to fill in the columns the key covers. If
568 HA_PRIMARY_KEY_IN_READ_INDEX is set then also the PRIMARY KEY columns
569 must be updated in the row.
570*/
571#define HA_KEYREAD_ONLY 64
572/*
573 Index scan will not return records in rowid order. Not guaranteed to be
574 set for unordered (e.g. HASH) indexes.
575*/
576#define HA_KEY_SCAN_NOT_ROR 128
577#define HA_DO_INDEX_COND_PUSHDOWN 256 /* Supports Index Condition Pushdown */
578
579/* operations for disable/enable indexes */
580#define HA_KEY_SWITCH_NONUNIQ 0
581#define HA_KEY_SWITCH_ALL 1
582#define HA_KEY_SWITCH_NONUNIQ_SAVE 2
583#define HA_KEY_SWITCH_ALL_SAVE 3
584
585/*
586 Use this instead of 0 as the initial value for the slot number of
587 handlerton, so that we can distinguish uninitialized slot number
588 from slot 0.
589*/
590#define HA_SLOT_UNDEF ((uint)-1)
591
592/*
593 Parameters for open() (in register form->filestat)
594 HA_GET_INFO does an implicit HA_ABORT_IF_LOCKED
595*/
596
597#define HA_OPEN_KEYFILE 1
598#define HA_OPEN_RNDFILE 2
599#define HA_GET_INDEX 4
600#define HA_GET_INFO 8 /* do a handler::info() after open */
601#define HA_READ_ONLY 16 /* File opened as readonly */
602/* Try readonly if can't open with read and write */
603#define HA_TRY_READ_ONLY 32
604#define HA_WAIT_IF_LOCKED 64 /* Wait if locked on open */
605#define HA_ABORT_IF_LOCKED 128 /* skip if locked on open.*/
606#define HA_BLOCK_LOCK 256 /* unlock when reading some records */
607#define HA_OPEN_TEMPORARY 512
608
609/* Some key definitions */
610#define HA_KEY_NULL_LENGTH 1
611#define HA_KEY_BLOB_LENGTH 2
612
613#define HA_LEX_CREATE_TMP_TABLE 1
614#define HA_LEX_CREATE_IF_NOT_EXISTS 2
615#define HA_LEX_CREATE_TABLE_LIKE 4
616#define HA_LEX_CREATE_INTERNAL_TMP_TABLE 8
617#define HA_MAX_REC_LENGTH 65535U
618
619/**
620 Options for the START TRANSACTION statement.
621
622 Note that READ ONLY and READ WRITE are logically mutually exclusive.
623 This is enforced by the parser and depended upon by trans_begin().
624
625 We need two flags instead of one in order to differentiate between
626 situation when no READ WRITE/ONLY clause were given and thus transaction
627 is implicitly READ WRITE and the case when READ WRITE clause was used
628 explicitly.
629*/
630
631// WITH CONSISTENT SNAPSHOT option
633// READ ONLY option
635// READ WRITE option
637// HIGH PRIORITY option
639
661 DB_TYPE_PARTITION_DB, // No longer used.
669 /** Performance schema engine. */
673 DB_TYPE_DEFAULT = 127 // Must be last
675
676enum row_type : int {
684 /** Unused. Reserved for future versions. */
687
695
704};
705
707
708/* Bits in used_fields */
709#define HA_CREATE_USED_AUTO (1L << 0)
710#define HA_CREATE_USED_RAID (1L << 1) // RAID is no longer available
711#define HA_CREATE_USED_UNION (1L << 2)
712#define HA_CREATE_USED_INSERT_METHOD (1L << 3)
713#define HA_CREATE_USED_MIN_ROWS (1L << 4)
714#define HA_CREATE_USED_MAX_ROWS (1L << 5)
715#define HA_CREATE_USED_AVG_ROW_LENGTH (1L << 6)
716#define HA_CREATE_USED_PACK_KEYS (1L << 7)
717#define HA_CREATE_USED_CHARSET (1L << 8)
718#define HA_CREATE_USED_DEFAULT_CHARSET (1L << 9)
719#define HA_CREATE_USED_DATADIR (1L << 10)
720#define HA_CREATE_USED_INDEXDIR (1L << 11)
721#define HA_CREATE_USED_ENGINE (1L << 12)
722#define HA_CREATE_USED_CHECKSUM (1L << 13)
723#define HA_CREATE_USED_DELAY_KEY_WRITE (1L << 14)
724#define HA_CREATE_USED_ROW_FORMAT (1L << 15)
725#define HA_CREATE_USED_COMMENT (1L << 16)
726#define HA_CREATE_USED_PASSWORD (1L << 17)
727#define HA_CREATE_USED_CONNECTION (1L << 18)
728#define HA_CREATE_USED_KEY_BLOCK_SIZE (1L << 19)
729/** Unused. Reserved for future versions. */
730#define HA_CREATE_USED_TRANSACTIONAL (1L << 20)
731/** Unused. Reserved for future versions. */
732#define HA_CREATE_USED_PAGE_CHECKSUM (1L << 21)
733/** This is set whenever STATS_PERSISTENT=0|1|default has been
734specified in CREATE/ALTER TABLE. See also HA_OPTION_STATS_PERSISTENT in
735include/my_base.h. It is possible to distinguish whether
736STATS_PERSISTENT=default has been specified or no STATS_PERSISTENT= is
737given at all. */
738#define HA_CREATE_USED_STATS_PERSISTENT (1L << 22)
739/**
740 This is set whenever STATS_AUTO_RECALC=0|1|default has been
741 specified in CREATE/ALTER TABLE. See enum_stats_auto_recalc.
742 It is possible to distinguish whether STATS_AUTO_RECALC=default
743 has been specified or no STATS_AUTO_RECALC= is given at all.
744*/
745#define HA_CREATE_USED_STATS_AUTO_RECALC (1L << 23)
746/**
747 This is set whenever STATS_SAMPLE_PAGES=N|default has been
748 specified in CREATE/ALTER TABLE. It is possible to distinguish whether
749 STATS_SAMPLE_PAGES=default has been specified or no STATS_SAMPLE_PAGES= is
750 given at all.
751*/
752#define HA_CREATE_USED_STATS_SAMPLE_PAGES (1L << 24)
753
754/**
755 This is set whenever a 'TABLESPACE=...' phrase is used on CREATE TABLE
756*/
757#define HA_CREATE_USED_TABLESPACE (1L << 25)
758
759/** COMPRESSION="zlib|lz4|none" used during table create. */
760#define HA_CREATE_USED_COMPRESS (1L << 26)
761
762/** ENCRYPTION="Y" used during table create. */
763#define HA_CREATE_USED_ENCRYPT (1L << 27)
764
765/**
766 CREATE|ALTER SCHEMA|DATABASE|TABLE has an explicit COLLATE clause.
767
768 Implies HA_CREATE_USED_DEFAULT_CHARSET.
769*/
770#define HA_CREATE_USED_DEFAULT_COLLATE (1L << 28)
771
772/** SECONDARY_ENGINE used during table create. */
773#define HA_CREATE_USED_SECONDARY_ENGINE (1L << 29)
774
775/**
776 CREATE|ALTER SCHEMA|DATABASE has an explicit ENCRYPTION clause.
777
778 Implies HA_CREATE_USED_DEFAULT_ENCRYPTION.
779*/
780#define HA_CREATE_USED_DEFAULT_ENCRYPTION (1L << 30)
781
782/**
783 This option is used to convey that the create table should not
784 commit the operation and keep the transaction started.
785*/
786constexpr const uint64_t HA_CREATE_USED_START_TRANSACTION{1ULL << 31};
787
788constexpr const uint64_t HA_CREATE_USED_ENGINE_ATTRIBUTE{1ULL << 32};
789constexpr const uint64_t HA_CREATE_USED_SECONDARY_ENGINE_ATTRIBUTE{1ULL << 33};
790
791/**
792 ALTER SCHEMA|DATABASE has an explicit READ_ONLY clause.
793
794 Implies HA_CREATE_USED_READ_ONLY.
795*/
796constexpr const uint64_t HA_CREATE_USED_READ_ONLY{1ULL << 34};
797
798/**
799 These flags convey that the options AUTOEXTEND_SIZE has been
800 specified in the CREATE TABLE statement
801*/
802constexpr const uint64_t HA_CREATE_USED_AUTOEXTEND_SIZE{1ULL << 35};
803
804/*
805 End of bits used in used_fields
806*/
807
808/*
809 Structure to hold list of database_name.table_name.
810 This is used at both mysqld and storage engine layer.
811*/
813 const char *db;
814 const char *tablename;
815};
816
817#define MAXGTRIDSIZE 64
818#define MAXBQUALSIZE 64
819
820#define COMPATIBLE_DATA_YES 0
821#define COMPATIBLE_DATA_NO 1
822
823/*
824 These structures are used to pass information from a set of SQL commands
825 on add/drop/change tablespace definitions to the proper hton.
826*/
827#define UNDEF_NODEGROUP 65535
828
829// FUTURE: Combine these two enums into one enum class
844
854
855/**
856 Legacy struct for passing tablespace information to SEs.
857
858 FUTURE: Pass all info through dd objects
859 */
861 public:
862 const char *tablespace_name = nullptr;
863 const char *logfile_group_name = nullptr;
867 const char *data_file_name = nullptr;
868 const char *undo_file_name = nullptr;
869 ulonglong extent_size = 1024 * 1024; // Default 1 MByte
870 ulonglong undo_buffer_size = 8 * 1024 * 1024; // Default 8 MByte
871 ulonglong redo_buffer_size = 8 * 1024 * 1024; // Default 8 MByte
872 ulonglong initial_size = 128 * 1024 * 1024; // Default 128 MByte
873 std::optional<ulonglong> autoextend_size; // No autoextension as default
874 ulonglong max_size = 0; // Max size == initial size => no extension
875 ulonglong file_block_size = 0; // 0=default or must be a valid Page Size
878 const char *ts_comment = nullptr;
879 const char *encryption = nullptr;
880
882 return ts_cmd_type == CREATE_TABLESPACE ||
886 }
887
888 /**
889 Proper constructor even for all-public class simplifies initialization and
890 allows members to be const.
891
892 FUTURE: With constructor all members can be made const, and do not need
893 default initializers.
894
895 @param tablespace name of tabelspace (nullptr for logfile group statements)
896 @param logfile_group name of logfile group or nullptr
897 @param cmd main statement type
898 @param alter_tablespace_cmd subcommand type for ALTER TABLESPACE
899 @param datafile tablespace file for CREATE and ALTER ... ADD ...
900 @param undofile only applies to logfile group statements. nullptr otherwise.
901 @param opts options provided by parser
902 */
903 st_alter_tablespace(const char *tablespace, const char *logfile_group,
904 ts_command_type cmd,
905 enum ts_alter_tablespace_type alter_tablespace_cmd,
906 const char *datafile, const char *undofile,
907 const Tablespace_options &opts);
908};
909
910/*
911 Make sure that the order of schema_tables and enum_schema_tables are the same.
912*/
930
933enum ha_ddl_type : int {
939
940/** Clone start operation mode */
942 /** Start a new clone operation */
944
945 /** Re-start a clone operation after failure */
947
948 /** Add a new task to a running clone operation */
950
951 /** Get version for transfer data format */
953
954 /** Max value for clone mode */
957
958/** Clone operation types. */
959enum Ha_clone_type : size_t {
960 /** Caller must block all write operation to the SE. */
962
963 /** For transactional SE, archive redo to support concurrent dml */
965
966 /** For transactional SE, track page changes to support concurrent dml */
968
969 /** For transactional SE, use both page tracking and redo to optimize
970 clone with concurrent dml. Currently supported by Innodb. */
972
973 /** SE supports multiple threads for clone */
975
976 /** SE supports restarting clone after network failure */
978
979 /** Maximum value of clone type */
982
983using Ha_clone_flagset = std::bitset<HA_CLONE_TYPE_MAX>;
984
987
988/** File reference for clone */
990 /** File reference type */
991 enum {
992 /** File handle */
994
995 /** File descriptor */
997
999
1000 /** File reference */
1001 union {
1002 /** File descriptor */
1004
1005 /** File handle for windows */
1007 };
1008};
1009
1010/* Abstract callback interface to stream data back to the caller. */
1012 protected:
1013 /** Constructor to initialize members. */
1015 : m_hton(),
1016 m_loc_idx(),
1018 m_data_desc(),
1019 m_desc_len(),
1020 m_src_name(),
1021 m_dest_name(),
1023 m_flag() {}
1024
1025 public:
1026 /** Callback providing data from current position of a
1027 file descriptor of specific length.
1028 @param[in] from_file source file to read from
1029 @param[in] len data length
1030 @return error code */
1031 virtual int file_cbk(Ha_clone_file from_file, uint len) = 0;
1032
1033 /** Callback providing data in buffer of specific length.
1034 @param[in] from_buffer source buffer to read from
1035 @param[in] len data length
1036 @return error code */
1037 virtual int buffer_cbk(uchar *from_buffer, uint len) = 0;
1038
1039 /** Callback providing a file descriptor to write data starting
1040 from current position.
1041 @param[in] to_file destination file to write data
1042 @return error code */
1043 virtual int apply_file_cbk(Ha_clone_file to_file) = 0;
1044
1045 /** Callback to get data in buffer.
1046 @param[out] to_buffer data buffer
1047 @param[out] len data length
1048 @return error code */
1049 virtual int apply_buffer_cbk(uchar *&to_buffer, uint &len) = 0;
1050
1051 /** virtual destructor. */
1052 virtual ~Ha_clone_cbk() = default;
1053
1054 /** Set current storage engine handlerton.
1055 @param[in] hton SE handlerton */
1056 void set_hton(handlerton *hton) { m_hton = hton; }
1057
1058 /** Get current storage engine handlerton.
1059 @return SE handlerton */
1060 handlerton *get_hton() { return (m_hton); }
1061
1062 /** Set caller's transfer buffer size. SE can adjust the data chunk size
1063 based on this parameter.
1064 @param[in] size buffer size in bytes */
1066
1067 /** Get caller's transfer buffer size.
1068 @return buffer size in bytes */
1070
1071 /** Set current SE index.
1072 @param[in] idx SE index in locator array */
1073 void set_loc_index(uint idx) { m_loc_idx = idx; }
1074
1075 /** Get current SE index.
1076 @return SE index in locator array */
1078
1079 /** Set data descriptor. SE specific descriptor for the
1080 data transferred by the callbacks.
1081 @param[in] desc serialized data descriptor
1082 @param[in] len length of the descriptor byte stream */
1083 void set_data_desc(const uchar *desc, uint len) {
1084 m_data_desc = desc;
1085 m_desc_len = len;
1086 }
1087
1088 /** Get data descriptor. SE specific descriptor for the
1089 data transferred by the callbacks.
1090 @param[out] lenp length of the descriptor byte stream
1091 @return pointer to the serialized data descriptor */
1092 const uchar *get_data_desc(uint *lenp) {
1093 if (lenp != nullptr) {
1094 *lenp = m_desc_len;
1095 }
1096
1097 return (m_data_desc);
1098 }
1099
1100 /** Get SE source file name. Used for debug printing and error message.
1101 @return null terminated string for source file name */
1102 const char *get_source_name() { return (m_src_name); }
1103
1104 /** Set SE source file name.
1105 @param[in] name null terminated string for source file name */
1106 void set_source_name(const char *name) { m_src_name = name; }
1107
1108 /** Get SE destination file name. Used for debug printing and error message.
1109 @return null terminated string for destination file name */
1110 const char *get_dest_name() { return (m_dest_name); }
1111
1112 /** Set SE destination file name.
1113 @param[in] name null terminated string for destination file name */
1114 void set_dest_name(const char *name) { m_dest_name = name; }
1115
1116 /** Clear all flags set by SE */
1117 void clear_flags() { m_flag = 0; }
1118
1119 /** Mark that ACK is needed for the data transfer before returning
1120 from callback. Set by SE. */
1122
1123 /** Check if ACK is needed for the data transfer
1124 @return true if ACK is needed */
1125 bool is_ack_needed() const { return (m_flag & HA_CLONE_ACK); }
1126
1127 /** Mark that the file descriptor is opened for read/write
1128 with OS buffer cache. For O_DIRECT, the flag is not set. */
1130
1131 /** Check if the file descriptor is opened for read/write with OS
1132 buffer cache. Currently clone avoids using zero copy (sendfile on linux),
1133 if SE is using O_DIRECT. This improves data copy performance.
1134 @return true if O_DIRECT is not used */
1135 bool is_os_buffer_cache() const { return (m_flag & HA_CLONE_FILE_CACHE); }
1136
1137 /** Mark that the file can be transferred with zero copy. */
1139
1140 /** Check if zero copy optimization is suggested. */
1141 bool is_zero_copy() const { return (m_flag & HA_CLONE_ZERO_COPY); }
1142
1143 /** Mark that data needs secure transfer. */
1145
1146 /** Check if data needs secure transfer. */
1147 bool is_secure() const { return (m_flag & HA_CLONE_SECURE); }
1148
1149 /** Set state information and notify state change.
1150 @param[in] estimate estimated bytes for current state. */
1151 void mark_state_change(uint64_t estimate) {
1153 m_state_estimate = estimate;
1154 }
1155
1156 /** Check if SE notified state change. */
1157 bool is_state_change(uint64_t &estimate) {
1158 estimate = m_state_estimate;
1159 return (m_flag & HA_CLONE_STATE_CHANGE);
1160 }
1161
1162 private:
1163 /** Handlerton for the SE */
1165
1166 /** SE index in caller's locator array */
1168
1169 /** Caller's transfer buffer size. */
1171
1172 /** SE's Serialized data descriptor */
1174
1175 /** SE's Serialized descriptor length. */
1177
1178 /** Current source file name */
1179 const char *m_src_name;
1180
1181 /** Current destination file name */
1182 const char *m_dest_name;
1183
1184 /** Estimated bytes to be transferred. */
1186
1187 /** Flag storing data related options */
1189
1190 /** Acknowledgement is needed for the data transfer. */
1191 const int HA_CLONE_ACK = 0x01;
1192
1193 /** Data file is opened for read/write with OS buffer cache. */
1194 const int HA_CLONE_FILE_CACHE = 0x02;
1195
1196 /** Data file can be transferred with zero copy. */
1197 const int HA_CLONE_ZERO_COPY = 0x04;
1198
1199 /** Data needs to be transferred securely over SSL connection. */
1200 const int HA_CLONE_SECURE = 0x08;
1201
1202 /** State change notification by SE. */
1203 const int HA_CLONE_STATE_CHANGE = 0x10;
1204};
1205
1206/**
1207 Column type description for foreign key columns compatibility check.
1208
1209 Contains subset of information from dd::Column class. It is inconvenient
1210 to use dd::Column class directly for such checks because it requires valid
1211 dd::Table object and in some cases we want to produce Ha_fk_column_type
1212 right from column description in Create_field format.
1213*/
1216 /*
1217 Note that both dd::Column::char_length() and length here are really
1218 in bytes.
1219 */
1225};
1226
1227typedef ulonglong my_xid; // this line is the same as in log_event.h
1228/**
1229 Enumeration of possible states for externally coordinated transactions (XA).
1230 */
1232 NOT_FOUND = -1, // Trnasaction not found
1233 PREPARED_IN_SE = 0, // Transaction is prepared in SEs
1234 PREPARED_IN_TC = 1, // Transaction is prepared in SEs and TC
1235 COMMITTED_WITH_ONEPHASE = 2, // Transaction was one-phase committed
1236 COMMITTED = 3, // Transaction was committed
1237 ROLLEDBACK = 4 // Transaction was rolled back
1238};
1239/**
1240 Single occurrence set of XIDs of internally coordinated transactions
1241 found as been committed in the transaction coordinator state.
1242 */
1244 std::unordered_set<my_xid, std::hash<my_xid>, std::equal_to<my_xid>,
1246
1247/**
1248 Class to maintain list of externally coordinated transactions and their
1249 current state at recovery.
1250 */
1252 public:
1253 using pair = std::pair<const XID, enum_ha_recover_xa_state>;
1255 using list = std::map<XID, enum_ha_recover_xa_state, std::less<XID>,
1257 using iterator = std::map<XID, enum_ha_recover_xa_state, std::less<XID>,
1259 using instantiation_tuple = std::tuple<
1260 std::unique_ptr<MEM_ROOT>, std::unique_ptr<Xa_state_list::allocator>,
1261 std::unique_ptr<Xa_state_list::list>, std::unique_ptr<Xa_state_list>>;
1262
1263 /**
1264 Class constructor.
1265
1266 @param populated_by_tc The underlying list of XIDs and transaction
1267 states, after being populated by the transaction
1268 coodinator.
1269 */
1270 Xa_state_list(Xa_state_list::list &populated_by_tc);
1271 virtual ~Xa_state_list() = default;
1272
1273 /**
1274 Searches the underlying map to find an key that corresponds to the
1275 parameter.
1276
1277 @param to_find The XID to find within the underlying map.
1278
1279 @return Ha_recover_states::NOT_FOUND if the transaction wasn't found,
1280 the state of the transaction, otherwise.
1281 */
1282 enum_ha_recover_xa_state find(XID const &to_find);
1283 /**
1284 Adds a transaction and state to the underlying map. If the given XID
1285 already exists in the underlying map, the associated state changes according
1286 to the following rules:
1287
1288 - If the parameter state is `PREPARED_IN_SE` it means that the
1289 transaction didn't reach PREPARED_IN_TC, COMMIT or ROLLBACK for
1290 sure. In that case:
1291 . If other participants state is `COMMITTED`/`ROLLEDBACK`, it would
1292 mean that it's a state inherited from a previous execution with the
1293 same XID and we should set the state to `PREPARED_IN_SE`.
1294 . If other participants state is `PREPARED_IN_TC`/
1295 `COMMITTED_WITH_ONEPHASE` it means that the current participant
1296 didn't reach it but some other did so, keep the state as
1297 `PREPARED_IN_TC`/`COMMITTED_WITH_ONEPHASE`.
1298
1299 - If the parameter state is `PREPARED_IN_TC`, it means that other
1300 participants must have persisted either the PREPARE, the COMMIT or
1301 the ROLLBACK. In that case, keep whatever state is already there and
1302 ensure that is not `PREPARED_IN_SE`.
1303
1304 - If the parameter state is `COMMITTED_WITH_ONEPHASE`, `COMMITTED` or
1305 `ROLLEDBACK`, do nothing, only the active transaction coordinator has
1306 the ability, for now, to set the transaction state to those values.
1307
1308 @param xid The XID to be added (the key).
1309 @param xid The state to be added (the value).
1310
1311 @return The current value of the transaction state if the XID has
1312 already been added, Ha_recover_states::NOT_FOUND otherwise.
1313 */
1315 /**
1316 Factory like method to instantiate all the infra-structure needed to
1317 create an `Xa_state_list`. Since such infra-structuer is dependent on
1318 `MEM_ROOT` and `Mem_root_allocator`, the method returns a tuple
1319 containing unique pointers to all 4 objects needed: MEM_ROOT;
1320 Mem_root_allocator; Xa_state_list::list; Xa_state_list.
1321
1322 @return An std::tuple containing unique pointers to all 4 objects
1323 needed: MEM_ROOT; Mem_root_allocator; Xa_state_list::list;
1324 Xa_state_list.
1325 */
1327
1328 private:
1329 /** The underlying map holding the trx and states*/
1331};
1332
1333/* handlerton methods */
1334
1335/**
1336 close_connection is only called if
1337 thd->ha_data[xxx_hton.slot] is non-zero, so even if you don't need
1338 this storage area - set it to something, so that MySQL would know
1339 this storage engine was accessed in this connection
1340*/
1341typedef int (*close_connection_t)(handlerton *hton, THD *thd);
1342
1343/** Terminate connection/statement notification. */
1344typedef void (*kill_connection_t)(handlerton *hton, THD *thd);
1345
1346/**
1347 Shut down all storage engine background tasks that might access
1348 the data dictionary, before the main shutdown.
1349*/
1350typedef void (*pre_dd_shutdown_t)(handlerton *hton);
1351
1352/**
1353 sv points to a storage area, that was earlier passed
1354 to the savepoint_set call
1355*/
1356typedef int (*savepoint_rollback_t)(handlerton *hton, THD *thd, void *sv);
1357
1358/**
1359 sv points to an uninitialized storage area of requested size
1360 (see savepoint_offset description)
1361*/
1362typedef int (*savepoint_set_t)(handlerton *hton, THD *thd, void *sv);
1363
1364/**
1365 Check if storage engine allows to release metadata locks which were
1366 acquired after the savepoint if rollback to savepoint is done.
1367 @return true - If it is safe to release MDL locks.
1368 false - If it is not.
1369*/
1371 THD *thd);
1372
1373typedef int (*savepoint_release_t)(handlerton *hton, THD *thd, void *sv);
1374
1375/**
1376 'all' is true if it's a real commit, that makes persistent changes
1377 'all' is false if it's not in fact a commit but an end of the
1378 statement that is part of the transaction.
1379 NOTE 'all' is also false in auto-commit mode where 'end of statement'
1380 and 'real commit' mean the same event.
1381*/
1382typedef int (*commit_t)(handlerton *hton, THD *thd, bool all);
1383
1384typedef int (*rollback_t)(handlerton *hton, THD *thd, bool all);
1385
1386typedef int (*prepare_t)(handlerton *hton, THD *thd, bool all);
1387
1388typedef int (*recover_t)(handlerton *hton, XA_recover_txn *xid_list, uint len,
1390/**
1391 Retrieves information about externally coordinated transactions for which
1392 the two-phase prepare was finished and transactions were prepared in the
1393 server TC.
1394 */
1396 Xa_state_list &xa_list);
1397/**
1398 Instructs the storage engine to mark the externally coordinated
1399 transactions held by the THD parameters as prepared in the server TC.
1400 */
1401using set_prepared_in_tc_t = int (*)(handlerton *hton, THD *thd);
1402
1403/** X/Open XA distributed transaction status codes */
1405 /**
1406 normal execution
1407 */
1409
1410 /**
1411 asynchronous operation already outstanding
1412 */
1414
1415 /**
1416 a resource manager error occurred in the transaction branch
1417 */
1419
1420 /**
1421 the XID is not valid
1422 */
1424
1425 /**
1426 invalid arguments were given
1427 */
1429
1430 /**
1431 routine invoked in an improper context
1432 */
1434
1435 /**
1436 resource manager unavailable
1437 */
1439
1440 /**
1441 the XID already exists
1442 */
1444
1445 /**
1446 resource manager doing work outside transaction
1447 */
1448 XAER_OUTSIDE = -9
1450
1452
1454
1455/**
1456 Instructs the storage engine to mark the externally coordinated
1457 transactions identified by the XID parameters as prepared in the server
1458 TC.
1459 */
1461 XID *xid);
1462
1463/**
1464 Create handler object for the table in the storage engine.
1465
1466 @param hton Handlerton object for the storage engine.
1467 @param table TABLE_SHARE for the table, can be NULL if caller
1468 didn't perform full-blown open of table definition.
1469 @param partitioned Indicates whether table is partitioned.
1470 @param mem_root Memory root to be used for allocating handler
1471 object.
1472*/
1473typedef handler *(*create_t)(handlerton *hton, TABLE_SHARE *table,
1474 bool partitioned, MEM_ROOT *mem_root);
1475
1476typedef void (*drop_database_t)(handlerton *hton, char *path);
1477
1478typedef int (*panic_t)(handlerton *hton, enum ha_panic_function flag);
1479
1480typedef int (*start_consistent_snapshot_t)(handlerton *hton, THD *thd);
1481
1482/**
1483 Flush the log(s) of storage engine(s).
1484
1485 @param hton Handlerton of storage engine.
1486 @param binlog_group_flush true if we got invoked by binlog group
1487 commit during flush stage, false in other cases.
1488 @retval false Succeed
1489 @retval true Error
1490*/
1491typedef bool (*flush_logs_t)(handlerton *hton, bool binlog_group_flush);
1492
1493typedef bool (*show_status_t)(handlerton *hton, THD *thd, stat_print_fn *print,
1494 enum ha_stat_type stat);
1495
1496/**
1497 The flag values are defined in sql_partition.h.
1498 If this function is set, then it implies that the handler supports
1499 partitioned tables.
1500 If this function exists, then handler::get_partition_handler must also be
1501 implemented.
1502*/
1504
1505/**
1506 SE specific validation of the tablespace name.
1507
1508 This function will ask the relevant SE whether the submitted tablespace
1509 name is valid.
1510
1511 @param ts_cmd Purpose of usage - is this tablespace DDL?
1512 @param tablespace_name Name of the tablespace.
1513
1514 @return Tablespace name validity.
1515 @retval Whether the tablespace name is valid.
1516*/
1518 const char *tablespace_name);
1519
1520/**
1521 Get the tablespace name from the SE for the given schema and table.
1522
1523 @param thd Thread context.
1524 @param db_name Name of the relevant schema.
1525 @param table_name Name of the relevant table.
1526 @param [out] tablespace_name Name of the tablespace containing the table.
1527
1528 @return Operation status.
1529 @retval == 0 Success.
1530 @retval != 0 Error (handler error code returned).
1531*/
1534 LEX_CSTRING *tablespace_name);
1535
1536/**
1537 Create/drop or alter tablespace in the storage engine.
1538
1539 @param hton Hadlerton of the SE.
1540 @param thd Thread context.
1541 @param ts_info Description of tablespace and specific
1542 operation on it.
1543 @param old_ts_def dd::Tablespace object describing old version
1544 of tablespace.
1545 @param [in,out] new_ts_def dd::Tablespace object describing new version
1546 of tablespace. Engines which support atomic DDL
1547 can adjust this object. The updated information
1548 will be saved to the data-dictionary.
1549
1550 @return Operation status.
1551 @retval == 0 Success.
1552 @retval != 0 Error (handler error code returned).
1553*/
1554typedef int (*alter_tablespace_t)(handlerton *hton, THD *thd,
1555 st_alter_tablespace *ts_info,
1556 const dd::Tablespace *old_ts_def,
1557 dd::Tablespace *new_ts_def);
1558
1559/**
1560 SE interface for getting tablespace extension.
1561 @return Extension of tablespace datafile name.
1562*/
1563typedef const char *(*get_tablespace_filename_ext_t)();
1564
1565/**
1566 Get the tablespace data from SE and insert it into Data dictionary
1567
1568 @param thd Thread context
1569
1570 @return Operation status.
1571 @retval == 0 Success.
1572 @retval != 0 Error (handler error code returned)
1573*/
1574typedef int (*upgrade_tablespace_t)(THD *thd);
1575
1576/**
1577 Get the tablespace data from SE and insert it into Data dictionary
1578
1579 @param[in] tablespace tablespace object
1580
1581 @return Operation status.
1582 @retval == 0 Success.
1583 @retval != 0 Error (handler error code returned)
1584*/
1585typedef bool (*upgrade_space_version_t)(dd::Tablespace *tablespace);
1586
1587/**
1588 Finish upgrade process inside storage engines.
1589 This includes resetting flags to indicate upgrade process
1590 and cleanup after upgrade.
1591
1592 @param thd Thread context
1593 @param failed_upgrade True if the upgrade failed.
1594
1595 @return Operation status.
1596 @retval == 0 Success.
1597 @retval != 0 Error (handler error code returned)
1598*/
1599typedef int (*finish_upgrade_t)(THD *thd, bool failed_upgrade);
1600
1601/**
1602 Upgrade logs after the checkpoint from where upgrade
1603 process can only roll forward.
1604
1605 @param thd Thread context
1606
1607 @return Operation status.
1608 @retval == 0 Success.
1609 @retval != 0 Error (handler error code returned)
1610*/
1611typedef int (*upgrade_logs_t)(THD *thd);
1612
1620};
1621
1622/**
1623 Get the tablespace type from the SE.
1624
1625 @param[in] space tablespace object
1626 @param[out] space_type type of space
1627
1628 @return Operation status.
1629 @retval false on success and true for failure.
1630*/
1631typedef bool (*get_tablespace_type_t)(const dd::Tablespace &space,
1632 Tablespace_type *space_type);
1633
1634/**
1635 Get the tablespace type given the name, from the SE.
1636
1637 @param[in] tablespace_name tablespace name
1638 @param[out] space_type type of space
1639
1640 @return Operation status.
1641 @retval false on success and true for failure.
1642*/
1643typedef bool (*get_tablespace_type_by_name_t)(const char *tablespace_name,
1644 Tablespace_type *space_type);
1645
1646typedef int (*fill_is_table_t)(handlerton *hton, THD *thd, Table_ref *tables,
1647 class Item *cond, enum enum_schema_tables);
1648
1649typedef int (*binlog_func_t)(handlerton *hton, THD *thd, enum_binlog_func fn,
1650 void *arg);
1651
1652typedef void (*binlog_log_query_t)(handlerton *hton, THD *thd,
1653 enum_binlog_command binlog_command,
1654 const char *query, uint query_length,
1655 const char *db, const char *table_name);
1656
1657typedef void (*acl_notify_t)(THD *thd,
1658 const class Acl_change_notification *notice);
1659
1660typedef int (*discover_t)(handlerton *hton, THD *thd, const char *db,
1661 const char *name, uchar **frmblob, size_t *frmlen);
1662
1663typedef int (*find_files_t)(handlerton *hton, THD *thd, const char *db,
1664 const char *path, const char *wild, bool dir,
1665 List<LEX_STRING> *files);
1666
1667typedef int (*table_exists_in_engine_t)(handlerton *hton, THD *thd,
1668 const char *db, const char *name);
1669
1670/**
1671 Let storage engine inspect the query Accesspath and pick whatever
1672 it like for being pushed down to the engine. (Join, conditions, ..)
1673
1674 The handler implementation should itself keep track of what it 'pushed',
1675 such that later calls to the handlers access methods should
1676 activate the pushed parts of the execution plan on the storage
1677 engines.
1678
1679 @param thd Thread context
1680 @param query The AccessPath for the entire query.
1681 @param join The JOIN to be pushed
1682
1683 @returns
1684 0 on success
1685 error otherwise
1686*/
1687using push_to_engine_t = int (*)(THD *thd, AccessPath *query, JOIN *);
1688
1689/**
1690 Check if the given db.tablename is a system table for this SE.
1691
1692 @param db Database name to check.
1693 @param table_name table name to check.
1694 @param is_sql_layer_system_table if the supplied db.table_name is a SQL
1695 layer system table.
1696
1697 @see example_is_supported_system_table in ha_example.cc
1698
1699 is_sql_layer_system_table is supplied to make more efficient
1700 checks possible for SEs that support all SQL layer tables.
1701
1702 This interface is optional, so every SE need not implement it.
1703*/
1704typedef bool (*is_supported_system_table_t)(const char *db,
1705 const char *table_name,
1706 bool is_sql_layer_system_table);
1707
1708/**
1709 Create SDI in a tablespace. This API should be used when upgrading
1710 a tablespace with no SDI or after invoking sdi_drop().
1711 @param[in] tablespace tablespace object
1712 @retval false success
1713 @retval true failure
1714*/
1715typedef bool (*sdi_create_t)(dd::Tablespace *tablespace);
1716
1717/**
1718 Drop SDI in a tablespace. This API should be used only when
1719 SDI is corrupted.
1720 @param[in] tablespace tablespace object
1721 @retval false success
1722 @retval true failure
1723*/
1724typedef bool (*sdi_drop_t)(dd::Tablespace *tablespace);
1725
1726/**
1727 Get the SDI keys in a tablespace into vector.
1728 @param[in] tablespace tablespace object
1729 @param[in,out] vector vector of SDI Keys
1730 @retval false success
1731 @retval true failure
1732*/
1733typedef bool (*sdi_get_keys_t)(const dd::Tablespace &tablespace,
1735
1736/**
1737 Retrieve SDI for a given SDI key.
1738
1739 Since the caller of this api will not know the SDI length, SDI retrieval
1740 should be done in the following way.
1741
1742 i. Allocate initial memory of some size (Lets say 64KB)
1743 ii. Pass the allocated memory to the below api.
1744 iii. If passed buffer is sufficient, sdi_get_by_id() copies the sdi
1745 to the buffer passed and returns success, else sdi_len is modified
1746 with the actual length of the SDI (and returns false on failure).
1747 For genuine errors, sdi_len is returned as UINT64_MAX
1748 iv. If sdi_len != UINT64_MAX, retry the call after allocating the memory
1749 of sdi_len
1750 v. Free the memory after using SDI (responsibility of caller)
1751
1752 @param[in] tablespace tablespace object
1753 @param[in] sdi_key SDI key to uniquely identify SDI obj
1754 @param[in,out] sdi SDI retrieved from tablespace
1755 A non-null pointer must be passed in
1756 @param[in,out] sdi_len in: length of the memory allocated
1757 out: actual length of SDI
1758 @retval false success
1759 @retval true failure
1760*/
1761typedef bool (*sdi_get_t)(const dd::Tablespace &tablespace,
1762 const sdi_key_t *sdi_key, void *sdi, uint64 *sdi_len);
1763
1764/**
1765 Insert/Update SDI for a given SDI key.
1766 @param[in] hton handlerton object
1767 @param[in] tablespace tablespace object
1768 @param[in] table table object
1769 @param[in] sdi_key SDI key to uniquely identify SDI obj
1770 @param[in] sdi SDI to write into the tablespace
1771 @param[in] sdi_len length of SDI BLOB returned
1772 @retval false success
1773 @retval true failure, my_error() should be called
1774 by SE
1775*/
1776typedef bool (*sdi_set_t)(handlerton *hton, const dd::Tablespace &tablespace,
1777 const dd::Table *table, const sdi_key_t *sdi_key,
1778 const void *sdi, uint64 sdi_len);
1779
1780/**
1781 Delete SDI for a given SDI key.
1782 @param[in] tablespace tablespace object
1783 @param[in] table table object
1784 @param[in] sdi_key SDI key to uniquely identify SDI obj
1785 @retval false success
1786 @retval true failure, my_error() should be called
1787 by SE
1788*/
1789typedef bool (*sdi_delete_t)(const dd::Tablespace &tablespace,
1790 const dd::Table *table, const sdi_key_t *sdi_key);
1791
1792/**
1793 Check if the DDSE is started in a way that leaves thd DD being read only.
1794
1795 @retval true The data dictionary can only be read.
1796 @retval false The data dictionary can be read and written.
1797 */
1798typedef bool (*is_dict_readonly_t)();
1799
1800/**
1801 Drop all temporary tables which have been left from previous server
1802 run belonging to this SE. Used on server start-up.
1803
1804 @param[in] hton Handlerton for storage engine.
1805 @param[in] thd Thread context.
1806 @param[in,out] files List of files in directories for temporary files
1807 which match tmp_file_prefix and thus can belong to
1808 temporary tables (but not necessarily in this SE).
1809 It is recommended to remove file from the list if
1810 SE recognizes it as belonging to temporary table
1811 in this SE and deletes it.
1812*/
1813typedef bool (*rm_tmp_tables_t)(handlerton *hton, THD *thd,
1814 List<LEX_STRING> *files);
1815
1816/**
1817 Retrieve cost constants to be used for this storage engine.
1818
1819 A storage engine that wants to provide its own cost constants to
1820 be used in the optimizer cost model, should implement this function.
1821 The server will call this function to get a cost constant object
1822 that will be used for tables stored in this storage engine instead
1823 of using the default cost constants.
1824
1825 Life cycle for the cost constant object: The storage engine must
1826 allocate the cost constant object on the heap. After the function
1827 returns, the server takes over the ownership of this object.
1828 The server will eventually delete the object by calling delete.
1829
1830 @note In the initial version the storage_category parameter will
1831 not be used. The only valid value this will have is DEFAULT_STORAGE_CLASS
1832 (see declaration in opt_costconstants.h).
1833
1834 @param storage_category the storage type that the cost constants will
1835 be used for
1836
1837 @return a pointer to the cost constant object, if NULL is returned
1838 the default cost constants will be used
1839*/
1840typedef SE_cost_constants *(*get_cost_constants_t)(uint storage_category);
1841
1842/**
1843 @param[in,out] thd pointer to THD
1844 @param[in] new_trx_arg pointer to replacement transaction
1845 @param[out] ptr_trx_arg double pointer to being replaced transaction
1846
1847 Associated with THD engine's native transaction is replaced
1848 with @c new_trx_arg. The old value is returned through a buffer if non-null
1849 pointer is provided with @c ptr_trx_arg.
1850 The method is adapted by XA start and XA prepare handlers to
1851 handle XA transaction that is logged as two parts by slave applier.
1852
1853 This interface concerns engines that are aware of XA transaction.
1854*/
1855typedef void (*replace_native_transaction_in_thd_t)(THD *thd, void *new_trx_arg,
1856 void **ptr_trx_arg);
1857
1858/** Mode for initializing the data dictionary. */
1860 DICT_INIT_CREATE_FILES, ///< Create all required SE files
1861 DICT_INIT_CHECK_FILES, ///< Verify existence of expected files
1862 DICT_INIT_UPGRADE_57_FILES, ///< Used for upgrade from mysql-5.7
1863 DICT_INIT_IGNORE_FILES ///< Don't care about files at all
1865
1866/**
1867 Initialize the SE for being used to store the DD tables. Create
1868 the required files according to the dict_init_mode. Create strings
1869 representing the required DDSE tables, i.e., tables that the DDSE
1870 expects to exist in the DD, and add them to the appropriate out
1871 parameter.
1872
1873 @note There are two variants of this function type, one is to be
1874 used by the DDSE, and has a different type of output parameters
1875 because the SQL layer needs more information about the DDSE tables
1876 in order to support upgrade.
1877
1878 @param dict_init_mode How to initialize files
1879 @param version Target DD version if a new
1880 server is being installed.
1881 0 if restarting an existing
1882 server.
1883 @param [out] DDSE_tables List of SQL DDL statements
1884 for creating DD tables that
1885 are needed by the DDSE.
1886 @param [out] DDSE_tablespaces List of meta data for predefined
1887 tablespaces created by the DDSE.
1888
1889 @retval true An error occurred.
1890 @retval false Success - no errors.
1891 */
1892
1893typedef bool (*dict_init_t)(dict_init_mode_t dict_init_mode, uint version,
1894 List<const Plugin_table> *DDSE_tables,
1895 List<const Plugin_tablespace> *DDSE_tablespaces);
1896
1897typedef bool (*ddse_dict_init_t)(
1898 dict_init_mode_t dict_init_mode, uint version,
1899 List<const dd::Object_table> *DDSE_tables,
1900 List<const Plugin_tablespace> *DDSE_tablespaces);
1901
1902/**
1903 Initialize the set of hard coded DD table ids.
1904*/
1905typedef void (*dict_register_dd_table_id_t)(dd::Object_id hard_coded_tables);
1906
1907/**
1908 Invalidate an entry in the local dictionary cache.
1909
1910 Needed during bootstrap to make sure the contents in the DDSE
1911 dictionary cache is in sync with the global DD.
1912
1913 @param schema_name Schema name.
1914 @param table_name Table name.
1915 */
1916
1917typedef void (*dict_cache_reset_t)(const char *schema_name,
1918 const char *table_name);
1919
1920/**
1921 Invalidate all table and tablespace entries in the local dictionary cache.
1922
1923 Needed for recovery during server restart.
1924 */
1925
1927
1928/** Mode for data dictionary recovery. */
1930 DICT_RECOVERY_INITIALIZE_SERVER, ///< First start of a new server
1931 DICT_RECOVERY_INITIALIZE_TABLESPACES, ///< First start, create tablespaces
1932 DICT_RECOVERY_RESTART_SERVER ///< Restart of an existing server
1934
1935/**
1936 Do recovery in the DDSE as part of initializing the data dictionary.
1937 The dict_recovery_mode indicates what kind of recovery should be
1938 done.
1939
1940 @param dict_recovery_mode How to do recovery
1941 @param version Target DD version if a new
1942 server is being installed.
1943 Actual DD version if restarting
1944 an existing server.
1945
1946 @retval true An error occurred.
1947 @retval false Success - no errors.
1948 */
1949
1950typedef bool (*dict_recover_t)(dict_recovery_mode_t dict_recovery_mode,
1951 uint version);
1952
1953/**
1954 Get the server version id stored in the header of the
1955 dictionary tablespace.
1956
1957 @param [out] version Version number from the DD
1958 tablespace header.
1959
1960 @retval Operation outcome, false if no error, otherwise true.
1961*/
1963
1964/**
1965 Store the current server version number into the
1966 header of the dictionary tablespace.
1967
1968 @retval Operation outcome, false if no error, otherwise true.
1969*/
1971
1972/**
1973 Notify/get permission from storage engine before acquisition or after
1974 release of exclusive metadata lock on object represented by key.
1975
1976 @param thd Thread context.
1977 @param mdl_key MDL key identifying object on which exclusive
1978 lock is to be acquired/was released.
1979 @param notification_type Indicates whether this is pre-acquire or
1980 post-release notification.
1981 @param victimized 'true' if locking failed as we were selected
1982 as a victim in order to avoid possible deadlocks.
1983
1984 @note Notification is done only for objects from TABLESPACE, SCHEMA,
1985 TABLE, FUNCTION, PROCEDURE, TRIGGER and EVENT namespaces.
1986
1987 @note Problems during notification are to be reported as warnings, MDL
1988 subsystem will report generic error if pre-acquire notification
1989 fails/SE refuses lock acquisition.
1990 @note Return value is ignored/error is not reported in case of
1991 post-release notification.
1992
1993 @note In some cases post-release notification might happen even if
1994 there were no prior pre-acquire notification. For example,
1995 when SE was loaded after exclusive lock acquisition, or when
1996 we need notify SEs which permitted lock acquisition that it
1997 didn't happen because one of SEs didn't allow it (in such case
1998 we will do post-release notification for all SEs for simplicity).
1999
2000 @return False - if notification was successful/lock can be acquired,
2001 True - if it has failed/lock should not be acquired.
2002*/
2003typedef bool (*notify_exclusive_mdl_t)(THD *thd, const MDL_key *mdl_key,
2004 ha_notification_type notification_type,
2005 bool *victimized);
2006
2007/**
2008 Notify/get permission from storage engine before or after execution of
2009 ALTER TABLE operation on the table identified by the MDL key.
2010
2011 @param thd Thread context.
2012 @param mdl_key MDL key identifying table which is going to be
2013 or was ALTERed.
2014 @param notification_type Indicates whether this is pre-ALTER TABLE or
2015 post-ALTER TABLE notification.
2016
2017 @note This hook is necessary because for ALTER TABLE upgrade to X
2018 metadata lock happens fairly late during the execution process,
2019 so it can be expensive to abort ALTER TABLE operation at this
2020 stage by returning failure from notify_exclusive_mdl() hook.
2021
2022 @note This hook follows the same error reporting convention as
2023 @see notify_exclusive_mdl().
2024
2025 @note Similarly to notify_exclusive_mdl() in some cases post-ALTER
2026 notification might happen even if there were no prior pre-ALTER
2027 notification.
2028
2029 @note Post-ALTER notification can happen before post-release notification
2030 for exclusive metadata lock acquired by this ALTER TABLE.
2031
2032 @return False - if notification was successful/ALTER TABLE can proceed.
2033 True - if it has failed/ALTER TABLE should be aborted.
2034*/
2035typedef bool (*notify_alter_table_t)(THD *thd, const MDL_key *mdl_key,
2036 ha_notification_type notification_type);
2037
2038/**
2039 Notify/get permission from storage engine before or after execution of
2040 RENAME TABLE operation on the table identified by the MDL key.
2041
2042 @param thd Thread context.
2043 @param mdl_key MDL key identifying table which is going to be
2044 or was RENAMEd.
2045 @param notification_type Indicates whether this is pre-RENAME TABLE or
2046 post-RENAME TABLE notification.
2047 @param old_db_name
2048 @param old_table_name
2049 @param new_db_name
2050 @param new_table_name
2051*/
2052typedef bool (*notify_rename_table_t)(THD *thd, const MDL_key *mdl_key,
2053 ha_notification_type notification_type,
2054 const char *old_db_name,
2055 const char *old_table_name,
2056 const char *new_db_name,
2057 const char *new_table_name);
2058
2059/**
2060 Notify/get permission from storage engine before or after execution of
2061 TRUNCATE TABLE operation on the table identified by the MDL key.
2062
2063 @param thd Thread context.
2064 @param mdl_key MDL key identifying table which is going to be
2065 or was TRUNCATEd.
2066 @param notification_type Indicates whether this is pre-TRUNCATE TABLE or
2067 post-TRUNCATE TABLE notification.
2068*/
2069typedef bool (*notify_truncate_table_t)(THD *thd, const MDL_key *mdl_key,
2070 ha_notification_type notification_type);
2071
2072/**
2073 @brief
2074 Initiate master key rotation
2075
2076 @returns false on success,
2077 true on failure
2078*/
2080
2081/**
2082 @brief
2083 Enable or Disable SE write ahead logging.
2084
2085 @param[in] thd server thread handle
2086 @param[in] enable enable/disable redo logging
2087
2088 @return true iff failed.
2089*/
2090typedef bool (*redo_log_set_state_t)(THD *thd, bool enable);
2091
2092/**
2093 @brief
2094 Retrieve ha_statistics from SE.
2095
2096 @param db_name Name of schema
2097 @param table_name Name of table
2098 @param se_private_id SE private id of the table.
2099 @param ts_se_private_data Tablespace SE private data.
2100 @param tbl_se_private_data Table SE private data.
2101 @param flags Type of statistics to retrieve.
2102 @param[out] stats Contains statistics read from SE.
2103
2104 @note Handlers that implement this callback/API should adhere
2105 to servers expectation that, the implementation would invoke
2106 my_error() before returning 'true'/failure from this function.
2107
2108 @returns false on success,
2109 true on failure
2110*/
2112 const char *db_name, const char *table_name, dd::Object_id se_private_id,
2113 const dd::Properties &ts_se_private_data,
2114 const dd::Properties &tbl_se_private_data, uint flags,
2116
2117/**
2118 @brief
2119 Retrieve index column cardinality from SE.
2120
2121 @param db_name Name of schema
2122 @param table_name Name of table
2123 @param index_name Name of index
2124 @param index_ordinal_position Position of index.
2125 @param column_ordinal_position Position of column in index.
2126 @param se_private_id SE private id of the table.
2127 @param[out] cardinality cardinality being returned by SE.
2128
2129 @note Handlers that implement this callback/API should adhere
2130 to servers expectation that, the implementation would invoke
2131 my_error() before returning 'true'/failure from this function.
2132
2133 @returns false on success,
2134 true on failure
2135*/
2137 const char *db_name, const char *table_name, const char *index_name,
2138 uint index_ordinal_position, uint column_ordinal_position,
2139 dd::Object_id se_private_id, ulonglong *cardinality);
2140
2141/**
2142 Retrieve ha_tablespace_statistics from SE.
2143
2144 @param tablespace_name Tablespace_name
2145 @param file_name Tablespace file name.
2146 @param ts_se_private_data Tablespace SE private data.
2147 @param[out] stats Contains tablespace
2148 statistics read from SE.
2149
2150 @note Handlers that implement this callback/API should adhere
2151 to servers expectation that, the implementation would invoke
2152 my_error() before returning 'true'/failure from this function.
2153
2154 @returns false on success, true on failure
2155*/
2157 const char *tablespace_name, const char *file_name,
2158 const dd::Properties &ts_se_private_data, ha_tablespace_statistics *stats);
2159
2160/* Database physical clone interfaces */
2161
2162/** Get capability flags for clone operation
2163@param[out] flags capability flag */
2165
2166/** Begin copy from source database
2167@param[in] hton handlerton for SE
2168@param[in] thd server thread handle
2169@param[in,out] loc locator
2170@param[in,out] loc_len locator length
2171@param[out] task_id task identifier
2172@param[in] type clone type
2173@param[in] mode mode for starting clone
2174@return error code */
2175using Clone_begin_t = int (*)(handlerton *hton, THD *thd, const uchar *&loc,
2176 uint &loc_len, uint &task_id, Ha_clone_type type,
2178
2179/** Copy data from source database in chunks via callback
2180@param[in] hton handlerton for SE
2181@param[in] thd server thread handle
2182@param[in] loc locator
2183@param[in] loc_len locator length in bytes
2184@param[in] task_id task identifier
2185@param[in] cbk callback interface for sending data
2186@return error code */
2187using Clone_copy_t = int (*)(handlerton *hton, THD *thd, const uchar *loc,
2188 uint loc_len, uint task_id, Ha_clone_cbk *cbk);
2189
2190/** Acknowledge data transfer to source database
2191@param[in] hton handlerton for SE
2192@param[in] thd server thread handle
2193@param[in] loc locator
2194@param[in] loc_len locator length in bytes
2195@param[in] task_id task identifier
2196@param[in] in_err inform any error occurred
2197@param[in] cbk callback interface
2198@return error code */
2199using Clone_ack_t = int (*)(handlerton *hton, THD *thd, const uchar *loc,
2200 uint loc_len, uint task_id, int in_err,
2201 Ha_clone_cbk *cbk);
2202
2203/** End copy from source database
2204@param[in] hton handlerton for SE
2205@param[in] thd server thread handle
2206@param[in] loc locator
2207@param[in] loc_len locator length in bytes
2208@param[in] task_id task identifier
2209@param[in] in_err error code when ending after error
2210@return error code */
2211using Clone_end_t = int (*)(handlerton *hton, THD *thd, const uchar *loc,
2212 uint loc_len, uint task_id, int in_err);
2213
2214/** Begin apply to destination database
2215@param[in] hton handlerton for SE
2216@param[in] thd server thread handle
2217@param[in,out] loc locator
2218@param[in,out] loc_len locator length
2219@param[in] task_id task identifier
2220@param[in] mode mode for starting clone
2221@param[in] data_dir target data directory
2222@return error code */
2223using Clone_apply_begin_t = int (*)(handlerton *hton, THD *thd,
2224 const uchar *&loc, uint &loc_len,
2225 uint &task_id, Ha_clone_mode mode,
2226 const char *data_dir);
2227
2228/** Apply data to destination database in chunks via callback
2229@param[in] hton handlerton for SE
2230@param[in] thd server thread handle
2231@param[in] loc locator
2232@param[in] loc_len locator length in bytes
2233@param[in] task_id task identifier
2234@param[in] in_err inform any error occurred
2235@param[in] cbk callback interface for receiving data
2236@return error code */
2237using Clone_apply_t = int (*)(handlerton *hton, THD *thd, const uchar *loc,
2238 uint loc_len, uint task_id, int in_err,
2239 Ha_clone_cbk *cbk);
2240
2241/** End apply to destination database
2242@param[in] hton handlerton for SE
2243@param[in] thd server thread handle
2244@param[in] loc locator
2245@param[in] loc_len locator length in bytes
2246@param[in] task_id task identifier
2247@param[in] in_err error code when ending after error
2248@return error code */
2249using Clone_apply_end_t = int (*)(handlerton *hton, THD *thd, const uchar *loc,
2250 uint loc_len, uint task_id, int in_err);
2251
2253 /* Get clone capabilities of an SE */
2255
2256 /* Interfaces to copy data. */
2261
2262 /* Interfaces to apply data. */
2266};
2267
2268/**
2269 Perform post-commit/rollback cleanup after DDL statement (e.g. in
2270 case of DROP TABLES really remove table files from disk).
2271
2272 @note This hook will be invoked after DDL commit or rollback only
2273 for storage engines supporting atomic DDL.
2274
2275 @note Problems during execution of this method should be reported to
2276 error log and as warnings/notes to user. Since this method is
2277 called after successful commit of the statement we can't fail
2278 statement with error.
2279*/
2280typedef void (*post_ddl_t)(THD *thd);
2281
2282/**
2283 Perform SE-specific cleanup after recovery of transactions.
2284
2285 @note Particularly SEs supporting atomic DDL can use this call
2286 to perform post-DDL actions for DDL statements which were
2287 committed or rolled back during recovery stage.
2288*/
2289typedef void (*post_recover_t)(void);
2290
2291/**
2292 Lock a handlerton (resource) log to collect log information.
2293*/
2294
2295typedef bool (*lock_hton_log_t)(handlerton *hton);
2296
2297/**
2298 Unlock a handlerton (resource) log after collecting log information.
2299*/
2300
2301typedef bool (*unlock_hton_log_t)(handlerton *hton);
2302
2303/**
2304 Collect a handlerton (resource) log information.
2305*/
2306
2307typedef bool (*collect_hton_log_info_t)(handlerton *hton, Json_dom *json);
2308
2309/**
2310 Check SE considers types of child and parent columns in foreign key
2311 to be compatible.
2312
2313 @param child_column_type Child column type description.
2314 @param parent_column_type Parent column type description.
2315 @param check_charsets Indicates whether we need to check
2316 that charsets of string columns
2317 match. Which is true in most cases.
2318
2319 @returns True if types are compatible, False if not.
2320*/
2321
2323 const Ha_fk_column_type *child_column_type,
2324 const Ha_fk_column_type *parent_column_type, bool check_charsets);
2325
2326typedef bool (*is_reserved_db_name_t)(handlerton *hton, const char *name);
2327
2328/**
2329 Prepare the secondary engine for executing a statement. This function is
2330 called right after the secondary engine TABLE objects have been opened by
2331 open_secondary_engine_tables(), before the statement is optimized and
2332 executed. Secondary engines will typically create a context object in this
2333 function, which they can use to store state that is needed during the
2334 optimization and execution phases.
2335
2336 @param thd thread context
2337 @param lex the statement to execute
2338 @return true on error, false on success
2339*/
2340using prepare_secondary_engine_t = bool (*)(THD *thd, LEX *lex);
2341
2342/**
2343 Optimize a statement for execution on a secondary storage engine. This
2344 function is called when the optimization of a statement has completed, just
2345 before the statement is executed. Secondary engines can use this function to
2346 apply engine-specific optimizations to the execution plan. They can also
2347 reject executing the query by raising an error, in which case the query will
2348 be reprepared and executed by the primary storage engine.
2349
2350 @param thd thread context
2351 @param lex the statement being optimized
2352 @return true on error, false on success
2353*/
2354using optimize_secondary_engine_t = bool (*)(THD *thd, LEX *lex);
2355
2356/**
2357 Compares the cost of two join plans in the secondary storage engine. The cost
2358 of the current candidate is compared with the cost of the best plan seen so
2359 far.
2360
2361 @param thd thread context
2362 @param join the candidate plan to evaluate
2363 @param optimizer_cost the cost estimate calculated by the optimizer
2364 @param[out] use_best_so_far true if the optimizer should stop searching for
2365 a better plan and use the best plan it has seen so far
2366 @param[out] cheaper true if the candidate is the best plan seen so far for
2367 this JOIN (must be true if it is the first plan seen),
2368 false otherwise
2369 @param[out] secondary_engine_cost the cost estimated by the secondary engine
2370
2371 @return false on success, or true if an error has been raised
2372*/
2373using compare_secondary_engine_cost_t = bool (*)(THD *thd, const JOIN &join,
2374 double optimizer_cost,
2375 bool *use_best_so_far,
2376 bool *cheaper,
2377 double *secondary_engine_cost);
2378
2379/**
2380 Evaluates the cost of executing the given access path in this secondary
2381 storage engine, and potentially modifies the cost estimates that are in the
2382 access path. This function is only called from the hypergraph join optimizer.
2383
2384 The function is called on every access path that the join optimizer might
2385 compare to an alternative access path. This includes both paths that represent
2386 complete execution plans and paths that represent partial plans. It is not
2387 guaranteed to be called on every child path. For example, if GROUP BY is done
2388 by sorting first and then aggregating the sorted results, the function will
2389 only be called on the aggregation path, and not on the sort path, because only
2390 the aggregation path will be compared to other paths.
2391
2392 The secondary engine is allowed to modify the estimates in the access path to
2393 better match the costs of the access path in the secondary engine. It can
2394 change any of the following AccessPath members:
2395
2396 - init_once_cost
2397 - init_cost
2398 - cost
2399 - cost_before_filter
2400 - num_output_rows
2401 - num_output_rows_before_filter
2402 - secondary_engine_data
2403
2404 Any other members should be left unchanged. The AccessPath must be in an
2405 internally consistent state when the function returns, and satisfy invariants
2406 expected by the hypergraph join optimizer, such as:
2407
2408 - init_cost <= cost_before_filter <= cost
2409 - num_output_rows <= num_output_rows_before_filter
2410
2411 The secondary engine can also reject an access path altogether, by returning
2412 true, in which case the join optimizer will not use that path in the final
2413 plan. Since the secondary engine can reject any partial or complete plan, it
2414 is possible that the join optimizer does not find any valid plan that is
2415 accepted. In this case, the join optimizer will raise an error.
2416
2417 If the secondary encounters an error when evaluating the cost of the path, it
2418 can signal an error by calling my_error() and return true, in which case the
2419 join optimizer will not suggest any plan for the query.
2420
2421 @param thd The thread context.
2422 @param hypergraph The hypergraph that represents the search space.
2423 @param[in,out] access_path The AccessPath to evaluate.
2424
2425 @retval false on success.
2426 @retval true if the plan is to be rejected, or if an error was raised.
2427*/
2429 THD *thd, const JoinHypergraph &hypergraph, AccessPath *access_path);
2430
2431/**
2432 Looks up and returns a specific secondary engine query offload or exec
2433 failure reason as a string given a thread context (representing the query)
2434 when the offloaded query fails in the secondary storage engine.
2435
2436 @param thd thread context.
2437
2438 @retval const char * as the offload failure reason.
2439 The memory pointed to is managed by the handlerton and may be freed
2440 when the statement completes.
2441*/
2443 const char *(*)(THD *thd);
2444
2445/**
2446 Sets a specific secondary engine offload failure reason for a query
2447 represented by the thread context when the offloaded query fails in
2448 the secondary storage engine.
2449
2450 @param thd thread context.
2451
2452 @param const char * as the offload failure reason.
2453*/
2455 const char *);
2456
2457// Capabilities (bit flags) for secondary engines.
2458using SecondaryEngineFlags = uint64_t;
2462
2463 // If this flag is set, aggregation (GROUP BY and DISTINCT) do not require
2464 // ordered inputs and create unordered outputs. This is typically the case
2465 // if they are implemented using hash-based techniques.
2467
2468 /// This flag can be set to signal that a secondary storage engine will not
2469 /// use MySQL's executor (see JOIN::override_executor_func). In this case, it
2470 /// doesn't need MySQL's execution data structures, like internal temporary
2471 /// tables, filesort objects or iterators. If the flag is set,
2472 /// FinalizePlanForQueryBlock() will not make any changes to the plan, and
2473 /// CreateIteratorFromAccessPath() will not be called.
2475};
2476
2477/// Creates an empty bitmap of access path types. This is the base
2478/// case for the function template with the same name below.
2479inline constexpr SecondaryEngineFlags MakeSecondaryEngineFlags() { return 0; }
2480
2481/// Creates a bitmap representing a set of access path types.
2482template <typename... Args>
2484 SecondaryEngineFlag flag1, Args... rest) {
2485 return (uint64_t{1} << static_cast<int>(flag1)) |
2486 MakeSecondaryEngineFlags(rest...);
2487}
2488
2489/// Returns the handlerton of the secondary engine that is used in the session,
2490/// or nullptr if a secondary engine is not used.
2491const handlerton *SecondaryEngineHandlerton(const THD *thd);
2492
2493// FIXME: Temporary workaround to enable storage engine plugins to use the
2494// before_commit hook. Remove after WL#11320 has been completed.
2495typedef void (*se_before_commit_t)(void *arg);
2496
2497// FIXME: Temporary workaround to enable storage engine plugins to use the
2498// after_commit hook. Remove after WL#11320 has been completed.
2499typedef void (*se_after_commit_t)(void *arg);
2500
2501// FIXME: Temporary workaround to enable storage engine plugins to use the
2502// before_rollback hook. Remove after WL#11320 has been completed.
2503typedef void (*se_before_rollback_t)(void *arg);
2504
2505/*
2506 Page Tracking : interfaces to handlerton functions which starts/stops page
2507 tracking, and purges/fetches page tracking information.
2508*/
2509
2510/**
2511 Start page tracking.
2512
2513 @param[out] start_id SE specific sequence number [LSN for InnoDB]
2514 indicating when the tracking was started
2515
2516 @return Operation status.
2517 @retval 0 Success
2518 @retval other ER_* mysql error. Get error details from THD.
2519*/
2520using page_track_start_t = int (*)(uint64_t *start_id);
2521
2522/**
2523 Stop page tracking.
2524
2525 @param[out] stop_id SE specific sequence number [LSN for InnoDB]
2526 indicating when the tracking was stopped
2527
2528 @return Operation status.
2529 @retval 0 Success
2530 @retval other ER_* mysql error. Get error details from THD.
2531*/
2532using page_track_stop_t = int (*)(uint64_t *stop_id);
2533
2534/**
2535 Purge page tracking data.
2536
2537 @param[in,out] purge_id SE specific sequence number [LSN for InnoDB]
2538 initially indicating till where the data needs to be purged and finally
2539 updated to until where it was actually purged
2540
2541 @return Operation status.
2542 @retval 0 Success
2543 @retval other ER_* mysql error. Get error details from THD.
2544*/
2545using page_track_purge_t = int (*)(uint64_t *purge_id);
2546
2547/**
2548 Fetch tracked pages.
2549
2550 @param[in] cbk_func callback function return page IDs
2551 @param[in] cbk_ctx caller's context for callback
2552 @param[in,out] start_id SE specific sequence number [LSN for InnoDB] from
2553 where the pages tracked would be returned.
2554 @note The range might get expanded and the actual start_id used for the
2555 querying will be updated.
2556 @param[in,out] stop_id SE specific sequence number [LSN for InnoDB]
2557 until where the pages tracked would be returned.
2558 @note The range might get expanded and the actual stop_id used for the
2559 querying will be updated.
2560 @param[out] buffer allocated buffer to copy page IDs
2561 @param[in] buffer_len length of buffer in bytes
2562
2563 @return Operation status.
2564 @retval 0 Success
2565 @retval other ER_* mysql error. Get error details from THD.
2566*/
2568 void *cbk_ctx, uint64_t *start_id,
2569 uint64_t *stop_id,
2570 unsigned char *buffer,
2571 size_t buffer_len);
2572
2573/**
2574 Fetch approximate number of tracked pages in the given range.
2575
2576 @param[in,out] start_id SE specific sequence number [LSN for InnoDB] from
2577 where the pages tracked would be returned.
2578 @note the range might get expanded and the actual start_id used for the
2579 querying will be updated.
2580 @param[in,out] stop_id SE specific sequence number [LSN for InnoDB]
2581 until where the pages tracked would be returned.
2582 @note the range might get expanded and the actual stop_id used for the
2583 querying will be updated.
2584 @param[out] num_pages number of pages tracked
2585
2586 @return Operation status.
2587 @retval 0 Success
2588 @retval other ER_* mysql error. Get error details from THD.
2589*/
2590using page_track_get_num_page_ids_t = int (*)(uint64_t *start_id,
2591 uint64_t *stop_id,
2592 uint64_t *num_pages);
2593
2594/** Fetch the status of the page tracking system.
2595@param[out] status vector of a pair of (ID, bool) where ID is the
2596start/stop point and bool is true if the ID is a start point else false */
2598 void (*)(std::vector<std::pair<uint64_t, bool>> &status);
2599
2600/** Page track interface */
2608};
2609
2610/**
2611 handlerton is a singleton structure - one instance per storage engine -
2612 to provide access to storage engine functionality that works on the
2613 "global" level (unlike handler class that works on a per-table basis).
2614
2615 usually handlerton instance is defined statically in ha_xxx.cc as
2616
2617 static handlerton { ... } xxx_hton;
2618
2619 savepoint_*, prepare, recover, and *_by_xid pointers can be 0.
2620*/
2622 /**
2623 Historical marker for if the engine is available or not.
2624 */
2626
2627 /**
2628 Historical number used for frm file to determine the correct storage engine.
2629 This is going away and new engines will just use "name" for this.
2630 */
2632 /**
2633 Each storage engine has it's own memory area (actually a pointer)
2634 in the thd, for storing per-connection information.
2635 It is accessed as
2636
2637 thd->ha_data[xxx_hton.slot]
2638
2639 slot number is initialized by MySQL after xxx_init() is called.
2640 */
2642 /**
2643 To store per-savepoint data storage engine is provided with an area
2644 of a requested size (0 is ok here).
2645 savepoint_offset must be initialized statically to the size of
2646 the needed memory to store per-savepoint information.
2647 After xxx_init it is changed to be an offset to savepoint storage
2648 area and need not be used by storage engine.
2649 see binlog_hton and binlog_savepoint_set/rollback for an example.
2650 */
2652
2653 /* handlerton methods */
2654
2699
2700 /** Global handler flags. */
2702
2703 /*
2704 Those handlerton functions below are properly initialized at handler
2705 init.
2706 */
2707
2716
2717 /*
2718 APIs for retrieving Serialized Dictionary Information by tablespace id
2719 */
2720
2727
2728 /**
2729 Null-ended array of file extensions that exist for the storage engine.
2730 Used by frm_error() and the default handler::rename_table and delete_table
2731 methods in handler.cc.
2732
2733 For engines that have two file name extensions (separate meta/index file
2734 and data file), the order of elements is relevant. First element of engine
2735 file name extensions array should be meta/index file extension. Second
2736 element - data file extension. This order is assumed by
2737 prepare_for_repair() when REPAIR TABLE ... USE_FRM is issued.
2738
2739 For engines that don't have files, file_extensions is NULL.
2740
2741 Currently, the following alternatives are used:
2742 - file_extensions == NULL;
2743 - file_extensions[0] != NULL, file_extensions[1] == NULL;
2744 - file_extensions[0] != NULL, file_extensions[1] != NULL,
2745 file_extensions[2] == NULL;
2746 */
2747 const char **file_extensions;
2748
2759
2763
2766
2767 /** Clone data transfer interfaces */
2769
2770 /** Flag for Engine License. */
2772 /** Location for engines to keep personal structures. */
2773 void *data;
2774
2775 /*
2776 Log_resource functions that must be supported by storage engines
2777 with relevant log information to be collected.
2778 */
2782
2783 /** Flags describing details of foreign key support by storage engine. */
2785
2787
2788 /**
2789 Suffix for auto-generated foreign key names for tables using this storage
2790 engine. If such suffix is specified by SE then its generated foreign key
2791 names follow (table name)(SE-specific FK name suffix)(FK number) pattern.
2792 Length of such suffix should not exceed MAX_FK_NAME_SUFFIX_LENGTH bytes.
2793 If no suffix is specified then FK_NAME_DEFAULT_SUFFIX is used as
2794 default.
2795 */
2797
2798 /**
2799 Pointer to a function that prepares a secondary engine for executing a
2800 statement.
2801
2802 @see prepare_secondary_engine_t for function signature.
2803 */
2805
2806 /**
2807 Pointer to a function that optimizes the current statement for
2808 execution on the secondary storage engine represented by this
2809 handlerton.
2810
2811 @see optimize_secondary_engine_t for function signature.
2812 */
2814
2815 /**
2816 Pointer to a function that estimates the cost of executing a join in a
2817 secondary storage engine.
2818
2819 @see compare_secondary_engine_cost_t for function signature.
2820 */
2822
2823 /// Bitmap which contains the supported join types and other flags
2824 /// for a secondary storage engine when used with the hypergraph join
2825 /// optimizer. If it is empty, it means that the secondary engine
2826 /// does not support the hypergraph join optimizer.
2828
2829 /// Pointer to a function that evaluates the cost of executing an access path
2830 /// in a secondary storage engine.
2831 ///
2832 /// @see secondary_engine_modify_access_path_cost_t for function signature.
2835
2836 /// Pointer to a function that returns the query offload or exec failure
2837 /// reason as a string given a thread context (representing the query) when
2838 /// the offloaded query failed in a secondary storage engine.
2839 ///
2840 /// @see get_secondary_engine_offload_or_exec_fail_reason_t for function
2841 /// signature.
2844
2845 /// Pointer to a function that sets the offload failure reason as a string
2846 /// for a thread context (representing the query) when the offloaded query
2847 /// failed in a secondary storage engine.
2848 ///
2849 /// @see set_secondary_engine_offload_fail_reason_t for function signature.
2852
2856
2857 /** Page tracking interface */
2859};
2860
2861/* Possible flags of a handlerton (there can be 32 of them) */
2862#define HTON_NO_FLAGS 0
2863#define HTON_CLOSE_CURSORS_AT_COMMIT (1 << 0)
2864#define HTON_ALTER_NOT_SUPPORTED (1 << 1) // Engine does not support alter
2865#define HTON_CAN_RECREATE (1 << 2) // Delete all is used for truncate
2866#define HTON_HIDDEN (1 << 3) // Engine does not appear in lists
2867/*
2868 Bit 4 was occupied by BDB-specific HTON_FLUSH_AFTER_RENAME flag and is no
2869 longer used.
2870*/
2871#define HTON_NOT_USER_SELECTABLE (1 << 5)
2872#define HTON_TEMPORARY_NOT_SUPPORTED \
2873 (1 << 6) // Having temporary tables not supported
2874#define HTON_SUPPORT_LOG_TABLES (1 << 7) // Engine supports log tables
2875#define HTON_NO_PARTITION (1 << 8) // You can not partition these tables
2876
2877/*
2878 This flag should be set when deciding that the engine does not allow row based
2879 binary logging (RBL) optimizations.
2880
2881 Currently, setting this flag, means that table's read/write_set will be left
2882 untouched when logging changes to tables in this engine. In practice this
2883 means that the server will not mess around with table->write_set and/or
2884 table->read_set when using RBL and deciding whether to log full or minimal
2885 rows.
2886
2887 It's valuable for instance for virtual tables, eg: Performance Schema which
2888 have no meaning for replication.
2889*/
2890#define HTON_NO_BINLOG_ROW_OPT (1 << 9)
2891
2892/**
2893 Engine supports extended keys. The flag allows to
2894 use 'extended key' feature if the engine is able to
2895 do it (has primary key values in the secondary key).
2896 Note that handler flag HA_PRIMARY_KEY_IN_READ_INDEX is
2897 actually partial case of HTON_SUPPORTS_EXTENDED_KEYS.
2898*/
2899
2900#define HTON_SUPPORTS_EXTENDED_KEYS (1 << 10)
2901
2902// Engine support foreign key constraint.
2903
2904#define HTON_SUPPORTS_FOREIGN_KEYS (1 << 11)
2905
2906/**
2907 Engine supports atomic DDL. That is rollback of transaction for DDL
2908 statement will also rollback all changes in SE, commit of transaction
2909 of DDL statement will make it durable.
2910*/
2911
2912#define HTON_SUPPORTS_ATOMIC_DDL (1 << 12)
2913
2914/* Engine supports packed keys. */
2915#define HTON_SUPPORTS_PACKED_KEYS (1 << 13)
2916
2917/** Engine is a secondary storage engine. */
2918#define HTON_IS_SECONDARY_ENGINE (1 << 14)
2919
2920/** Engine supports secondary storage engines. */
2921#define HTON_SUPPORTS_SECONDARY_ENGINE (1 << 15)
2922
2923/** Engine supports table or tablespace encryption . */
2924#define HTON_SUPPORTS_TABLE_ENCRYPTION (1 << 16)
2925
2927 1 << 17};
2928
2929/** Engine supports Generated invisible primary key. */
2930constexpr const decltype(
2932
2933/** Whether the secondary engine supports DDLs. No meaning if the engine is not
2934 * secondary. */
2935#define HTON_SECONDARY_ENGINE_SUPPORTS_DDL (1 << 19)
2936
2937/** Whether the engine does not support triggers. */
2938#define HTON_NO_TRIGGER_SUPPORT (1 << 20)
2939
2940/** Whether the primary engine supports external data sources. This case refers
2941 to having tables with data in object store and the engine does not store any
2942 of those data, only metadata. Table contents can be accessed only after
2943 loading the table in the secondary storage engine. The flag is used for
2944 a primary engine only.
2945 */
2946#define HTON_SUPPORTS_EXTERNAL_SOURCE (1 << 21)
2947
2949 assert(hton->flags & HTON_IS_SECONDARY_ENGINE);
2950
2951 return (hton->flags & HTON_SECONDARY_ENGINE_SUPPORTS_DDL) != 0;
2952}
2953
2954inline bool ddl_is_atomic(const handlerton *hton) {
2955 return (hton->flags & HTON_SUPPORTS_ATOMIC_DDL) != 0;
2956}
2957
2958/* Bits for handlerton::foreign_keys_flags bitmap. */
2959
2960/**
2961 Engine supports both unique and non-unique parent keys for
2962 foreign keys which contain full foreign key as its prefix.
2963
2964 Storage engines which support foreign keys but do not have
2965 this flag set are assumed to support only parent keys which
2966 are primary/unique and contain exactly the same columns as
2967 the foreign key, possibly, in different order.
2968*/
2969
2971
2972/**
2973 Storage engine supports hash keys as supporting keys for foreign
2974 keys. Hash key should contain all foreign key columns and only
2975 them (although in any order).
2976
2977 Storage engines which support foreign keys but do not have this
2978 flag set are assumed to not allow hash keys as supporting keys.
2979*/
2980
2982
2983/**
2984 Storage engine supports non-hash keys which have common prefix
2985 with the foreign key as supporting keys for it. If there are
2986 several such keys, one which shares biggest prefix with FK is
2987 chosen.
2988
2989 Storage engines which support foreign keys but do not have this
2990 flag set are assumed to require that supporting key contains full
2991 foreign key as its prefix.
2992*/
2993
2995
2996/**
2997 Storage engine does not support using the same key for both parent
2998 and supporting key, but requires the two to be different.
2999*/
3000
3002 (1 << 3);
3003
3004/**
3005 Engine takes into account hidden part of key (coming from primary key)
3006 when determines if it can serve as parent key for a foreign key.
3007
3008 Implies HTON_FKS_WITH_PREFIX_PARENT_KEYS and is related to
3009 HTON_SUPPORTS_EXTENDED_KEYS.
3010*/
3011
3013
3014/**
3015 Maximum possible length of SE-specific suffixes for auto-generated
3016 foreign key names.
3017*/
3018static const size_t MAX_FK_NAME_SUFFIX_LENGTH = 16;
3019
3020/**
3021 Suffix for auto-generated foreign key names for tables in SE's which
3022 don't specify own suffix. I.e. for foreign keys on tables in such
3023 SE's generated names follow (table name)FK_NAME_DEFAULT_SUFFIX(FK number)
3024 pattern.
3025*/
3027
3034
3040
3041/**
3042 Struct to hold information about the table that should be created.
3043 */
3047 bool schema_read_only{false};
3049 const char *password{nullptr};
3050 const char *tablespace{nullptr};
3051 LEX_STRING comment{nullptr, 0};
3052
3053 /**
3054 Algorithm (and possible options) to be used for InnoDB's transparent
3055 page compression. If this attribute is set then it is hint to the
3056 storage engine to try and compress the data using the specified algorithm
3057 where possible. Note: this value is interpreted by the storage engine only.
3058 and ignored by the Server layer. */
3059
3061
3062 /**
3063 This attribute is used for InnoDB's transparent page encryption.
3064 If this attribute is set then it is hint to the storage engine to encrypt
3065 the data. Note: this value is interpreted by the storage engine only.
3066 and ignored by the Server layer. */
3067
3069
3070 /**
3071 * Secondary engine of the table.
3072 * Is nullptr if no secondary engine defined.
3073 */
3075 /** Secondary engine load status */
3076 bool secondary_load{false};
3077
3078 const char *data_file_name{nullptr};
3079 const char *index_file_name{nullptr};
3080 const char *alias{nullptr};
3086 uint64_t used_fields{0};
3087 // Can only be 1,2,4,8 or 16, but use uint32_t since that how it is
3088 // represented in InnoDB
3089 std::uint32_t key_block_size{0};
3090 uint stats_sample_pages{0}; /* number of pages to sample during
3091 stats estimation, if used, otherwise 0. */
3095 /**
3096 Row type of the table definition.
3097
3098 Defaults to ROW_TYPE_DEFAULT for all non-ALTER statements.
3099 For ALTER TABLE defaults to ROW_TYPE_NOT_USED (means "keep the current").
3100
3101 Can be changed either explicitly by the parser.
3102 If nothing specified inherits the value of the original table (if present).
3103 */
3105 uint null_bits{0}; /* NULL bits at start of record */
3106 uint options{0}; /* OR of HA_CREATE_ options */
3108 ha_storage_media storage_media{HA_SM_DEFAULT}; /* DEFAULT, DISK or MEMORY */
3109
3110 /*
3111 A flag to indicate if this table should be marked as a hidden table in
3112 the data dictionary. One use case is to mark the temporary tables
3113 created by ALTER to be marked as hidden.
3114 */
3115 bool m_hidden{false};
3116
3117 /*
3118 A flag to indicate if this table should be created but not committed at
3119 the end of statement.
3120 */
3122
3125
3127
3129
3130 /**
3131 Fill HA_CREATE_INFO to be used by ALTER as well as upgrade code.
3132 This function separates code from mysql_prepare_alter_table() to be
3133 used by upgrade code as well to reduce code duplication.
3134 For ALTER code path, this lets new create options override the old
3135 ones.
3136
3137 @param[in] share TABLE_SHARE object
3138 @param[in] used_fields If a given create option is not flagged, old
3139 value be copied from the TABLE_SHARE.
3140 */
3141
3143 uint64_t used_fields);
3144};
3145
3146/**
3147 Structure describing changes to an index to be caused by ALTER TABLE.
3148*/
3149
3150struct KEY_PAIR {
3151 /**
3152 Pointer to KEY object describing old version of index in
3153 TABLE::key_info array for TABLE instance representing old
3154 version of table.
3155 */
3157 /**
3158 Pointer to KEY object describing new version of index in
3159 Alter_inplace_info::key_info_buffer array.
3160 */
3162};
3163
3164/**
3165 In-place alter handler context.
3166
3167 This is a superclass intended to be subclassed by individual handlers
3168 in order to store handler unique context between in-place alter API calls.
3169
3170 The handler is responsible for creating the object. This can be done
3171 as early as during check_if_supported_inplace_alter().
3172
3173 The SQL layer is responsible for destroying the object.
3174
3175 @see Alter_inplace_info
3176*/
3177
3179 public:
3181
3183 [[maybe_unused]]) {}
3184 virtual ~inplace_alter_handler_ctx() = default;
3185};
3186
3187/**
3188 Class describing changes to be done by ALTER TABLE.
3189 Instance of this class is passed to storage engine in order
3190 to determine if this ALTER TABLE can be done using in-place
3191 algorithm. It is also used for executing the ALTER TABLE
3192 using in-place algorithm.
3193*/
3194
3196 public:
3197 /**
3198 Bits to show in detail what operations the storage engine is
3199 to execute.
3200
3201 All these operations are supported as in-place operations by the
3202 SQL layer. This means that operations that by their nature must
3203 be performed by copying the table to a temporary table, will not
3204 have their own flags here (e.g. ALTER TABLE FORCE, ALTER TABLE
3205 ENGINE).
3206
3207 We generally try to specify handler flags only if there are real
3208 changes. But in cases when it is cumbersome to determine if some
3209 attribute has really changed we might choose to set flag
3210 pessimistically, for example, relying on parser output only.
3211 */
3213
3214 // Add non-unique, non-primary index
3215 static const HA_ALTER_FLAGS ADD_INDEX = 1ULL << 0;
3216
3217 // Drop non-unique, non-primary index
3218 static const HA_ALTER_FLAGS DROP_INDEX = 1ULL << 1;
3219
3220 // Add unique, non-primary index
3221 static const HA_ALTER_FLAGS ADD_UNIQUE_INDEX = 1ULL << 2;
3222
3223 // Drop unique, non-primary index
3224 static const HA_ALTER_FLAGS DROP_UNIQUE_INDEX = 1ULL << 3;
3225
3226 // Add primary index
3227 static const HA_ALTER_FLAGS ADD_PK_INDEX = 1ULL << 4;
3228
3229 // Drop primary index
3230 static const HA_ALTER_FLAGS DROP_PK_INDEX = 1ULL << 5;
3231
3232 // Add column
3233
3234 // Virtual generated column
3235 static const HA_ALTER_FLAGS ADD_VIRTUAL_COLUMN = 1ULL << 6;
3236 // Stored base (non-generated) column
3237 static const HA_ALTER_FLAGS ADD_STORED_BASE_COLUMN = 1ULL << 7;
3238 // Stored generated column
3240 // Add generic column (convenience constant).
3243
3244 // Drop column
3245 static const HA_ALTER_FLAGS DROP_VIRTUAL_COLUMN = 1ULL << 9;
3246 static const HA_ALTER_FLAGS DROP_STORED_COLUMN = 1ULL << 10;
3249
3250 // Rename column
3251 static const HA_ALTER_FLAGS ALTER_COLUMN_NAME = 1ULL << 11;
3252
3253 // Change column datatype
3255 static const HA_ALTER_FLAGS ALTER_STORED_COLUMN_TYPE = 1ULL << 13;
3256
3257 /**
3258 Change column datatype in such way that new type has compatible
3259 packed representation with old type, so it is theoretically
3260 possible to perform change by only updating data dictionary
3261 without changing table rows.
3262 */
3264
3265 /// A virtual column has changed its position
3267
3268 /// A stored column has changed its position (disregarding virtual columns)
3270
3271 // Change column from NOT NULL to NULL
3272 static const HA_ALTER_FLAGS ALTER_COLUMN_NULLABLE = 1ULL << 17;
3273
3274 // Change column from NULL to NOT NULL
3276
3277 // Set or remove default column value
3278 static const HA_ALTER_FLAGS ALTER_COLUMN_DEFAULT = 1ULL << 19;
3279
3280 // Change column generation expression
3281 static const HA_ALTER_FLAGS ALTER_VIRTUAL_GCOL_EXPR = 1ULL << 20;
3282 static const HA_ALTER_FLAGS ALTER_STORED_GCOL_EXPR = 1ULL << 21;
3283
3284 // Add foreign key
3285 static const HA_ALTER_FLAGS ADD_FOREIGN_KEY = 1ULL << 22;
3286
3287 // Drop foreign key
3288 static const HA_ALTER_FLAGS DROP_FOREIGN_KEY = 1ULL << 23;
3289
3290 // table_options changed, see HA_CREATE_INFO::used_fields for details.
3291 static const HA_ALTER_FLAGS CHANGE_CREATE_OPTION = 1ULL << 24;
3292
3293 // Table is renamed
3294 static const HA_ALTER_FLAGS ALTER_RENAME = 1ULL << 25;
3295
3296 // Change the storage type of column
3298
3299 // Change the column format of column
3301
3302 // Add partition
3303 static const HA_ALTER_FLAGS ADD_PARTITION = 1ULL << 28;
3304
3305 // Drop partition
3306 static const HA_ALTER_FLAGS DROP_PARTITION = 1ULL << 29;
3307
3308 // Changing partition options
3309 static const HA_ALTER_FLAGS ALTER_PARTITION = 1ULL << 30;
3310
3311 // Coalesce partition
3312 static const HA_ALTER_FLAGS COALESCE_PARTITION = 1ULL << 31;
3313
3314 // Reorganize partition ... into
3315 static const HA_ALTER_FLAGS REORGANIZE_PARTITION = 1ULL << 32;
3316
3317 // Reorganize partition
3318 static const HA_ALTER_FLAGS ALTER_TABLE_REORG = 1ULL << 33;
3319
3320 // Remove partitioning
3322
3323 // Partition operation with ALL keyword
3324 static const HA_ALTER_FLAGS ALTER_ALL_PARTITION = 1ULL << 35;
3325
3326 /**
3327 Rename index. Note that we set this flag only if there are no other
3328 changes to the index being renamed. Also for simplicity we don't
3329 detect renaming of indexes which is done by dropping index and then
3330 re-creating index with identical definition under different name.
3331 */
3332 static const HA_ALTER_FLAGS RENAME_INDEX = 1ULL << 36;
3333
3334 /**
3335 Recreate the table for ALTER TABLE FORCE, ALTER TABLE ENGINE
3336 and OPTIMIZE TABLE operations.
3337 */
3338 static const HA_ALTER_FLAGS RECREATE_TABLE = 1ULL << 37;
3339
3340 // Add spatial index
3341 static const HA_ALTER_FLAGS ADD_SPATIAL_INDEX = 1ULL << 38;
3342
3343 // Alter index comment
3344 static const HA_ALTER_FLAGS ALTER_INDEX_COMMENT = 1ULL << 39;
3345
3346 // New/changed virtual generated column require validation
3347 static const HA_ALTER_FLAGS VALIDATE_VIRTUAL_COLUMN = 1ULL << 40;
3348
3349 /**
3350 Change index option in a way which is likely not to require index
3351 recreation. For example, change COMMENT or KEY::is_algorithm_explicit
3352 flag (without change of index algorithm itself).
3353 */
3354 static const HA_ALTER_FLAGS CHANGE_INDEX_OPTION = 1LL << 41;
3355
3356 // Rebuild partition
3357 static const HA_ALTER_FLAGS ALTER_REBUILD_PARTITION = 1ULL << 42;
3358
3359 /**
3360 Change in index length such that it does not require index rebuild.
3361 For example, change in index length due to column expansion like
3362 varchar(X) changed to varchar(X + N).
3363 */
3365
3366 /**
3367 Change to one of columns on which virtual generated column depends,
3368 so its values require re-evaluation.
3369 */
3370 static const HA_ALTER_FLAGS VIRTUAL_GCOL_REEVAL = 1ULL << 44;
3371
3372 /**
3373 Change to one of columns on which stored generated column depends,
3374 so its values require re-evaluation.
3375 */
3376 static const HA_ALTER_FLAGS STORED_GCOL_REEVAL = 1ULL << 45;
3377
3378 // Add check constraint.
3379 static const HA_ALTER_FLAGS ADD_CHECK_CONSTRAINT = 1ULL << 46;
3380
3381 // Drop check constraint.
3382 static const HA_ALTER_FLAGS DROP_CHECK_CONSTRAINT = 1ULL << 47;
3383
3384 // Suspend check constraint.
3385 static const HA_ALTER_FLAGS SUSPEND_CHECK_CONSTRAINT = 1ULL << 48;
3386
3387 // Alter column visibility.
3388 static const HA_ALTER_FLAGS ALTER_COLUMN_VISIBILITY = 1ULL << 49;
3389
3390 /**
3391 Create options (like MAX_ROWS) for the new version of table.
3392
3393 @note The referenced instance of HA_CREATE_INFO object was already
3394 used to create new .FRM file for table being altered. So it
3395 has been processed by mysql_prepare_create_table() already.
3396 For example, this means that it has HA_OPTION_PACK_RECORD
3397 flag in HA_CREATE_INFO::table_options member correctly set.
3398 */
3400
3401 /**
3402 Alter options, fields and keys for the new version of table.
3403
3404 @note The referenced instance of Alter_info object was already
3405 used to create new .FRM file for table being altered. So it
3406 has been processed by mysql_prepare_create_table() already.
3407 In particular, this means that in Create_field objects for
3408 fields which were present in some form in the old version
3409 of table, Create_field::field member points to corresponding
3410 Field instance for old version of table.
3411 */
3413
3414 /**
3415 Indicates whether operation should fail if table is non-empty.
3416 Storage engines should not suggest/allow execution of such operations
3417 using INSTANT algorithm since check whether table is empty done from
3418 SQL-layer is not "instant". Also SEs might choose different algorithm for
3419 ALTER TABLE execution knowing that it will be allowed to proceed only if
3420 table is empty.
3421
3422 Unlike for Alter_table_ctx::error_if_not_empty, we use bool for this flag
3423 and not bitmap, since SEs are really interested in the fact that ALTER
3424 will fail if table is not empty and not in exact reason behind this fact,
3425 and because we want to avoid extra dependency between Alter_table_ctx and
3426 Alter_inplace_info.
3427 */
3429
3430 /**
3431 Array of KEYs for new version of table - including KEYs to be added.
3432
3433 @note Currently this array is produced as result of
3434 mysql_prepare_create_table() call.
3435 This means that it follows different convention for
3436 KEY_PART_INFO::fieldnr values than objects in TABLE::key_info
3437 array.
3438
3439 @todo This is mainly due to the fact that we need to keep compatibility
3440 with removed handler::add_index() call. We plan to switch to
3441 TABLE::key_info numbering later.
3442
3443 KEYs are sorted - see sort_keys().
3444 */
3446
3447 /** Size of key_info_buffer array. */
3449
3450 /** Size of index_drop_buffer array. */
3452
3453 /**
3454 Array of pointers to KEYs to be dropped belonging to the TABLE instance
3455 for the old version of the table.
3456 */
3458
3459 /** Size of index_add_buffer array. */
3461
3462 /**
3463 Array of indexes into key_info_buffer for KEYs to be added,
3464 sorted in increasing order.
3465 */
3467
3468 /** Size of index_rename_buffer array. */
3470
3471 /** Size of index_rename_buffer array. */
3473
3474 /**
3475 Array of KEY_PAIR objects describing indexes being renamed.
3476 For each index renamed it contains object with KEY_PAIR::old_key
3477 pointing to KEY object belonging to the TABLE instance for old
3478 version of table representing old version of index and with
3479 KEY_PAIR::new_key pointing to KEY object for new version of
3480 index in key_info_buffer member.
3481 */
3484
3485 /** Number of virtual columns to be added. */
3487
3488 /** number of virtual columns to be dropped. */
3490
3491 /**
3492 Context information to allow handlers to keep context between in-place
3493 alter API calls.
3494
3495 @see inplace_alter_handler_ctx for information about object lifecycle.
3496 */
3498
3499 /**
3500 If the table uses several handlers, like ha_partition uses one handler
3501 per partition, this contains a Null terminated array of ctx pointers
3502 that should all be committed together.
3503 Or NULL if only handler_ctx should be committed.
3504 Set to NULL if the low level handler::commit_inplace_alter_table uses it,
3505 to signal to the main handler that everything was committed as atomically.
3506
3507 @see inplace_alter_handler_ctx for information about object lifecycle.
3508 */
3510
3511 /**
3512 Flags describing in detail which operations the storage engine is to
3513 execute.
3514 */
3516
3517 /**
3518 Partition_info taking into account the partition changes to be performed.
3519 Contains all partitions which are present in the old version of the table
3520 with partitions to be dropped or changed marked as such + all partitions
3521 to be added in the new version of table marked as such.
3522 */
3524
3525 /** true for online operation (LOCK=NONE) */
3527
3528 /**
3529 Can be set by handler along with handler_ctx. The difference is that
3530 this flag can be used to store SE-specific in-place ALTER context in cases
3531 when constructing full-blown inplace_alter_handler_ctx descendant is
3532 inconvenient.
3533 */
3535
3536 /**
3537 Can be set by handler to describe why a given operation cannot be done
3538 in-place (HA_ALTER_INPLACE_NOT_SUPPORTED) or why it cannot be done
3539 online (HA_ALTER_INPLACE_NO_LOCK or HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE)
3540 If set, it will be used with ER_ALTER_OPERATION_NOT_SUPPORTED_REASON if
3541 results from handler::check_if_supported_inplace_alter() doesn't match
3542 requirements set by user. If not set, the more generic
3543 ER_ALTER_OPERATION_NOT_SUPPORTED will be used.
3544
3545 Please set to a properly localized string, for example using
3546 my_get_err_msg(), so that the error message as a whole is localized.
3547 */
3549
3551 Alter_info *alter_info_arg, bool error_if_not_empty_arg,
3552 KEY *key_info_arg, uint key_count_arg,
3553 partition_info *modified_part_info_arg)
3554 : create_info(create_info_arg),
3555 alter_info(alter_info_arg),
3556 error_if_not_empty(error_if_not_empty_arg),
3557 key_info_buffer(key_info_arg),
3558 key_count(key_count_arg),
3561 index_add_count(0),
3570 handler_flags(0),
3571 modified_part_info(modified_part_info_arg),
3572 online(false),
3575
3577
3578 /**
3579 Used after check_if_supported_inplace_alter() to report
3580 error if the result does not match the LOCK/ALGORITHM
3581 requirements set by the user.
3582
3583 @param not_supported Part of statement that was not supported.
3584 @param try_instead Suggestion as to what the user should
3585 replace not_supported with.
3586 */
3587 void report_unsupported_error(const char *not_supported,
3588 const char *try_instead);
3589
3590 /** Add old and new version of key to array of indexes to be renamed. */
3591 void add_renamed_key(KEY *old_key, KEY *new_key) {
3593 key_pair->old_key = old_key;
3594 key_pair->new_key = new_key;
3595 DBUG_PRINT("info",
3596 ("index renamed: '%s' to '%s'", old_key->name, new_key->name));
3597 }
3598
3599 void add_altered_index_visibility(KEY *old_key, KEY *new_key) {
3600 KEY_PAIR *key_pair =
3602 key_pair->old_key = old_key;
3603 key_pair->new_key = new_key;
3604 DBUG_PRINT("info", ("index had visibility altered: %i to %i",
3605 old_key->is_visible, new_key->is_visible));
3606 }
3607
3608 /**
3609 Add old and new version of modified key to arrays of indexes to
3610 be dropped and added (correspondingly).
3611 */
3612 void add_modified_key(KEY *old_key, KEY *new_key) {
3615 DBUG_PRINT("info", ("index changed: '%s'", old_key->name));
3616 }
3617
3618 /** Drop key to array of indexes to be dropped. */
3619 void add_dropped_key(KEY *old_key) {
3621 DBUG_PRINT("info", ("index dropped: '%s'", old_key->name));
3622 }
3623
3624 /** Add key to array of indexes to be added. */
3625 void add_added_key(KEY *new_key) {
3627 DBUG_PRINT("info", ("index added: '%s'", new_key->name));
3628 }
3629};
3630
3632 uint flags{0}; /* isam layer flags (e.g. for myisamchk) */
3633 uint sql_flags{0}; /* sql layer flags - for something myisamchk cannot do */
3634 KEY_CACHE *key_cache; /* new key cache when changing key cache */
3635};
3636
3637/*
3638 This is a buffer area that the handler can use to store rows.
3639 'end_of_used_area' should be kept updated after calls to
3640 read-functions so that other parts of the code can use the
3641 remaining area (until next read calls is issued).
3642*/
3643
3645 uchar *buffer; /* Buffer one can start using */
3646 uchar *buffer_end; /* End of buffer */
3647 uchar *end_of_used_area; /* End of area that was used by handler */
3648};
3649
3650typedef void *range_seq_t;
3651
3653 /*
3654 Initialize the traversal of range sequence
3655
3656 SYNOPSIS
3657 init()
3658 init_params The seq_init_param parameter
3659 n_ranges The number of ranges obtained
3660 flags A combination of HA_MRR_SINGLE_POINT, HA_MRR_FIXED_KEY
3661
3662 RETURN
3663 An opaque value to be used as RANGE_SEQ_IF::next() parameter
3664 */
3665 range_seq_t (*init)(void *init_params, uint n_ranges, uint flags);
3666
3667 /*
3668 Get the next range in the range sequence
3669
3670 SYNOPSIS
3671 next()
3672 seq The value returned by RANGE_SEQ_IF::init()
3673 range OUT Information about the next range
3674
3675 RETURN
3676 0 - Ok, the range structure filled with info about the next range
3677 1 - No more ranges
3678 */
3680
3681 /*
3682 Check whether range_info orders to skip the next record
3683
3684 SYNOPSIS
3685 skip_record()
3686 seq The value returned by RANGE_SEQ_IF::init()
3687 range_info Information about the next range
3688 (Ignored if MRR_NO_ASSOCIATION is set)
3689 rowid Rowid of the record to be checked (ignored if set to 0)
3690
3691 RETURN
3692 1 - Record with this range_info and/or this rowid shall be filtered
3693 out from the stream of records returned by ha_multi_range_read_next()
3694 0 - The record shall be left in the stream
3695 */
3696 bool (*skip_record)(range_seq_t seq, char *range_info, uchar *rowid);
3697};
3698
3699/**
3700 Used to store optimizer cost estimates.
3701
3702 The class consists of PODs only: default operator=, copy constructor
3703 and destructor are used.
3704 */
3706 private:
3707 double io_cost; ///< cost of I/O operations
3708 double cpu_cost; ///< cost of CPU operations
3709 double import_cost; ///< cost of remote operations
3710 double mem_cost; ///< memory used (bytes)
3711
3712 public:
3714
3715 /// Returns sum of time-consuming costs, i.e., not counting memory cost
3716 double total_cost() const { return io_cost + cpu_cost + import_cost; }
3717 double get_io_cost() const { return io_cost; }
3718 double get_cpu_cost() const { return cpu_cost; }
3719 double get_import_cost() const { return import_cost; }
3720 double get_mem_cost() const { return mem_cost; }
3721
3722 /**
3723 Whether or not all costs in the object are zero
3724
3725 @return true if all costs are zero, false otherwise
3726 */
3727 bool is_zero() const {
3728 return !(io_cost || cpu_cost || import_cost || mem_cost);
3729 }
3730 /**
3731 Whether or not the total cost is the maximal double
3732
3733 @return true if total cost is the maximal double, false otherwise
3734 */
3735 bool is_max_cost() const { return io_cost == DBL_MAX; }
3736 /// Reset all costs to zero
3738 /// Set current cost to the maximal double
3740 reset();
3741 io_cost = DBL_MAX;
3742 }
3743
3744 /// Multiply io, cpu and import costs by parameter
3745 void multiply(double m) {
3746 assert(!is_max_cost());
3747
3748 io_cost *= m;
3749 cpu_cost *= m;
3750 import_cost *= m;
3751 /* Don't multiply mem_cost */
3752 }
3753
3755 assert(!is_max_cost() && !other.is_max_cost());
3756
3757 io_cost += other.io_cost;
3758 cpu_cost += other.cpu_cost;
3759 import_cost += other.import_cost;
3760 mem_cost += other.mem_cost;
3761
3762 return *this;
3763 }
3764
3766 Cost_estimate result = *this;
3767 result += other;
3768
3769 return result;
3770 }
3771
3774
3775 assert(!other.is_max_cost());
3776
3777 result.io_cost = io_cost - other.io_cost;
3778 result.cpu_cost = cpu_cost - other.cpu_cost;
3779 result.import_cost = import_cost - other.import_cost;
3780 result.mem_cost = mem_cost - other.mem_cost;
3781 return result;
3782 }
3783
3784 bool operator>(const Cost_estimate &other) const {
3785 return total_cost() > other.total_cost() ? true : false;
3786 }
3787
3788 bool operator<(const Cost_estimate &other) const {
3789 return other > *this ? true : false;
3790 }
3791
3792 /// Add to IO cost
3793 void add_io(double add_io_cost) {
3794 assert(!is_max_cost());
3795 io_cost += add_io_cost;
3796 }
3797
3798 /// Add to CPU cost
3799 void add_cpu(double add_cpu_cost) {
3800 assert(!is_max_cost());
3801 cpu_cost += add_cpu_cost;
3802 }
3803
3804 /// Add to import cost
3805 void add_import(double add_import_cost) {
3806 assert(!is_max_cost());
3807 import_cost += add_import_cost;
3808 }
3809
3810 /// Add to memory cost
3811 void add_mem(double add_mem_cost) {
3812 assert(!is_max_cost());
3813 mem_cost += add_mem_cost;
3814 }
3815};
3816
3817void get_sweep_read_cost(TABLE *table, ha_rows nrows, bool interrupted,
3818 Cost_estimate *cost);
3819
3820/*
3821 The below two are not used (and not handled) in this milestone of this WL
3822 entry because there seems to be no use for them at this stage of
3823 implementation.
3824*/
3825#define HA_MRR_SINGLE_POINT 1
3826#define HA_MRR_FIXED_KEY 2
3827
3828/*
3829 Indicates that RANGE_SEQ_IF::next(&range) doesn't need to fill in the
3830 'range' parameter.
3831*/
3832#define HA_MRR_NO_ASSOCIATION 4
3833
3834/*
3835 The MRR user will provide ranges in key order, and MRR implementation
3836 must return rows in key order.
3837 Passing this flag to multi_read_range_init() may cause the
3838 default MRR handler to be used even if HA_MRR_USE_DEFAULT_IMPL
3839 was not specified.
3840 (If the native MRR impl. can not provide SORTED result)
3841*/
3842#define HA_MRR_SORTED 8
3843
3844/* MRR implementation doesn't have to retrieve full records */
3845#define HA_MRR_INDEX_ONLY 16
3846
3847/*
3848 The passed memory buffer is of maximum possible size, the caller can't
3849 assume larger buffer.
3850*/
3851#define HA_MRR_LIMITS 32
3852
3853/*
3854 Flag set <=> default MRR implementation is used
3855 (The choice is made by **_info[_const]() function which may set this
3856 flag. SQL layer remembers the flag value and then passes it to
3857 multi_read_range_init().
3858*/
3859#define HA_MRR_USE_DEFAULT_IMPL 64
3860
3861/*
3862 Used only as parameter to multi_range_read_info():
3863 Flag set <=> the caller guarantees that the bounds of the scanned ranges
3864 will not have NULL values.
3865*/
3866#define HA_MRR_NO_NULL_ENDPOINTS 128
3867
3868/*
3869 Set by the MRR implementation to signal that it will natively
3870 produced sorted result if multi_range_read_init() is called with
3871 the HA_MRR_SORTED flag - Else multi_range_read_init(HA_MRR_SORTED)
3872 will revert to use the default MRR implementation.
3873*/
3874#define HA_MRR_SUPPORT_SORTED 256
3875
3877 public:
3878 ulonglong data_file_length; /* Length off data file */
3879 ulonglong max_data_file_length; /* Length off data file */
3882 ulonglong delete_length; /* Free bytes */
3884 /*
3885 The number of records in the table.
3886 0 - means the table has exactly 0 rows
3887 other - if (table_flags() & HA_STATS_RECORDS_IS_EXACT)
3888 the value is the exact number of records in the table
3889 else
3890 it is an estimate
3891 */
3893 ha_rows deleted; /* Deleted records */
3894 ulong mean_rec_length; /* physical reclength */
3895 /* TODO: create_time should be retrieved from the new DD. Remove this. */
3896 time_t create_time; /* When table was created */
3899 uint block_size; /* index block size */
3900
3901 /*
3902 number of buffer bytes that native mrr implementation needs,
3903 */
3905
3906 /**
3907 Estimate for how much of the table that is available in a memory
3908 buffer. Valid range is [0..1]. If it has the special value
3909 IN_MEMORY_ESTIMATE_UNKNOWN (defined in structs.h), it means that
3910 the storage engine has not supplied any value for it.
3911 */
3913
3915 : data_file_length(0),
3918 delete_length(0),
3920 records(0),
3921 deleted(0),
3922 mean_rec_length(0),
3923 create_time(0),
3924 check_time(0),
3925 update_time(0),
3926 block_size(0),
3928};
3929
3930/**
3931 Calculates length of key.
3932
3933 Given a key index and a map of key parts return length of buffer used by key
3934 parts.
3935
3936 @param table Table containing the key
3937 @param key Key index
3938 @param keypart_map which key parts that is used
3939
3940 @return Length of used key parts.
3941*/
3942uint calculate_key_len(TABLE *table, uint key, key_part_map keypart_map);
3943/*
3944 bitmap with first N+1 bits set
3945 (keypart_map for a key prefix of [0..N] keyparts)
3946*/
3947#define make_keypart_map(N) (((key_part_map)2 << (N)) - 1)
3948/*
3949 bitmap with first N bits set
3950 (keypart_map for a key prefix of [0..N-1] keyparts)
3951*/
3952#define make_prev_keypart_map(N) (((key_part_map)1 << (N)) - 1)
3953
3954/** Base class to be used by handlers different shares */
3956 public:
3957 Handler_share() = default;
3958 virtual ~Handler_share() = default;
3959};
3960
3961/**
3962 Wrapper for struct ft_hints.
3963*/
3964
3966 private:
3968
3969 public:
3970 explicit Ft_hints(uint ft_flags) {
3971 hints.flags = ft_flags;
3973 hints.op_value = 0.0;
3975 }
3976
3977 /**
3978 Set comparison operation type and and value for master MATCH function.
3979
3980 @param type comparison operation type
3981 @param value comparison operation value
3982 */
3983 void set_hint_op(enum ft_operation type, double value) {
3984 hints.op_type = type;
3985 hints.op_value = value;
3986 }
3987
3988 /**
3989 Set Ft_hints flag.
3990
3991 @param ft_flag Ft_hints flag
3992 */
3993 void set_hint_flag(uint ft_flag) { hints.flags |= ft_flag; }
3994
3995 /**
3996 Set Ft_hints limit.
3997
3998 @param ft_limit limit
3999 */
4000 void set_hint_limit(ha_rows ft_limit) { hints.limit = ft_limit; }
4001
4002 /**
4003 Get Ft_hints limit.
4004
4005 @return Ft_hints limit
4006 */
4007 ha_rows get_limit() const { return hints.limit; }
4008
4009 /**
4010 Get Ft_hints operation value.
4011
4012 @return operation value
4013 */
4014 double get_op_value() const { return hints.op_value; }
4015
4016 /**
4017 Get Ft_hints operation type.
4018
4019 @return operation type
4020 */
4021 enum ft_operation get_op_type() const { return hints.op_type; }
4022
4023 /**
4024 Get Ft_hints flags.
4025
4026 @return Ft_hints flags
4027 */
4028 uint get_flags() const { return hints.flags; }
4029
4030 /**
4031 Get ft_hints struct.
4032
4033 @return pointer to ft_hints struct
4034 */
4036 return &hints;
4037 }
4038};
4039
4040/**
4041 The handler class is the interface for dynamically loadable
4042 storage engines. Do not add ifdefs and take care when adding or
4043 changing virtual functions to avoid vtable confusion
4044
4045 Functions in this class accept and return table columns data. Two data
4046 representation formats are used:
4047 1. TableRecordFormat - Used to pass [partial] table records to/from
4048 storage engine
4049
4050 2. KeyTupleFormat - used to pass index search tuples (aka "keys") to
4051 storage engine. See opt_range.cc for description of this format.
4052
4053 TableRecordFormat
4054 =================
4055 [Warning: this description is work in progress and may be incomplete]
4056 The table record is stored in a fixed-size buffer:
4057
4058 record: null_bytes, column1_data, column2_data, ...
4059
4060 The offsets of the parts of the buffer are also fixed: every column has
4061 an offset to its column{i}_data, and if it is nullable it also has its own
4062 bit in null_bytes.
4063
4064 The record buffer only includes data about columns that are marked in the
4065 relevant column set (table->read_set and/or table->write_set, depending on
4066 the situation).
4067 <not-sure>It could be that it is required that null bits of non-present
4068 columns are set to 1</not-sure>
4069
4070 VARIOUS EXCEPTIONS AND SPECIAL CASES
4071
4072 If the table has no nullable columns, then null_bytes is still
4073 present, its length is one byte <not-sure> which must be set to 0xFF
4074 at all times. </not-sure>
4075
4076 If the table has columns of type BIT, then certain bits from those columns
4077 may be stored in null_bytes as well. Grep around for Field_bit for
4078 details.
4079
4080 For blob columns (see Field_blob), the record buffer stores length of the
4081 data, following by memory pointer to the blob data. The pointer is owned
4082 by the storage engine and is valid until the next operation.
4083
4084 If a blob column has NULL value, then its length and blob data pointer
4085 must be set to 0.
4086
4087
4088 Overview of main modules of the handler API
4089 ===========================================
4090 The overview below was copied from the storage/partition/ha_partition.h when
4091 support for non-native partitioning was removed.
4092
4093 -------------------------------------------------------------------------
4094 MODULE create/delete handler object
4095 -------------------------------------------------------------------------
4096 Object create/delete method. Normally called when a table object
4097 exists.
4098
4099 -------------------------------------------------------------------------
4100 MODULE meta data changes
4101 -------------------------------------------------------------------------
4102 Meta data routines to CREATE, DROP, RENAME table are often used at
4103 ALTER TABLE (update_create_info used from ALTER TABLE and SHOW ..).
4104
4105 Methods:
4106 delete_table()
4107 rename_table()
4108 create()
4109 update_create_info()
4110
4111 -------------------------------------------------------------------------
4112 MODULE open/close object
4113 -------------------------------------------------------------------------
4114 Open and close handler object to ensure all underlying files and
4115 objects allocated and deallocated for query handling is handled
4116 properly.
4117
4118 A handler object is opened as part of its initialisation and before
4119 being used for normal queries (not before meta-data changes always.
4120 If the object was opened it will also be closed before being deleted.
4121
4122 Methods:
4123 open()
4124 close()
4125
4126 -------------------------------------------------------------------------
4127 MODULE start/end statement
4128 -------------------------------------------------------------------------
4129 This module contains methods that are used to understand start/end of
4130 statements, transaction boundaries, and aid for proper concurrency
4131 control.
4132
4133 Methods:
4134 store_lock()
4135 external_lock()
4136 start_stmt()
4137 lock_count()
4138 unlock_row()
4139 was_semi_consistent_read()
4140 try_semi_consistent_read()
4141
4142 -------------------------------------------------------------------------
4143 MODULE change record
4144 -------------------------------------------------------------------------
4145 This part of the handler interface is used to change the records
4146 after INSERT, DELETE, UPDATE, REPLACE method calls but also other
4147 special meta-data operations as ALTER TABLE, LOAD DATA, TRUNCATE.
4148
4149 These methods are used for insert (write_row), update (update_row)
4150 and delete (delete_row). All methods to change data always work on
4151 one row at a time. update_row and delete_row also contains the old
4152 row.
4153 delete_all_rows will delete all rows in the table in one call as a
4154 special optimization for DELETE from table;
4155
4156 Bulk inserts are supported if all underlying handlers support it.
4157 start_bulk_insert and end_bulk_insert is called before and after a
4158 number of calls to write_row.
4159
4160 Methods:
4161 write_row()
4162 update_row()
4163 delete_row()
4164 delete_all_rows()
4165 start_bulk_insert()
4166 end_bulk_insert()
4167
4168 -------------------------------------------------------------------------
4169 MODULE full table scan
4170 -------------------------------------------------------------------------
4171 This module is used for the most basic access method for any table
4172 handler. This is to fetch all data through a full table scan. No
4173 indexes are needed to implement this part.
4174 It contains one method to start the scan (rnd_init) that can also be
4175 called multiple times (typical in a nested loop join). Then proceeding
4176 to the next record (rnd_next) and closing the scan (rnd_end).
4177 To remember a record for later access there is a method (position)
4178 and there is a method used to retrieve the record based on the stored
4179 position.
4180 The position can be a file position, a primary key, a ROWID dependent
4181 on the handler below.
4182
4183 All functions that retrieve records and are callable through the
4184 handler interface must indicate whether a record is present after the call
4185 or not. Record found is indicated by returning 0 and setting table status
4186 to "has row". Record not found is indicated by returning a non-zero value
4187 and setting table status to "no row".
4188 @see TABLE::set_found_row() and TABLE::set_no_row().
4189 By enforcing these rules in the handler interface, storage handler functions
4190 need not set any status in struct TABLE. These notes also apply to module
4191 index scan, documented below.
4192
4193 Methods:
4194
4195 rnd_init()
4196 rnd_end()
4197 rnd_next()
4198 rnd_pos()
4199 rnd_pos_by_record()
4200 position()
4201
4202 -------------------------------------------------------------------------
4203 MODULE index scan
4204 -------------------------------------------------------------------------
4205 This part of the handler interface is used to perform access through
4206 indexes. The interface is defined as a scan interface but the handler
4207 can also use key lookup if the index is a unique index or a primary
4208 key index.
4209 Index scans are mostly useful for SELECT queries but are an important
4210 part also of UPDATE, DELETE, REPLACE and CREATE TABLE table AS SELECT
4211 and so forth.
4212 Naturally an index is needed for an index scan and indexes can either
4213 be ordered, hash based. Some ordered indexes can return data in order
4214 but not necessarily all of them.
4215 There are many flags that define the behavior of indexes in the
4216 various handlers. These methods are found in the optimizer module.
4217
4218 index_read is called to start a scan of an index. The find_flag defines
4219 the semantics of the scan. These flags are defined in
4220 include/my_base.h
4221 index_read_idx is the same but also initializes index before calling doing
4222 the same thing as index_read. Thus it is similar to index_init followed
4223 by index_read. This is also how we implement it.
4224
4225 index_read/index_read_idx does also return the first row. Thus for
4226 key lookups, the index_read will be the only call to the handler in
4227 the index scan.
4228
4229 index_init initializes an index before using it and index_end does
4230 any end processing needed.
4231
4232 Methods:
4233 index_read_map()
4234 index_init()
4235 index_end()
4236 index_read_idx_map()
4237 index_next()
4238 index_prev()
4239 index_first()
4240 index_last()
4241 index_next_same()
4242 index_read_last_map()
4243 read_range_first()
4244 read_range_next()
4245
4246 -------------------------------------------------------------------------
4247 MODULE information calls
4248 -------------------------------------------------------------------------
4249 This calls are used to inform the handler of specifics of the ongoing
4250 scans and other actions. Most of these are used for optimisation
4251 purposes.
4252
4253 Methods:
4254 info()
4255 get_dynamic_partition_info
4256 extra()
4257 extra_opt()
4258 reset()
4259
4260 -------------------------------------------------------------------------
4261 MODULE optimizer support
4262 -------------------------------------------------------------------------
4263 NOTE:
4264 One important part of the public handler interface that is not depicted in
4265 the methods is the attribute records which is defined in the base class.
4266 This is looked upon directly and is set by calling info(HA_STATUS_INFO) ?
4267
4268 Methods:
4269 min_rows_for_estimate()
4270 get_biggest_used_partition()
4271 scan_time()
4272 read_time()
4273 records_in_range()
4274 estimate_rows_upper_bound()
4275 records()
4276
4277 -------------------------------------------------------------------------
4278 MODULE print messages
4279 -------------------------------------------------------------------------
4280 This module contains various methods that returns text messages for
4281 table types, index type and error messages.
4282
4283 Methods:
4284 table_type()
4285 get_row_type()
4286 print_error()
4287 get_error_message()
4288
4289 -------------------------------------------------------------------------
4290 MODULE handler characteristics
4291 -------------------------------------------------------------------------
4292 This module contains a number of methods defining limitations and
4293 characteristics of the handler (see also documentation regarding the
4294 individual flags).
4295
4296 Methods:
4297 table_flags()
4298 index_flags()
4299 min_of_the_max_uint()
4300 max_supported_record_length()
4301 max_supported_keys()
4302 max_supported_key_parts()
4303 max_supported_key_length()
4304 max_supported_key_part_length()
4305 low_byte_first()
4306 extra_rec_buf_length()
4307 min_record_length(uint options)
4308 primary_key_is_clustered()
4309 ha_key_alg get_default_index_algorithm()
4310 is_index_algorithm_supported()
4311
4312 -------------------------------------------------------------------------
4313 MODULE compare records
4314 -------------------------------------------------------------------------
4315 cmp_ref checks if two references are the same. For most handlers this is
4316 a simple memcmp of the reference. However some handlers use primary key
4317 as reference and this can be the same even if memcmp says they are
4318 different. This is due to character sets and end spaces and so forth.
4319
4320 Methods:
4321 cmp_ref()
4322
4323 -------------------------------------------------------------------------
4324 MODULE auto increment
4325 -------------------------------------------------------------------------
4326 This module is used to handle the support of auto increments.
4327
4328 This variable in the handler is used as part of the handler interface
4329 It is maintained by the parent handler object and should not be
4330 touched by child handler objects (see handler.cc for its use).
4331
4332 Methods:
4333 get_auto_increment()
4334 release_auto_increment()
4335
4336 -------------------------------------------------------------------------
4337 MODULE initialize handler for HANDLER call
4338 -------------------------------------------------------------------------
4339 This method is a special InnoDB method called before a HANDLER query.
4340
4341 Methods:
4342 init_table_handle_for_HANDLER()
4343
4344 -------------------------------------------------------------------------
4345 MODULE fulltext index
4346 -------------------------------------------------------------------------
4347 Fulltext index support.
4348
4349 Methods:
4350 ft_init_ext_with_hints()
4351 ft_init()
4352 ft_init_ext()
4353 ft_read()
4354
4355 -------------------------------------------------------------------------
4356 MODULE in-place ALTER TABLE
4357 -------------------------------------------------------------------------
4358 Methods for in-place ALTER TABLE support (implemented by InnoDB and NDB).
4359
4360 Methods:
4361 check_if_supported_inplace_alter()
4362 prepare_inplace_alter_table()
4363 inplace_alter_table()
4364 commit_inplace_alter_table()
4365 notify_table_changed()
4366
4367 -------------------------------------------------------------------------
4368 MODULE tablespace support
4369 -------------------------------------------------------------------------
4370 Methods:
4371 discard_or_import_tablespace()
4372
4373 -------------------------------------------------------------------------
4374 MODULE administrative DDL
4375 -------------------------------------------------------------------------
4376 Methods:
4377 optimize()
4378 analyze()
4379 check()
4380 repair()
4381 check_and_repair()
4382 auto_repair()
4383 is_crashed()
4384 check_for_upgrade()
4385 checksum()
4386 assign_to_keycache()
4387
4388 -------------------------------------------------------------------------
4389 MODULE enable/disable indexes
4390 -------------------------------------------------------------------------
4391 Enable/Disable Indexes are only supported by HEAP and MyISAM.
4392
4393 Methods:
4394 disable_indexes()
4395 enable_indexes()
4396 indexes_are_disabled()
4397
4398 -------------------------------------------------------------------------
4399 MODULE append_create_info
4400 -------------------------------------------------------------------------
4401 Only used by MyISAM MERGE tables.
4402
4403 Methods:
4404 append_create_info()
4405
4406 -------------------------------------------------------------------------
4407 MODULE partitioning specific handler API
4408 -------------------------------------------------------------------------
4409 Methods:
4410 get_partition_handler()
4411*/
4412
4413class handler {
4414 friend class Partition_handler;
4415
4416 public:
4418
4419 protected:
4420 TABLE_SHARE *table_share; /* The table definition */
4421 TABLE *table; /* The current open table */
4422 Table_flags cached_table_flags{0}; /* Set on init() and open() */
4423
4425
4426 public:
4427 handlerton *ht; /* storage engine of this handler */
4428 /** Pointer to current row */
4430 /** Pointer to duplicate row */
4432
4434
4435 /* MultiRangeRead-related members: */
4436 range_seq_t mrr_iter; /* Iterator to traverse the range sequence */
4437 RANGE_SEQ_IF mrr_funcs; /* Range sequence traversal functions */
4438 HANDLER_BUFFER *multi_range_buffer; /* MRR buffer info */
4439 uint ranges_in_seq; /* Total number of ranges in the traversed sequence */
4440 /* true <=> source MRR ranges and the output are ordered */
4442
4443 /* true <=> we're currently traversing a range in mrr_cur_range. */
4445 /* Current range (the one we're now returning rows from) */
4447
4448 /*
4449 The direction of the current range or index scan. This is used by
4450 the ICP implementation to determine if it has reached the end
4451 of the current range.
4452 */
4454
4455 private:
4456 Record_buffer *m_record_buffer = nullptr; ///< Buffer for multi-row reads.
4457 /*
4458 Storage space for the end range value. Should only be accessed using
4459 the end_range pointer. The content is invalid when end_range is NULL.
4460 */
4464
4465 /**
4466 Pointer to the handler of the table in the primary storage engine,
4467 if this handler represents a table in a secondary storage engine.
4468 */
4470
4471 protected:
4474 /*
4475 true <=> the engine guarantees that returned records are within the range
4476 being scanned.
4477 */
4479
4480 public:
4481 /**
4482 End value for a range scan. If this is NULL the range scan has no
4483 end value. Should also be NULL when there is no ongoing range scan.
4484 Used by the read_range() functions and also evaluated by pushed
4485 index conditions.
4486 */
4488 /**
4489 Flag which tells if #end_range contains a virtual generated column.
4490 The content is invalid when #end_range is @c nullptr.
4491 */
4493 uint errkey; /* Last dup key */
4496 /** Length of ref (1-8 or the clustered key length) */
4499 enum { NONE = 0, INDEX, RND, SAMPLING } inited;
4500 bool implicit_emptied; /* Can be !=0 only if HEAP */
4502
4504 uint pushed_idx_cond_keyno; /* The index which the above condition is for */
4505
4506 /**
4507 next_insert_id is the next value which should be inserted into the
4508 auto_increment column: in a inserting-multi-row statement (like INSERT
4509 SELECT), for the first row where the autoinc value is not specified by the
4510 statement, get_auto_increment() called and asked to generate a value,
4511 next_insert_id is set to the next value, then for all other rows
4512 next_insert_id is used (and increased each time) without calling
4513 get_auto_increment().
4514 */
4516 /**
4517 insert id for the current row (*autogenerated*; if not
4518 autogenerated, it's 0).
4519 At first successful insertion, this variable is stored into
4520 THD::first_successful_insert_id_in_cur_stmt.
4521 */
4523 /**
4524 Interval returned by get_auto_increment() and being consumed by the
4525 inserter.
4526 */
4528 /**
4529 Number of reserved auto-increment intervals. Serves as a heuristic
4530 when we have no estimation of how many records the statement will insert:
4531 the more intervals we have reserved, the bigger the next one. Reset in
4532 handler::ha_release_auto_increment().
4533 */
4535
4536 /**
4537 Instrumented table associated with this handler.
4538 */
4540
4543
4544 private:
4545 /** Internal state of the batch instrumentation. */
4547 /** Batch mode not used. */
4549 /** Batch mode used, before first table io. */
4551 /** Batch mode used, after first table io. */
4554 /**
4555 Batch mode state.
4556 @sa start_psi_batch_mode.
4557 @sa end_psi_batch_mode.
4558 */
4560 /**
4561 The number of rows in the batch.
4562 @sa start_psi_batch_mode.
4563 @sa end_psi_batch_mode.
4564 */
4566 /**
4567 The current event in a batch.
4568 @sa start_psi_batch_mode.
4569 @sa end_psi_batch_mode.
4570 */
4572 /**
4573 Storage for the event in a batch.
4574 @sa start_psi_batch_mode.
4575 @sa end_psi_batch_mode.
4576 */
4578
4579 public:
4580 void unbind_psi();
4581 void rebind_psi();
4582 /**
4583 Put the handler in 'batch' mode when collecting
4584 table io instrumented events.
4585 When operating in batch mode:
4586 - a single start event is generated in the performance schema.
4587 - all table io performed between @c start_psi_batch_mode
4588 and @c end_psi_batch_mode is not instrumented:
4589 the number of rows affected is counted instead in @c m_psi_numrows.
4590 - a single end event is generated in the performance schema
4591 when the batch mode ends with @c end_psi_batch_mode.
4592 */
4593 void start_psi_batch_mode();
4594 /** End a batch started with @c start_psi_batch_mode. */
4595 void end_psi_batch_mode();
4596 /**
4597 If a PSI batch was started, turn if off.
4598 @returns true if it was started.
4599 */
4601 bool rc = m_psi_batch_mode;
4602 if (rc) end_psi_batch_mode();
4603 return rc;
4604 }
4605
4606 private:
4607 /**
4608 The lock type set by when calling::ha_external_lock(). This is
4609 propagated down to the storage engine. The reason for also storing
4610 it here, is that when doing MRR we need to create/clone a second handler
4611 object. This cloned handler object needs to know about the lock_type used.
4612 */
4614 /**
4615 Pointer where to store/retrieve the Handler_share pointer.
4616 For non partitioned handlers this is &TABLE_SHARE::ha_share.
4617 */
4619
4620 /**
4621 Some non-virtual ha_* functions, responsible for reading rows,
4622 like ha_rnd_pos(), must ensure that virtual generated columns are
4623 calculated before they return. For that, they should set this
4624 member to true at their start, and check it before they return: if
4625 the member is still true, it means they should calculate; if it's
4626 false, it means the calculation has been done by some called
4627 lower-level function and does not need to be re-done (which is why
4628 we need this status flag: to avoid redundant calculations, for
4629 performance).
4630
4631 Note that when updating generated fields, the NULL row status in
4632 the underlying TABLE objects matter, so be sure to reset them if needed!
4633 */
4635
4636 /* Filter row ids to weed out duplicates when multi-valued index is used */
4638
4639 public:
4640 handler(handlerton *ht_arg, TABLE_SHARE *share_arg)
4641 : table_share(share_arg),
4642 table(nullptr),
4644 ht(ht_arg),
4645 ref(nullptr),
4651 ref_length(sizeof(my_off_t)),
4653 inited(NONE),
4654 implicit_emptied(false),
4658 next_insert_id(0),
4661 m_psi(nullptr),
4663 m_psi_numrows(0),
4665 m_lock_type(F_UNLCK),
4668 m_unique(nullptr) {
4669 DBUG_PRINT("info", ("handler created F_UNLCK %d F_RDLCK %d F_WRLCK %d",
4670 F_UNLCK, F_RDLCK, F_WRLCK));
4671 }
4672
4673 virtual ~handler(void) {
4674 assert(m_psi == nullptr);
4676 assert(m_psi_locker == nullptr);
4677 assert(m_lock_type == F_UNLCK);
4678 assert(inited == NONE);
4679 }
4680
4681 /**
4682 Return extra handler specific text for EXPLAIN.
4683 */
4684 virtual std::string explain_extra() const { return ""; }
4685
4686 /*
4687 @todo reorganize functions, make proper public/protected/private qualifiers
4688 */
4689 virtual handler *clone(const char *name, MEM_ROOT *mem_root);
4690 /** This is called after create to allow us to set up cached variables */
4692 /* ha_ methods: public wrappers for private virtual API */
4693
4694 /**
4695 Set a record buffer that the storage engine can use for multi-row reads.
4696 The buffer has to be provided prior to the first read from an index or a
4697 table.
4698
4699 @param buffer the buffer to use for multi-row reads
4700 */
4702
4703 /**
4704 Get the record buffer that was set with ha_set_record_buffer().
4705
4706 @return the buffer to use for multi-row reads, or nullptr if there is none
4707 */
4709
4710 /**
4711 Does this handler want to get a Record_buffer for multi-row reads
4712 via the ha_set_record_buffer() function? And if so, what is the
4713 maximum number of records to allocate space for in the buffer?
4714
4715 Storage engines that support using a Record_buffer should override
4716 handler::is_record_buffer_wanted().
4717
4718 @param[out] max_rows gets set to the maximum number of records to
4719 allocate space for in the buffer if the function
4720 returns true
4721
4722 @retval true if the handler would like a Record_buffer
4723 @retval false if the handler does not want a Record_buffer
4724 */
4725 bool ha_is_record_buffer_wanted(ha_rows *const max_rows) const {
4726 return is_record_buffer_wanted(max_rows);
4727 }
4728
4729 int ha_open(TABLE *table, const char *name, int mode, int test_if_locked,
4730 const dd::Table *table_def);
4731 int ha_close(void);
4732 int ha_index_init(uint idx, bool sorted);
4733 int ha_index_end();
4734 int ha_rnd_init(bool scan);
4735 int ha_rnd_end();
4736 int ha_rnd_next(uchar *buf);
4737 // See the comment on m_update_generated_read_fields.
4738 int ha_rnd_pos(uchar *buf, uchar *pos);
4739 int ha_index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map,
4740 enum ha_rkey_function find_flag);
4742 key_part_map keypart_map);
4743 int ha_index_read_idx_map(uchar *buf, uint index, const uchar *key,
4744 key_part_map keypart_map,
4745 enum ha_rkey_function find_flag);
4746 int ha_index_next(uchar *buf);
4747 int ha_index_prev(uchar *buf);
4748 int ha_index_first(uchar *buf);
4749 int ha_index_last(uchar *buf);
4750 int ha_index_next_same(uchar *buf, const uchar *key, uint keylen);
4751 int ha_reset();
4752 /* this is necessary in many places, e.g. in HANDLER command */
4754 return inited == INDEX ? ha_index_end() : inited == RND ? ha_rnd_end() : 0;
4755 }
4756 /**
4757 The cached_table_flags is set at ha_open and ha_external_lock
4758 */
4760 /**
4761 These functions represent the public interface to *users* of the
4762 handler class, hence they are *not* virtual. For the inheritance
4763 interface, see the (private) functions write_row(), update_row(),
4764 and delete_row() below.
4765 */
4766 int ha_external_lock(THD *thd, int lock_type);
4767 int ha_write_row(uchar *buf);
4768 /**
4769 Update the current row.
4770
4771 @param old_data the old contents of the row
4772 @param new_data the new contents of the row
4773 @return error status (zero on success, HA_ERR_* error code on error)
4774 */
4775 int ha_update_row(const uchar *old_data, uchar *new_data);
4776 int ha_delete_row(const uchar *buf);
4778
4779 int ha_check_for_upgrade(HA_CHECK_OPT *check_opt);
4780 /** to be actually called to get 'check()' functionality*/
4781 int ha_check(THD *thd, HA_CHECK_OPT *check_opt);
4782 int ha_repair(THD *thd, HA_CHECK_OPT *check_opt);
4783 void ha_start_bulk_insert(ha_rows rows);
4784 int ha_end_bulk_insert();
4785 int ha_bulk_update_row(const uchar *old_data, uchar *new_data,
4786 uint *dup_key_found);
4787 int ha_delete_all_rows();
4789 int ha_optimize(THD *thd, HA_CHECK_OPT *check_opt);
4790 int ha_analyze(THD *thd, HA_CHECK_OPT *check_opt);
4791 bool ha_check_and_repair(THD *thd);
4795 int ha_rename_table(const char *from, const char *to,
4796 const dd::Table *from_table_def, dd::Table *to_table_def);
4797 int ha_delete_table(const char *name, const dd::Table *table_def);
4798 void ha_drop_table(const char *name);
4799
4800 int ha_create(const char *name, TABLE *form, HA_CREATE_INFO *info,
4802
4803 int ha_load_table(const TABLE &table);
4804
4805 int ha_unload_table(const char *db_name, const char *table_name,
4806 bool error_if_not_loaded);
4807
4808 /**
4809 Initializes a parallel scan. It creates a parallel_scan_ctx that has to
4810 be used across all parallel_scan methods. Also, gets the number of
4811 threads that would be spawned for parallel scan.
4812 @param[out] scan_ctx The parallel scan context.
4813 @param[out] num_threads Number of threads used for the scan.
4814 @param[in] use_reserved_threads true if reserved threads are to be used
4815 if we exhaust the max cap of number of
4816 parallel read threads that can be
4817 spawned at a time
4818 @return error code
4819 @retval 0 on success
4820 */
4821 virtual int parallel_scan_init(void *&scan_ctx [[maybe_unused]],
4822 size_t *num_threads [[maybe_unused]],
4823 bool use_reserved_threads [[maybe_unused]]) {
4824 return 0;
4825 }
4826
4827 /**
4828 This callback is called by each parallel load thread at the beginning of
4829 the parallel load for the adapter scan.
4830 @param cookie The cookie for this thread
4831 @param ncols Number of columns in each row
4832 @param row_len The size of a row in bytes
4833 @param col_offsets An array of size ncols, where each element represents
4834 the offset of a column in the row data. The memory of
4835 this array belongs to the caller and will be free-ed
4836 after the pload_end_cbk call.
4837 @param null_byte_offsets An array of size ncols, where each element
4838 represents the offset of a column in the row data. The
4839 memory of this array belongs to the caller and will be
4840 free-ed after the pload_end_cbk call.
4841 @param null_bitmasks An array of size ncols, where each element
4842 represents the bitmask required to get the null bit. The
4843 memory of this array belongs to the caller and will be
4844 free-ed after the pload_end_cbk call.
4845 */
4846 using Load_init_cbk = std::function<bool(
4847 void *cookie, ulong ncols, ulong row_len, const ulong *col_offsets,
4848 const ulong *null_byte_offsets, const ulong *null_bitmasks)>;
4849
4850 /**
4851 This callback is called by each parallel load thread when processing
4852 of rows is required for the adapter scan.
4853 @param[in] cookie The cookie for this thread
4854 @param[in] nrows The nrows that are available
4855 @param[in] rowdata The mysql-in-memory row data buffer. This is a
4856 memory buffer for nrows records. The length of each record is fixed and
4857 communicated via Load_init_cbk
4858 @param[in] partition_id Partition id if it's a partitioned table, else
4859 std::numeric_limits<uint64_t>::max()
4860 @returns true if there is an error, false otherwise.
4861 */
4862 using Load_cbk = std::function<bool(void *cookie, uint nrows, void *rowdata,
4863 uint64_t partition_id)>;
4864
4865 /**
4866 This callback is called by each parallel load thread when processing
4867 of rows has ended for the adapter scan.
4868 @param[in] cookie The cookie for this thread
4869 */
4870 using Load_end_cbk = std::function<void(void *cookie)>;
4871
4872 /**
4873 Run the parallel read of data.
4874 @param[in] scan_ctx Scan context of the parallel read.
4875 @param[in,out] thread_ctxs Caller thread contexts.
4876 @param[in] init_fn Callback called by each parallel load
4877 thread at the beginning of the parallel load.
4878 @param[in] load_fn Callback called by each parallel load
4879 thread when processing of rows is required.
4880 @param[in] end_fn Callback called by each parallel load
4881 thread when processing of rows has ended.
4882 @return error code
4883 @retval 0 on success
4884 */
4885 virtual int parallel_scan(void *scan_ctx [[maybe_unused]],
4886 void **thread_ctxs [[maybe_unused]],
4887 Load_init_cbk init_fn [[maybe_unused]],
4888 Load_cbk load_fn [[maybe_unused]],
4889 Load_end_cbk end_fn [[maybe_unused]]) {
4890 return 0;
4891 }
4892
4893 /**
4894 End of the parallel scan.
4895 @param[in] scan_ctx A scan context created by parallel_scan_init.
4896 */
4897 virtual void parallel_scan_end(void *scan_ctx [[maybe_unused]]) { return; }
4898
4899 /**
4900 Submit a dd::Table object representing a core DD table having
4901 hardcoded data to be filled in by the DDSE. This function can be
4902 used for retrieving the hard coded SE private data for the
4903 mysql.dd_properties table, before creating or opening it, or for
4904 retrieving the hard coded SE private data for a core table,
4905 before creating or opening them.
4906
4907 @param dd_table [in,out] A dd::Table object representing
4908 a core DD table.
4909 @param reset Reset counters.
4910
4911 @retval true An error occurred.
4912 @retval false Success - no errors.
4913 */
4914
4915 bool ha_get_se_private_data(dd::Table *dd_table, bool reset);
4916
4919 virtual void print_error(int error, myf errflag);
4920 virtual bool get_error_message(int error, String *buf);
4921 uint get_dup_key(int error);
4922 /**
4923 Retrieves the names of the table and the key for which there was a
4924 duplicate entry in the case of HA_ERR_FOREIGN_DUPLICATE_KEY.
4925
4926 If any of the table or key name is not available this method will return
4927 false and will not change any of child_table_name or child_key_name.
4928
4929 @param [out] child_table_name Table name
4930 @param [in] child_table_name_len Table name buffer size
4931 @param [out] child_key_name Key name
4932 @param [in] child_key_name_len Key name buffer size
4933
4934 @retval true table and key names were available
4935 and were written into the corresponding
4936 out parameters.
4937 @retval false table and key names were not available,
4938 the out parameters were not touched.
4939 */
4940 virtual bool get_foreign_dup_key(char *child_table_name,
4941 uint child_table_name_len,
4942 char *child_key_name,
4943 uint child_key_name_len);
4944 /**
4945 Change the internal TABLE_SHARE pointer.
4946
4947 @param table_arg TABLE object
4948 @param share New share to use
4949
4950 @note Is used in error handling in ha_delete_table.
4951 */
4952
4953 virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share) {
4954 table = table_arg;
4955 table_share = share;
4956 }
4957 const TABLE_SHARE *get_table_share() const { return table_share; }
4958
4959 /* Estimates calculation */
4960
4961 /**
4962 @deprecated This function is deprecated and will be removed in a future
4963 version. Use table_scan_cost() instead.
4964 */
4965
4966 virtual double scan_time() {
4967 return ulonglong2double(stats.data_file_length) / IO_SIZE + 2;
4968 }
4969
4970 /**
4971 The cost of reading a set of ranges from the table using an index
4972 to access it.
4973
4974 @deprecated This function is deprecated and will be removed in a future
4975 version. Use read_cost() instead.
4976
4977 @param index The index number.
4978 @param ranges The number of ranges to be read.
4979 @param rows Total number of rows to be read.
4980
4981 This method can be used to calculate the total cost of scanning a table
4982 using an index by calling it using read_time(index, 1, table_size).
4983 */
4984
4985 virtual double read_time(uint index [[maybe_unused]], uint ranges,
4986 ha_rows rows) {
4987 return rows2double(ranges + rows);
4988 }
4989
4990 /**
4991 @deprecated This function is deprecated and will be removed in a future
4992 version. Use index_scan_cost() instead.
4993 */
4994
4995 virtual double index_only_read_time(uint keynr, double records);
4996
4997 /**
4998 Cost estimate for doing a complete table scan.
4999
5000 @note For this version it is recommended that storage engines continue
5001 to override scan_time() instead of this function.
5002
5003 @returns the estimated cost
5004 */
5005
5007
5008 /**
5009 Cost estimate for reading a number of ranges from an index.
5010
5011 The cost estimate will only include the cost of reading data that
5012 is contained in the index. If the records need to be read, use
5013 read_cost() instead.
5014
5015 @note The ranges parameter is currently ignored and is not taken
5016 into account in the cost estimate.
5017
5018 @note For this version it is recommended that storage engines continue
5019 to override index_only_read_time() instead of this function.
5020
5021 @param index the index number
5022 @param ranges the number of ranges to be read
5023 @param rows total number of rows to be read
5024
5025 @returns the estimated cost
5026 */
5027
5028 virtual Cost_estimate index_scan_cost(uint index, double ranges, double rows);
5029
5030 /**
5031 Cost estimate for reading a set of ranges from the table using an index
5032 to access it.
5033
5034 @note For this version it is recommended that storage engines continue
5035 to override read_time() instead of this function.
5036
5037 @param index the index number
5038 @param ranges the number of ranges to be read
5039 @param rows total number of rows to be read
5040
5041 @returns the estimated cost
5042 */
5043
5044 virtual Cost_estimate read_cost(uint index, double ranges, double rows);
5045
5046 /**
5047 Cost estimate for doing a number of non-sequentially accesses
5048 against the storage engine. Such accesses can be either number
5049 of rows to read, or number of disk pages to access.
5050 Each handler implementation is free to interpret that as best
5051 suited, depending on what is the dominating cost for that
5052 storage engine.
5053
5054 This method is mainly provided as a temporary workaround for
5055 bug#33317872, where we fix problems caused by calling
5056 Cost_model::page_read_cost() directly from the optimizer.
5057 That should be avoided, as it introduced assumption about all
5058 storage engines being disk-page based, and having a 'page' cost.
5059 Furthermore, this page cost was even compared against read_cost(),
5060 which was computed with an entirely different algorithm, and thus
5061 could not be compared.
5062
5063 The default implementation still call Cost_model::page_read_cost(),
5064 thus behaving just as before. However, handler implementation may
5065 override it to call handler::read_cost() instead(), which probably
5066 will be more correct. (If a page_read_cost should be included
5067 in the cost estimate, that should preferable be done inside
5068 each read_cost() implementation)
5069
5070 Longer term we should consider to remove all page_read_cost()
5071 usage from the optimizer itself, making this method obsolete.
5072
5073 @param index the index number
5074 @param reads the number of accesses being made
5075
5076 @returns the estimated cost
5077 */
5078 virtual double page_read_cost(uint index, double reads);
5079
5080 /**
5081 Provide an upper cost-limit of doing a specified number of
5082 seek-and-read key lookups. This need to be comparable and
5083 calculated with the same 'metric' as page_read_cost.
5084
5085 @param reads the number of rows read in the 'worst' case.
5086
5087 @returns the estimated cost
5088 */
5089 virtual double worst_seek_times(double reads);
5090
5091 /**
5092 Return an estimate on the amount of memory the storage engine will
5093 use for caching data in memory. If this is unknown or the storage
5094 engine does not cache data in memory -1 is returned.
5095 */
5096 virtual longlong get_memory_buffer_size() const { return -1; }
5097
5098 /**
5099 Return an estimate of how much of the table that is currently stored
5100 in main memory.
5101
5102 This estimate should be the fraction of the table that currently
5103 is available in a main memory buffer. The estimate should be in the
5104 range from 0.0 (nothing in memory) to 1.0 (entire table in memory).
5105
5106 @return The fraction of the table in main memory buffer
5107 */
5108
5109 double table_in_memory_estimate() const;
5110
5111 /**
5112 Return an estimate of how much of the index that is currently stored
5113 in main memory.
5114
5115 This estimate should be the fraction of the index that currently
5116 is available in a main memory buffer. The estimate should be in the
5117 range from 0.0 (nothing in memory) to 1.0 (entire index in memory).
5118
5119 @param keyno the index to get an estimate for
5120
5121 @return The fraction of the index in main memory buffer
5122 */
5123
5124 double index_in_memory_estimate(uint keyno) const;
5125
5126 /**
5127 Initialize sampling.
5128
5129 @param[out] scan_ctx A scan context created by this method that has to be
5130 used in sample_next
5131 @param[in] sampling_percentage percentage of records that need to be
5132 sampled
5133 @param[in] sampling_seed random seed that the random generator will
5134 use
5135 @param[in] sampling_method sampling method to be used; currently only
5136 SYSTEM sampling is supported
5137 @param[in] tablesample true if the sampling is for tablesample
5138
5139 @return 0 for success, else one of the HA_xxx values in case of error.
5140 */
5141 int ha_sample_init(void *&scan_ctx, double sampling_percentage,
5142 int sampling_seed, enum_sampling_method sampling_method,
5143 const bool tablesample);
5144
5145 /**
5146 Get the next record for sampling.
5147
5148 @param[in] scan_ctx Scan context of the sampling
5149 @param[in] buf buffer to place the read record
5150
5151 @return 0 for success, else one of the HA_xxx values in case of error.
5152 */
5153 int ha_sample_next(void *scan_ctx, uchar *buf);
5154
5155 /**
5156 End sampling.
5157
5158 @param[in] scan_ctx Scan context of the sampling
5159
5160 @return 0 for success, else one of the HA_xxx values in case of error.
5161 */
5162 int ha_sample_end(void *scan_ctx);
5163
5164 private:
5166
5167 /**
5168 Make a guesstimate for how much of a table or index is in a memory
5169 buffer in the case where the storage engine has not provided any
5170 estimate for this.
5171
5172 @param table_index_size size of the table or index
5173
5174 @return The fraction of the table or index in main memory buffer
5175 */
5176
5177 double estimate_in_memory_buffer(ulonglong table_index_size) const;
5178
5179 public:
5181 void *seq_init_param,
5182 uint n_ranges, uint *bufsz,
5183 uint *flags, Cost_estimate *cost);
5184 virtual ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys,
5185 uint *bufsz, uint *flags,
5186 Cost_estimate *cost);
5187 virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param,
5188 uint n_ranges, uint mode,
5190
5191 int ha_multi_range_read_next(char **range_info);
5192
5193 int ha_read_range_first(const key_range *start_key, const key_range *end_key,
5194 bool eq_range, bool sorted);
5195 int ha_read_range_next();
5196
5198 return (ha_table_flags() & HA_NO_TRANSACTIONS) == 0;
5199 }
5200 virtual uint extra_rec_buf_length() const { return 0; }
5201
5202 /**
5203 @brief Determine whether an error can be ignored or not.
5204
5205 @details This method is used to analyze the error to see whether the
5206 error is ignorable or not. Such errors will be reported as warnings
5207 instead of errors for IGNORE statements. This means that the statement
5208 will not abort, but instead continue to the next row.
5209
5210 HA_ERR_FOUND_DUP_UNIQUE is a special case in MyISAM that means the
5211 same thing as HA_ERR_FOUND_DUP_KEY, but can in some cases lead to
5212 a slightly different error message.
5213
5214 @param error error code received from the handler interface (HA_ERR_...)
5215
5216 @return whether the error is ignorable or not
5217 @retval true the error is ignorable
5218 @retval false the error is not ignorable
5219 */
5220
5221 virtual bool is_ignorable_error(int error);
5222
5223 /**
5224 @brief Determine whether an error is fatal or not.
5225
5226 @details This method is used to analyze the error to see whether the
5227 error is fatal or not. A fatal error is an error that will not be
5228 possible to handle with SP handlers and will not be subject to
5229 retry attempts on the slave.
5230
5231 @param error error code received from the handler interface (HA_ERR_...)
5232
5233 @return whether the error is fatal or not
5234 @retval true the error is fatal
5235 @retval false the error is not fatal
5236 */
5237
5238 virtual bool is_fatal_error(int error);
5239
5240 protected:
5241 virtual int multi_range_read_next(char **range_info);
5242
5243 /**
5244 Number of rows in table. If HA_COUNT_ROWS_INSTANT is set, count is
5245 available instantly. Else do a table scan.
5246
5247 @param num_rows [out] num_rows number of rows in table.
5248
5249 @retval 0 for OK, one of the HA_xxx values in case of error.
5250 */
5251 virtual int records(ha_rows *num_rows);
5252
5253 /**
5254 Number of rows in table counted using the secondary index chosen by
5255 optimizer. See comments in optimize_aggregated_query() .
5256
5257 @param num_rows [out] Number of rows in table.
5258 @param index Index chosen by optimizer for counting.
5259
5260 @retval 0 for OK, one of the HA_xxx values in case of error.
5261 */
5262 virtual int records_from_index(ha_rows *num_rows, uint index);
5263
5264 private:
5265 /**
5266 Function will handle the error code from call to records() and
5267 records_from_index().
5268
5269 @param error return code from records() and records_from_index().
5270 @param num_rows Check if it contains HA_POS_ERROR in case error < 0.
5271
5272 @retval 0 for OK, one of the HA_xxx values in case of error.
5273 */
5274 int handle_records_error(int error, ha_rows *num_rows);
5275
5276 public:
5277 /**
5278 Wrapper function to call records() in storage engine.
5279
5280 @param num_rows [out] Number of rows in table.
5281
5282 @retval 0 for OK, one of the HA_xxx values in case of error.
5283 */
5284 int ha_records(ha_rows *num_rows) {
5285 return handle_records_error(records(num_rows), num_rows);
5286 }
5287
5288 /**
5289 Wrapper function to call records_from_index() in storage engine.
5290
5291 @param num_rows [out] Number of rows in table.
5292 @param index Index chosen by optimizer for counting.
5293
5294 @retval 0 for OK, one of the HA_xxx values in case of error.
5295 */
5296 int ha_records(ha_rows *num_rows, uint index) {
5297 return handle_records_error(records_from_index(num_rows, index), num_rows);
5298 }
5299
5300 /**
5301 Return upper bound of current number of records in the table
5302 (max. of how many records one will retrieve when doing a full table scan)
5303 If upper bound is not known, HA_POS_ERROR should be returned as a max
5304 possible upper bound.
5305 */
5307 return stats.records + EXTRA_RECORDS;
5308 }
5309
5310 /**
5311 Get real row type for the table created based on one specified by user,
5312 CREATE TABLE options and SE capabilities.
5313 */
5315 const HA_CREATE_INFO *create_info) const {
5316 return (create_info->table_options & HA_OPTION_COMPRESS_RECORD)
5318 : ((create_info->table_options & HA_OPTION_PACK_RECORD)
5320 : ROW_TYPE_FIXED);
5321 }
5322
5323 /**
5324 Get default key algorithm for SE. It is used when user has not provided
5325 algorithm explicitly or when algorithm specified is not supported by SE.
5326 */
5329 }
5330
5331 /**
5332 Check if SE supports specific key algorithm.
5333
5334 @note This method is never used for FULLTEXT or SPATIAL keys.
5335 We rely on handler::ha_table_flags() to check if such keys
5336 are supported.
5337 */
5338 virtual bool is_index_algorithm_supported(enum ha_key_alg key_alg) const {
5339 return key_alg == HA_KEY_ALG_SE_SPECIFIC;
5340 }
5341
5342 /**
5343 Signal that the table->read_set and table->write_set table maps changed
5344 The handler is allowed to set additional bits in the above map in this
5345 call. Normally the handler should ignore all calls until we have done
5346 a ha_rnd_init() or ha_index_init(), write_row(), update_row or delete_row()
5347 as there may be several calls to this routine.
5348 */
5349 virtual void column_bitmaps_signal();
5350 uint get_index(void) const { return active_index; }
5351
5352 /**
5353 @retval false Bulk update used by handler
5354 @retval true Bulk update not used, normal operation used
5355 */
5356 virtual bool start_bulk_update() { return true; }
5357 /**
5358 @retval false Bulk delete used by handler
5359 @retval true Bulk delete not used, normal operation used
5360 */
5361 virtual bool start_bulk_delete() { return true; }
5362 /**
5363 After this call all outstanding updates must be performed. The number
5364 of duplicate key errors are reported in the duplicate key parameter.
5365 It is allowed to continue to the batched update after this call, the
5366 handler has to wait until end_bulk_update with changing state.
5367
5368 @param dup_key_found Number of duplicate keys found
5369
5370 @retval 0 Success
5371 @retval >0 Error code
5372 */
5373 virtual int exec_bulk_update(uint *dup_key_found [[maybe_unused]]) {
5374 assert(false);
5375 return HA_ERR_WRONG_COMMAND;
5376 }
5377 /**
5378 Perform any needed clean-up, no outstanding updates are there at the
5379 moment.
5380 */
5381 virtual void end_bulk_update() { return; }
5382 /**
5383 Execute all outstanding deletes and close down the bulk delete.
5384
5385 @retval 0 Success
5386 @retval >0 Error code
5387 */
5388 virtual int end_bulk_delete() {
5389 assert(false);
5390 return HA_ERR_WRONG_COMMAND;
5391 }
5392
5393 protected:
5394 /**
5395 @brief
5396 Positions an index cursor to the index specified in the handle
5397 ('active_index'). Fetches the row if available. If the key value is null,
5398 begin at the first key of the index.
5399 @returns 0 if success (found a record); non-zero if no record.
5400 */
5401 virtual int index_read_map(uchar *buf, const uchar *key,
5402 key_part_map keypart_map,
5403 enum ha_rkey_function find_flag) {
5404 uint key_len = calculate_key_len(table, active_index, keypart_map);
5405 return index_read(buf, key, key_len, find_flag);
5406 }
5407 /**
5408 Positions an index cursor to the index specified in argument. Fetches
5409 the row if available. If the key value is null, begin at the first key of
5410 the index.
5411 @sa index_read_map()
5412 */
5413 virtual int index_read_idx_map(uchar *buf, uint index, const uchar *key,
5414 key_part_map keypart_map,
5415 enum ha_rkey_function find_flag);
5416
5417 /*
5418 These methods are used to jump to next or previous entry in the index
5419 scan. There are also methods to jump to first and last entry.
5420 */
5421 /// @see index_read_map().
5422 virtual int index_next(uchar *) { return HA_ERR_WRONG_COMMAND; }
5423
5424 /// @see index_read_map().
5425 virtual int index_prev(uchar *) { return HA_ERR_WRONG_COMMAND; }
5426
5427 /// @see index_read_map().
5428 virtual int index_first(uchar *) { return HA_ERR_WRONG_COMMAND; }
5429
5430 /// @see index_read_map().
5431 virtual int index_last(uchar *) { return HA_ERR_WRONG_COMMAND; }
5432
5433 /// @see index_read_map().
5434 virtual int index_next_same(uchar *buf, const uchar *key, uint keylen);
5435 /**
5436 The following functions works like index_read, but it find the last
5437 row with the current key value or prefix.
5438 @see index_read_map().
5439 */
5440 virtual int index_read_last_map(uchar *buf, const uchar *key,
5441 key_part_map keypart_map) {
5442 uint key_len = calculate_key_len(table, active_index, keypart_map);
5443 return index_read_last(buf, key, key_len);
5444 }
5445
5446 virtual int read_range_first(const key_range *start_key,
5447 const key_range *end_key, bool eq_range_arg,
5448 bool sorted);
5449 virtual int read_range_next();
5450
5451 public:
5452 /**
5453 Set the end position for a range scan. This is used for checking
5454 for when to end the range scan and by the ICP code to determine
5455 that the next record is within the current range.
5456
5457 @param range The end value for the range scan
5458 @param direction Direction of the range scan
5459 */
5460 void set_end_range(const key_range *range,
5461 enum_range_scan_direction direction);
5463 int compare_key_icp(const key_range *range) const;
5464 int compare_key_in_buffer(const uchar *buf) const;
5465 virtual int ft_init() { return HA_ERR_WRONG_COMMAND; }
5466 virtual FT_INFO *ft_init_ext(uint flags, uint inx, String *key);
5468 Ft_hints *hints) {
5469 return ft_init_ext(hints->get_flags(), inx, key);
5470 }
5471 int ha_ft_read(uchar *buf);
5473
5474 protected:
5475 /// @see index_read_map().
5476 virtual int rnd_next(uchar *buf) = 0;
5477 /// @see index_read_map().
5478 virtual int rnd_pos(uchar *buf, uchar *pos) = 0;
5479
5480 virtual int ft_read(uchar *) { return HA_ERR_WRONG_COMMAND; }
5481
5482 public:
5483 /**
5484 This function only works for handlers having
5485 HA_PRIMARY_KEY_REQUIRED_FOR_POSITION set.
5486 It will return the row with the PK given in the record argument.
5487 */
5489 int error;
5491
5492 error = ha_rnd_init(false);
5493 if (error != 0) return error;
5494
5497
5498 ha_rnd_end();
5499 return error;
5500 }
5501
5502 /**
5503 Find number of records in a range.
5504
5505 Given a starting key, and an ending key estimate the number of rows that
5506 will exist between the two. max_key may be empty which in case determine
5507 if start_key matches any rows. Used by optimizer to calculate cost of
5508 using a particular index.
5509
5510 @param inx Index number
5511 @param min_key Start of range
5512 @param max_key End of range
5513
5514 @return Number of rows in range.
5515 */
5516
5517 virtual ha_rows records_in_range(uint inx [[maybe_unused]],
5518 key_range *min_key [[maybe_unused]],
5519 key_range *max_key [[maybe_unused]]) {
5520 return (ha_rows)10;
5521 }
5522 /*
5523 If HA_PRIMARY_KEY_REQUIRED_FOR_POSITION is set, then it sets ref
5524 (reference to the row, aka position, with the primary key given in
5525 the record).
5526 Otherwise it set ref to the current row.
5527 */
5528 virtual void position(const uchar *record) = 0;
5529
5530 /**
5531 General method to gather info from handler
5532
5533 ::info() is used to return information to the optimizer.
5534 SHOW also makes use of this data Another note, if your handler
5535 doesn't proved exact record count, you will probably want to
5536 have the following in your code:
5537 if (records < 2)
5538 records = 2;
5539 The reason is that the server will optimize for cases of only a single
5540 record. If in a table scan you don't know the number of records
5541 it will probably be better to set records to two so you can return
5542 as many records as you need.
5543
5544 Along with records a few more variables you may wish to set are:
5545 records
5546 deleted
5547 data_file_length
5548 index_file_length
5549 delete_length
5550 check_time
5551 Take a look at the public variables in handler.h for more information.
5552 See also my_base.h for a full description.
5553
5554 @param flag Specifies what info is requested
5555 */
5556
5557 virtual int info(uint flag) = 0;
5559 [[maybe_unused]]) {
5560 assert(0);
5561 return 0;
5562 }
5563 /**
5564 Request storage engine to do an extra operation: enable,disable or run some
5565 functionality.
5566
5567 @param operation the operation to perform
5568
5569 @returns
5570 0 on success
5571 error otherwise
5572 */
5573 int ha_extra(enum ha_extra_function operation);
5574
5575 private:
5576 /**
5577 Storage engine specific implementation of ha_extra()
5578
5579 @param operation the operation to perform
5580
5581 @returns
5582 0 on success
5583 error otherwise
5584 */
5585 virtual int extra(enum ha_extra_function operation [[maybe_unused]]) {
5586 return 0;
5587 }
5588
5589 public:
5590 virtual int extra_opt(enum ha_extra_function operation,
5591 ulong cache_size [[maybe_unused]]) {
5592 return extra(operation);
5593 }
5594
5595 /**
5596 Get the handlerton of the storage engine if the SE is capable of
5597 pushing down some of the AccessPath functionality.
5598 (Join, Filter conditions, ... possiby more)
5599
5600 Call the handlerton::push_to_engine() method for performing the
5601 actual pushdown of (parts of) the AccessPath functionality
5602
5603 @returns handlerton* of the SE if it may be capable of
5604 off loading part of the query by calling
5605 handlerton::push_to_engine()
5606
5607 Else, 'nullptr' is returned.
5608 */
5610 return nullptr;
5611 }
5612
5613 /**
5614 Start read (before write) removal on the current table.
5615 @see HA_READ_BEFORE_WRITE_REMOVAL
5616 */
5617 virtual bool start_read_removal(void) {
5618 assert(0);
5619 return false;
5620 }
5621
5622 /**
5623 End read (before write) removal and return the number of rows
5624 really written
5625 @see HA_READ_BEFORE_WRITE_REMOVAL
5626 */
5628 assert(0);
5629 return (ha_rows)0;
5630 }
5631
5632 /**
5633 Normally, when running UPDATE or DELETE queries, we need to wait for other
5634 transactions to release their locks on a given row before we can read it and
5635 potentially update it. However, in READ UNCOMMITTED and READ COMMITTED, we
5636 can ignore these locks if we don't intend to modify the row (e.g., because
5637 it failed a WHERE). This is signaled through enabling “semi-consistent
5638 read”, by calling try_semi_consistent_read(true) (and then setting it back
5639 to false after finishing the query).
5640
5641 If semi-consistent read is enabled, and we are in READ UNCOMMITTED or READ
5642 COMMITTED, the storage engine is permitted to return rows that are locked
5643 and thus un-updatable. If the optimizer doesn't want the row, e.g., because
5644 it got filtered out, it can call unlock_row() as usual. However, if it
5645 intends to update the row, it needs to call was_semi_consistent_read()
5646 before doing so. If was_semi_consistent_read() returns false, the row was
5647 never locked to begin with and can be updated as usual. However, if it
5648 returns 1, it was read optimistically, must be discarded (ie., do not try to
5649 update the row) and must be re-read with locking enabled. The next read call
5650 after was_semi_consistent_read() will automatically re-read the same row,
5651 this time with locking enabled.
5652
5653 Thus, typical use in an UPDATE scenario would look like this:
5654
5655 file->try_semi_consistent_read(true);
5656 file->ha_rnd_init(true);
5657 while (file->ha_rnd_next(table->record[0]) == 0) {
5658 if (row is filtered...) {
5659 file->unlock_row();
5660 continue;
5661 }
5662 if (file->was_semi_consistent_read()) {
5663 // Discard the row; next ha_rnd_next() will read it again with
5664 // locking.
5665 continue;
5666 }
5667 // Process row here.
5668 }
5669 file->ha_rnd_end();
5670 file->try_semi_consistent_read(false);
5671
5672 If the transaction isolation level is REPEATABLE READ or SERIALIZABLE,
5673 enabling this flag has no effect.
5674 */
5675 virtual bool was_semi_consistent_read() { return false; }
5676 /**
5677 Tell the engine whether it should avoid unnecessary lock waits.
5678 If yes, in an UPDATE or DELETE, if the row under the cursor was locked
5679 by another transaction, the engine may try an optimistic read of
5680 the last committed row value under the cursor.
5681 */
5682 virtual void try_semi_consistent_read(bool) {}
5683
5684 /**
5685 Unlock last accessed row.
5686
5687 Record currently processed was not in the result set of the statement
5688 and is thus unlocked. Used for UPDATE and DELETE queries.
5689 */
5690
5691 virtual void unlock_row() {}
5692
5693 /**
5694 Start a statement when table is locked
5695
5696 This method is called instead of external lock when the table is locked
5697 before the statement is executed.
5698
5699 @param thd Thread object.
5700 @param lock_type Type of external lock.
5701
5702 @retval >0 Error code.
5703 @retval 0 Success.
5704 */
5705
5706 virtual int start_stmt(THD *thd [[maybe_unused]],
5707 thr_lock_type lock_type [[maybe_unused]]) {
5708 return 0;
5709 }
5710 virtual void get_auto_increment(ulonglong offset, ulonglong increment,
5711 ulonglong nb_desired_values,
5712 ulonglong *first_value,
5713 ulonglong *nb_reserved_values);
5715 DBUG_PRINT("info", ("auto_increment: next value %lu", (ulong)id));
5717 }
5719 /*
5720 Insertion of a row failed, re-use the lastly generated auto_increment
5721 id, for the next row. This is achieved by resetting next_insert_id to
5722 what it was before the failed insertion (that old value is provided by
5723 the caller). If that value was 0, it was the first row of the INSERT;
5724 then if insert_id_for_cur_row contains 0 it means no id was generated
5725 for this first row, so no id was generated since the INSERT started, so
5726 we should set next_insert_id to 0; if insert_id_for_cur_row is not 0, it
5727 is the generated id of the first and failed row, so we use it.
5728 */
5731 }
5732
5733 /**
5734 Update create info as part of ALTER TABLE.
5735
5736 Forward this handler call to the storage engine foreach
5737 partition handler. The data_file_name for each partition may
5738 need to be reset if the tablespace was moved. Use a dummy
5739 HA_CREATE_INFO structure and transfer necessary data.
5740
5741 @param create_info Create info from ALTER TABLE.
5742 */
5743
5744 virtual void update_create_info(HA_CREATE_INFO *create_info
5745 [[maybe_unused]]) {}
5748 }
5749 virtual int preload_keys(THD *, HA_CHECK_OPT *) {
5751 }
5752 /* end of the list of admin commands */
5753
5754 /**
5755 Check if indexes are disabled.
5756
5757 @retval 0 Indexes are enabled.
5758 @retval != 0 Indexes are disabled.
5759 */
5760
5761 virtual int indexes_are_disabled(void) { return 0; }
5762 virtual void append_create_info(String *packet [[maybe_unused]]) {}
5764 return;
5765 } /* prepare InnoDB for HANDLER */
5766 /** The following can be called without an open handler */
5767 virtual const char *table_type() const = 0;
5768
5769 virtual ulong index_flags(uint idx, uint part, bool all_parts) const = 0;
5770
5773 }
5774 uint max_keys() const {
5775 return std::min<uint>(MAX_KEY, max_supported_keys());
5776 }
5778 return std::min(MAX_REF_PARTS, max_supported_key_parts());
5779 }
5781 return std::min(MAX_KEY_LENGTH, max_supported_key_length());
5782 }
5784 return std::min(MAX_KEY_LENGTH, max_supported_key_part_length(create_info));
5785 }
5786
5788 virtual uint max_supported_keys() const { return 0; }
5789 virtual uint max_supported_key_parts() const { return MAX_REF_PARTS; }
5792 [[maybe_unused]]) const {
5793 return 255;
5794 }
5795 virtual uint min_record_length(uint options [[maybe_unused]]) const {
5796 return 1;
5797 }
5798
5799 virtual bool low_byte_first() const { return true; }
5800 virtual ha_checksum checksum() const { return 0; }
5801
5802 /**
5803 Check if the table is crashed.
5804
5805 @retval true Crashed
5806 @retval false Not crashed
5807 */
5808
5809 virtual bool is_crashed() const { return false; }
5810
5811 /**
5812 Check if the table can be automatically repaired.
5813
5814 @retval true Can be auto repaired
5815 @retval false Cannot be auto repaired
5816 */
5817
5818 virtual bool auto_repair() const { return false; }
5819
5820 /**
5821 Get number of lock objects returned in store_lock.
5822
5823 Returns the number of store locks needed in call to store lock.
5824 We return number of partitions we will lock multiplied with number of
5825 locks needed by each partition. Assists the above functions in allocating
5826 sufficient space for lock structures.
5827
5828 @returns Number of locks returned in call to store_lock.
5829
5830 @note lock_count() can return > 1 if the table is MERGE or partitioned.
5831 */
5832
5833 virtual uint lock_count(void) const { return 1; }
5834
5835 /**
5836 Is not invoked for non-transactional temporary tables.
5837
5838 @note store_lock() can return more than one lock if the table is MERGE
5839 or partitioned.
5840
5841 @note that one can NOT rely on table->in_use in store_lock(). It may
5842 refer to a different thread if called from mysql_lock_abort_for_thread().
5843
5844 @note If the table is MERGE, store_lock() can return less locks
5845 than lock_count() claimed. This can happen when the MERGE children
5846 are not attached when this is called from another thread.
5847
5848 The idea with handler::store_lock() is the following:
5849
5850 The statement decided which locks we should need for the table
5851 for updates/deletes/inserts we get WRITE locks, for SELECT... we get
5852 read locks.
5853
5854 Before adding the lock into the table lock handler (see thr_lock.c)
5855 mysqld calls store lock with the requested locks. Store lock can now
5856 modify a write lock to a read lock (or some other lock), ignore the
5857 lock (if we don't want to use MySQL table locks at all) or add locks
5858 for many tables (like we do when we are using a MERGE handler).
5859
5860 In some exceptional cases MySQL may send a request for a TL_IGNORE;
5861 This means that we are requesting the same lock as last time and this
5862 should also be ignored.
5863
5864 Called from lock.cc by get_lock_data().
5865 */
5867 enum thr_lock_type lock_type) = 0;
5868
5869 /**
5870 Check if the primary key is clustered or not.
5871
5872 @retval true Primary key (if there is one) is a clustered
5873 key covering all fields
5874 @retval false otherwise
5875 */
5876
5877 virtual bool primary_key_is_clustered() const { return false; }
5878
5879 /**
5880 Compare two positions.
5881
5882 @param ref1 First position.
5883 @param ref2 Second position.
5884
5885 @retval <0 ref1 < ref2.
5886 @retval 0 Equal.
5887 @retval >0 ref1 > ref2.
5888 */
5889
5890 virtual int cmp_ref(const uchar *ref1, const uchar *ref2) const {
5891 return memcmp(ref1, ref2, ref_length);
5892 }
5893
5894 /*
5895 Condition pushdown to storage engines
5896 */
5897
5898 /**
5899 Push condition down to the table handler.
5900
5901 @param cond Condition to be pushed. The condition tree
5902 must not be modified by the caller.
5903
5904 @return
5905 The 'remainder' condition that caller must use to filter out records.
5906 NULL means the handler will not return rows that do not match the
5907 passed condition.
5908
5909 @note
5910 handler->ha_reset() call discard any pushed conditions.
5911 Calls to rnd_init/rnd_end, index_init/index_end etc do not affect the
5912 pushed conditions.
5913 */
5914 virtual const Item *cond_push(const Item *cond) {
5915 assert(pushed_cond == nullptr);
5916 return cond;
5917 }
5918
5919 /**
5920 Push down an index condition to the handler.
5921
5922 The server will use this method to push down a condition it wants
5923 the handler to evaluate when retrieving records using a specified
5924 index. The pushed index condition will only refer to fields from
5925 this handler that is contained in the index (but it may also refer
5926 to fields in other handlers). Before the handler evaluates the
5927 condition it must read the content of the index entry into the
5928 record buffer.
5929
5930 The handler is free to decide if and how much of the condition it
5931 will take responsibility for evaluating. Based on this evaluation
5932 it should return the part of the condition it will not evaluate.
5933 If it decides to evaluate the entire condition it should return
5934 NULL. If it decides not to evaluate any part of the condition it
5935 should return a pointer to the same condition as given as argument.
5936
5937 @param keyno the index number to evaluate the condition on
5938 @param idx_cond the condition to be evaluated by the handler
5939
5940 @return The part of the pushed condition that the handler decides
5941 not to evaluate
5942 */
5943
5944 virtual Item *idx_cond_push(uint keyno [[maybe_unused]], Item *idx_cond) {
5945 return idx_cond;
5946 }
5947
5948 /** Reset information about pushed index conditions */
5949 virtual void cancel_pushed_idx_cond() {
5950 pushed_idx_cond = nullptr;
5953 }
5954
5955 /**
5956 Reports number of tables included in pushed join which this
5957 handler instance is part of. ==0 -> Not pushed
5958 */
5959 virtual uint number_of_pushed_joins() const { return 0; }
5960
5961 /**
5962 If this handler instance is part of a pushed join sequence
5963 returned TABLE instance being root of the pushed query?
5964 */
5965 virtual const TABLE *member_of_pushed_join() const { return nullptr; }
5966
5967 /**
5968 If this handler instance is a child in a pushed join sequence
5969 returned TABLE instance being my parent?
5970 */
5971 virtual const TABLE *parent_of_pushed_join() const { return nullptr; }
5972
5973 /// @returns a map of the tables involved in this pushed join, or 0 if not
5974 /// part of a pushed join.
5975 virtual table_map tables_in_pushed_join() const { return 0; }
5976
5977 int ha_index_read_pushed(uchar *buf, const uchar *key,
5978 key_part_map keypart_map);
5979
5981
5982 protected:
5983 virtual int index_read_pushed(uchar *, const uchar *, key_part_map) {
5984 return HA_ERR_WRONG_COMMAND;
5985 }
5986
5988
5989 public:
5990 /**
5991 Part of old, deprecated in-place ALTER API.
5992 */
5994 [[maybe_unused]],
5995 uint table_changes [[maybe_unused]]) {
5996 return COMPATIBLE_DATA_NO;
5997 }
5998
5999 /* On-line/in-place/instant ALTER TABLE interface. */
6000
6001 /*
6002 Here is an outline of on-line/in-place ALTER TABLE execution through
6003 this interface.
6004
6005 Phase 1 : Initialization
6006 ========================
6007 During this phase we determine which algorithm should be used
6008 for execution of ALTER TABLE and what level concurrency it will
6009 require.
6010
6011 *) This phase starts by opening the table and preparing description
6012 of the new version of the table.
6013 *) Then we check if it is impossible even in theory to carry out
6014 this ALTER TABLE using the in-place/instant algorithm. For example,
6015 because we need to change storage engine or the user has explicitly
6016 requested usage of the "copy" algorithm.
6017 *) If in-place/instant ALTER TABLE is theoretically possible, we continue
6018 by compiling differences between old and new versions of the table
6019 in the form of HA_ALTER_FLAGS bitmap. We also build a few
6020 auxiliary structures describing requested changes and store
6021 all these data in the Alter_inplace_info object.
6022 *) Then the handler::check_if_supported_inplace_alter() method is called
6023 in order to find if the storage engine can carry out changes requested
6024 by this ALTER TABLE using the in-place or instant algorithm.
6025 To determine this, the engine can rely on data in HA_ALTER_FLAGS/
6026 Alter_inplace_info passed to it as well as on its own checks.
6027 If the in-place algorithm can be used for this ALTER TABLE, the level
6028 of required concurrency for its execution is also returned.
6029 If any errors occur during the handler call, ALTER TABLE is aborted
6030 and no further handler functions are called.
6031 Note that in cases when there is difference between in-place and
6032 instant algorithm and user explicitly asked for usage of in-place
6033 algorithm storage engine MUST return one of values corresponding
6034 to in-place algorithm and not HA_ALTER_INPLACE_INSTANT from this
6035 method.
6036 *) Locking requirements of the in-place algorithm are compared to any
6037 concurrency requirements specified by user. If there is a conflict
6038 between them, we either switch to the copy algorithm or emit an error.
6039
6040 Phase 2 : Execution
6041 ===================
6042
6043 In this phase the operations are executed.
6044
6045 *) As the first step, we acquire a lock corresponding to the concurrency
6046 level which was returned by handler::check_if_supported_inplace_alter()
6047 and requested by the user. This lock is held for most of the
6048 duration of in-place ALTER (if HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE
6049 or HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE were returned we acquire an
6050 exclusive lock for duration of the next step only).
6051 For HA_ALTER_INPLACE_INSTANT we keep shared upgradable metadata lock
6052 which was acquired at table open time.
6053 *) After that we call handler::ha_prepare_inplace_alter_table() to give the
6054 storage engine a chance to update its internal structures with a higher
6055 lock level than the one that will be used for the main step of algorithm.
6056 After that we downgrade the lock if it is necessary.
6057 This step should be no-op for instant algorithm.
6058 *) After that, the main step of this phase and algorithm is executed.
6059 We call the handler::ha_inplace_alter_table() method, which carries out
6060 the changes requested by ALTER TABLE but does not makes them visible to
6061 other connections yet.
6062 This step should be no-op for instant algorithm as well.
6063 *) We ensure that no other connection uses the table by upgrading our
6064 lock on it to exclusive.
6065 *) a) If the previous step succeeds,
6066 handler::ha_commit_inplace_alter_table() is called to allow the storage
6067 engine to do any final updates to its structures, to make all earlier
6068 changes durable and visible to other connections.
6069 For instant algorithm this is the step during which SE changes are done.
6070 Engines that support atomic DDL only prepare for the commit during this
6071 step but do not finalize it. Real commit happens later when the whole
6072 statement is committed. Also in some situations statement might be rolled
6073 back after call to commit_inplace_alter_table() for such storage engines.
6074 In the latter special case SE might require call to
6075 handlerton::dict_cache_reset() in order to invalidate its internal table
6076 definition cache after rollback.
6077 b) If we have failed to upgrade lock or any errors have occurred during
6078 the handler functions calls (including commit), we call
6079 handler::ha_commit_inplace_alter_table() to rollback all changes which
6080 were done during previous steps.
6081
6082 All the above calls to SE are provided with dd::Table objects describing old
6083 and new version of table being altered. Engines which support atomic DDL are
6084 allowed to adjust object corresponding to the new version. During phase 3
6085 these changes are saved to the data-dictionary.
6086
6087
6088 Phase 3 : Final
6089 ===============
6090
6091 In this phase we:
6092
6093 a) For engines which don't support atomic DDL:
6094
6095 *) Update the SQL-layer data-dictionary by replacing description of old
6096 version of the table with its new version. This change is immediately
6097 committed.
6098 *) Inform the storage engine about this change by calling the
6099 handler::ha_notify_table_changed() method.
6100 *) Process the RENAME clause by calling handler::ha_rename_table() and
6101 updating the data-dictionary accordingly. Again this change is
6102 immediately committed.
6103 *) Destroy the Alter_inplace_info and handler_ctx objects.
6104
6105 b) For engines which support atomic DDL:
6106
6107 *) Update the SQL-layer data-dictionary by replacing description of old
6108 version of the table with its new version.
6109 *) Process the RENAME clause by calling handler::ha_rename_table() and
6110 updating the data-dictionary accordingly.
6111 *) Commit the statement/transaction.
6112 *) Finalize atomic DDL operation by calling handlerton::post_ddl() hook
6113 for the storage engine.
6114 *) Additionally inform the storage engine about completion of ALTER TABLE
6115 for the table by calling the handler::ha_notify_table_changed()
6116 method.
6117 *) Destroy the Alter_inplace_info and handler_ctx objects.
6118 */
6119
6120 /**
6121 Check if a storage engine supports a particular alter table in-place
6122
6123 @param altered_table TABLE object for new version of table.
6124 @param ha_alter_info Structure describing changes to be done
6125 by ALTER TABLE and holding data used
6126 during in-place alter.
6127
6128 @retval HA_ALTER_ERROR Unexpected error.
6129 @retval HA_ALTER_INPLACE_NOT_SUPPORTED Not supported, must use copy.
6130 @retval HA_ALTER_INPLACE_EXCLUSIVE_LOCK Supported, but requires X lock.
6131 @retval HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE
6132 Supported, but requires SNW lock
6133 during main phase. Prepare phase
6134 requires X lock.
6135 @retval HA_ALTER_INPLACE_SHARED_LOCK Supported, but requires SNW lock.
6136 @retval HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE
6137 Supported, concurrent
6138 reads/writes allowed. However, prepare phase requires X lock.
6139 @retval HA_ALTER_INPLACE_NO_LOCK Supported, concurrent
6140 reads/writes allowed.
6141 @retval HA_ALTER_INPLACE_INSTANT Instant algorithm is supported.
6142 Prepare and main phases are
6143 no-op. Changes happen during
6144 commit phase and it should be
6145 "instant". We keep SU lock,
6146 allowing concurrent reads and
6147 writes during no-op phases and
6148 upgrade it to X lock before
6149 commit phase.
6150
6151 @note The default implementation uses the old in-place ALTER API
6152 to determine if the storage engine supports in-place ALTER or not.
6153
6154 @note In cases when there is difference between in-place and instant
6155 algorithm and explicit ALGORITHM=INPLACE clause was provided SE MUST
6156 return one of values corresponding to in-place algorithm and not
6157 HA_ALTER_INPLACE_INSTANT from this method.
6158
6159 @note Called without holding thr_lock.c lock.
6160 */
6162 TABLE *altered_table, Alter_inplace_info *ha_alter_info);
6163
6164 /**
6165 Public functions wrapping the actual handler call.
6166 @see prepare_inplace_alter_table()
6167 */
6168 bool ha_prepare_inplace_alter_table(TABLE *altered_table,
6169 Alter_inplace_info *ha_alter_info,
6170 const dd::Table *old_table_def,
6171 dd::Table *new_table_def);
6172
6173 /**
6174 Public function wrapping the actual handler call.
6175 @see inplace_alter_table()
6176 */
6177 bool ha_inplace_alter_table(TABLE *altered_table,
6178 Alter_inplace_info *ha_alter_info,
6179 const dd::Table *old_table_def,
6180 dd::Table *new_table_def) {
6181 return inplace_alter_table(altered_table, ha_alter_info, old_table_def,
6182 new_table_def);
6183 }
6184
6185 /**
6186 Public function wrapping the actual handler call.
6187 Allows us to enforce asserts regardless of handler implementation.
6188 @see commit_inplace_alter_table()
6189 */
6190 bool ha_commit_inplace_alter_table(TABLE *altered_table,
6191 Alter_inplace_info *ha_alter_info,
6192 bool commit,
6193 const dd::Table *old_table_def,
6194 dd::Table *new_table_def);
6195
6196 /**
6197 Public function wrapping the actual handler call.
6198
6199 @see notify_table_changed()
6200 */
6202 notify_table_changed(ha_alter_info);
6203 }
6204
6205 protected:
6206 /**
6207 Allows the storage engine to update internal structures with concurrent
6208 writes blocked. If check_if_supported_inplace_alter() returns
6209 HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE or
6210 HA_ALTER_INPLACE_SHARED_AFTER_PREPARE, this function is called with
6211 exclusive lock otherwise the same level of locking as for
6212 inplace_alter_table() will be used.
6213
6214 @note Should be no-op for instant algorithm.
6215
6216 @note Storage engines are responsible for reporting any errors by
6217 calling my_error()/print_error()
6218
6219 @note If this function reports error, commit_inplace_alter_table()
6220 will be called with commit= false.
6221
6222 @note For partitioning, failing to prepare one partition, means that
6223 commit_inplace_alter_table() will be called to roll back changes for
6224 all partitions. This means that commit_inplace_alter_table() might be
6225 called without prepare_inplace_alter_table() having been called first
6226 for a given partition.
6227
6228 @param altered_table TABLE object for new version of table.
6229 @param ha_alter_info Structure describing changes to be done
6230 by ALTER TABLE and holding data used
6231 during in-place alter.
6232 @param old_table_def dd::Table object describing old version of
6233 the table.
6234 @param new_table_def dd::Table object for the new version of the
6235 table. Can be adjusted by this call if SE
6236 supports atomic DDL. These changes to the
6237 table definition will be persisted in the
6238 data-dictionary at statement commit time.
6239
6240 @retval true Error
6241 @retval false Success
6242 */
6244 TABLE *altered_table [[maybe_unused]],
6245 Alter_inplace_info *ha_alter_info [[maybe_unused]],
6246 const dd::Table *old_table_def [[maybe_unused]],
6247 dd::Table *new_table_def [[maybe_unused]]) {
6248 return false;
6249 }
6250
6251 /**
6252 Alter the table structure in-place with operations specified using
6253 HA_ALTER_FLAGS and Alter_inplace_info. The level of concurrency allowed
6254 during this operation depends on the return value from
6255 check_if_supported_inplace_alter().
6256
6257 @note Should be no-op for instant algorithm.
6258
6259 @note Storage engines are responsible for reporting any errors by
6260 calling my_error()/print_error()
6261
6262 @note If this function reports error, commit_inplace_alter_table()
6263 will be called with commit= false.
6264
6265 @param altered_table TABLE object for new version of table.
6266 @param ha_alter_info Structure describing changes to be done
6267 by ALTER TABLE and holding data used
6268 during in-place alter.
6269 @param old_table_def dd::Table object describing old version of
6270 the table.
6271 @param new_table_def dd::Table object for the new version of the
6272 table. Can be adjusted by this call if SE
6273 supports atomic DDL. These changes to the
6274 table definition will be persisted in the
6275 data-dictionary at statement commit time.
6276
6277 @retval true Error
6278 @retval false Success
6279 */
6280 virtual bool inplace_alter_table(TABLE *altered_table [[maybe_unused]],
6281 Alter_inplace_info *ha_alter_info
6282 [[maybe_unused]],
6283 const dd::Table *old_table_def
6284 [[maybe_unused]],
6285 dd::Table *new_table_def [[maybe_unused]]) {
6286 return false;
6287 }
6288
6289 /**
6290 Commit or rollback the changes made during prepare_inplace_alter_table()
6291 and inplace_alter_table() inside the storage engine.
6292 Note that in case of rollback the allowed level of concurrency during
6293 this operation will be the same as for inplace_alter_table() and thus
6294 might be higher than during prepare_inplace_alter_table(). (For example,
6295 concurrent writes were blocked during prepare, but might not be during
6296 rollback).
6297
6298 @note This is the place where SE changes happen for instant algorithm.
6299
6300 @note For storage engines supporting atomic DDL this method should only
6301 prepare for the commit but do not finalize it. Real commit should happen
6302 later when the whole statement is committed. Also in some situations
6303 statement might be rolled back after call to commit_inplace_alter_table()
6304 for such storage engines. In the latter special case SE might require call
6305 to handlerton::dict_cache_reset() in order to invalidate its internal
6306 table definition cache after rollback.
6307
6308 @note Storage engines are responsible for reporting any errors by
6309 calling my_error()/print_error()
6310
6311 @note If this function with commit= true reports error, it will be called
6312 again with commit= false.
6313
6314 @note In case of partitioning, this function might be called for rollback
6315 without prepare_inplace_alter_table() having been called first.
6316 Also partitioned tables sets ha_alter_info->group_commit_ctx to a NULL
6317 terminated array of the partitions handlers and if all of them are
6318 committed as one, then group_commit_ctx should be set to NULL to indicate
6319 to the partitioning handler that all partitions handlers are committed.
6320 @see prepare_inplace_alter_table().
6321
6322 @param altered_table TABLE object for new version of table.
6323 @param ha_alter_info Structure describing changes to be done
6324 by ALTER TABLE and holding data used
6325 during in-place alter.
6326 @param commit True => Commit, False => Rollback.
6327 @param old_table_def dd::Table object describing old version of
6328 the table.
6329 @param new_table_def dd::Table object for the new version of the
6330 table. Can be adjusted by this call if SE
6331 supports atomic DDL. These changes to the
6332 table definition will be persisted in the
6333 data-dictionary at statement commit time.
6334
6335 @retval true Error
6336 @retval false Success
6337 */
6338 virtual bool commit_inplace_alter_table(TABLE *altered_table [[maybe_unused]],
6339 Alter_inplace_info *ha_alter_info
6340 [[maybe_unused]],
6341 bool commit [[maybe_unused]],
6342 const dd::Table *old_table_def
6343 [[maybe_unused]],
6344 dd::Table *new_table_def
6345 [[maybe_unused]]) {
6346 /* Nothing to commit/rollback, mark all handlers committed! */
6347 ha_alter_info->group_commit_ctx = nullptr;
6348 return false;
6349 }
6350
6351 /**
6352 Notify the storage engine that the table definition has been updated.
6353
6354 @param ha_alter_info Structure describing changes done by
6355 ALTER TABLE and holding data used
6356 during in-place alter.
6357
6358 @note No errors are allowed during notify_table_changed().
6359
6360 @note For storage engines supporting atomic DDL this method is invoked
6361 after the whole ALTER TABLE is completed and committed.
6362 Particularly this means that for ALTER TABLE statements with RENAME
6363 clause TABLE/handler object used for invoking this method will be
6364 associated with new table name. If storage engine needs to know
6365 the old schema and table name in this method for some reason it
6366 has to use ha_alter_info object to figure it out.
6367 */
6368 virtual void notify_table_changed(Alter_inplace_info *ha_alter_info
6369 [[maybe_unused]]) {}
6370
6371 public:
6372 /* End of On-line/in-place ALTER TABLE interface. */
6373
6374 /**
6375 use_hidden_primary_key() is called in case of an update/delete when
6376 (table_flags() and HA_PRIMARY_KEY_REQUIRED_FOR_DELETE) is defined
6377 but we don't have a primary key
6378 */
6379 virtual void use_hidden_primary_key();
6380
6381 protected:
6382 /* Service methods for use by storage engines. */
6384 THD *ha_thd() const;
6385
6386 /**
6387 Acquire the instrumented table information from a table share.
6388 @param share a table share
6389 @return an instrumented table share, or NULL.
6390 */
6391 PSI_table_share *ha_table_share_psi(const TABLE_SHARE *share) const;
6392
6393 /**
6394 Default rename_table() and delete_table() rename/delete files with a
6395 given name and extensions from handlerton::file_extensions.
6396
6397 These methods can be overridden, but their default implementation
6398 provide useful functionality.
6399
6400 @param [in] from Path for the old table name.
6401 @param [in] to Path for the new table name.
6402 @param [in] from_table_def Old version of definition for table
6403 being renamed (i.e. prior to rename).
6404 @param [in,out] to_table_def New version of definition for table
6405 being renamed. Storage engines which
6406 support atomic DDL (i.e. having
6407 HTON_SUPPORTS_ATOMIC_DDL flag set)
6408 are allowed to adjust this object.
6409
6410 @retval >0 Error.
6411 @retval 0 Success.
6412 */
6413 virtual int rename_table(const char *from, const char *to,
6414 const dd::Table *from_table_def,
6415 dd::Table *to_table_def);
6416
6417 /**
6418 Delete a table.
6419
6420 Used to delete a table. By the time delete_table() has been called all
6421 opened references to this table will have been closed (and your globally
6422 shared references released. The variable name will just be the name of
6423 the table. You will need to remove any files you have created at this
6424 point. Called for base as well as temporary tables.
6425
6426 @param name Full path of table name.
6427 @param table_def dd::Table describing table being deleted
6428 (can be NULL for temporary tables created
6429 by optimizer).
6430
6431 @return Zero on success, nonzero otherwise.
6432 */
6433 virtual int delete_table(const char *name, const dd::Table *table_def);
6434
6435 private:
6436 /* Private helpers */
6437 void mark_trx_read_write();
6438 /*
6439 Low-level primitives for storage engines. These should be
6440 overridden by the storage engine class. To call these methods, use
6441 the corresponding 'ha_*' method above.
6442 */
6443
6444 virtual int open(const char *name, int mode, uint test_if_locked,
6445 const dd::Table *table_def) = 0;
6446 virtual int close(void) = 0;
6447 virtual int index_init(uint idx, bool sorted [[maybe_unused]]) {
6448 active_index = idx;
6449 return 0;
6450 }
6451 virtual int index_end() {
6453 return 0;
6454 }
6455 /**
6456 rnd_init() can be called two times without rnd_end() in between
6457 (it only makes sense if scan=1).
6458 then the second call should prepare for the new table scan (e.g
6459 if rnd_init allocates the cursor, second call should position it
6460 to the start of the table, no need to deallocate and allocate it again
6461 */
6462 virtual int rnd_init(bool scan) = 0;
6463 virtual int rnd_end() { return 0; }
6464 /**
6465 Write a row.
6466
6467 write_row() inserts a row. buf is a byte array of data, normally
6468 record[0].
6469
6470 You can use the field information to extract the data from the native byte
6471 array type.
6472
6473 Example of this would be:
6474 for (Field **field=table->field ; *field ; field++)
6475 {
6476 ...
6477 }
6478
6479 @param buf Buffer to write from.
6480
6481 @return Operation status.
6482 @retval 0 Success.
6483 @retval != 0 Error code.
6484 */
6485 virtual int write_row(uchar *buf [[maybe_unused]]) {
6486 return HA_ERR_WRONG_COMMAND;
6487 }
6488
6489 /**
6490 Update a single row.
6491
6492 Note: If HA_ERR_FOUND_DUPP_KEY is returned, the handler must read
6493 all columns of the row so MySQL can create an error message. If
6494 the columns required for the error message are not read, the error
6495 message will contain garbage.
6496 */
6497 virtual int update_row(const uchar *old_data [[maybe_unused]],
6498 uchar *new_data [[maybe_unused]]) {
6499 return HA_ERR_WRONG_COMMAND;
6500 }
6501
6502 virtual int delete_row(const uchar *buf [[maybe_unused]]) {
6503 return HA_ERR_WRONG_COMMAND;
6504 }
6505 /**
6506 Reset state of file to after 'open'.
6507 This function is called after every statement for all tables used
6508 by that statement.
6509 */
6510 virtual int reset() { return 0; }
6511 virtual Table_flags table_flags(void) const = 0;
6512 /**
6513 Is not invoked for non-transactional temporary tables.
6514
6515 Tells the storage engine that we intend to read or write data
6516 from the table. This call is prefixed with a call to handler::store_lock()
6517 and is invoked only for those handler instances that stored the lock.
6518
6519 Calls to @c rnd_init / @c index_init are prefixed with this call. When table
6520 IO is complete, we call @code external_lock(F_UNLCK) @endcode.
6521 A storage engine writer should expect that each call to
6522 @code ::external_lock(F_[RD|WR]LOCK @endcode is followed by a call to
6523 @code ::external_lock(F_UNLCK) @endcode. If it is not, it is a bug in MySQL.
6524
6525 The name and signature originate from the first implementation
6526 in MyISAM, which would call @c fcntl to set/clear an advisory
6527 lock on the data file in this method.
6528
6529 Originally this method was used to set locks on file level to enable
6530 several MySQL Servers to work on the same data. For transactional
6531 engines it has been "abused" to also mean start and end of statements
6532 to enable proper rollback of statements and transactions. When LOCK
6533 TABLES has been issued the start_stmt method takes over the role of
6534 indicating start of statement but in this case there is no end of
6535 statement indicator(?).
6536
6537 Called from lock.cc by lock_external() and unlock_external(). Also called
6538 from sql_table.cc by copy_data_between_tables().
6539
6540 @param thd the current thread
6541 @param lock_type F_RDLCK, F_WRLCK, F_UNLCK
6542
6543 @return non-0 in case of failure, 0 in case of success.
6544 When lock_type is F_UNLCK, the return value is ignored.
6545 */
6546 virtual int external_lock(THD *thd [[maybe_unused]],
6547 int lock_type [[maybe_unused]]) {
6548 return 0;
6549 }
6550 virtual void release_auto_increment() { return; }
6551 /** admin commands - called from mysql_admin_table */
6552 virtual int check_for_upgrade(HA_CHECK_OPT *) { return 0; }
6553 virtual int check(THD *, HA_CHECK_OPT *) { return HA_ADMIN_NOT_IMPLEMENTED; }
6554
6555 /**
6556 In this method check_opt can be modified
6557 to specify CHECK option to use to call check()
6558 upon the table.
6559 */
6560 virtual int repair(THD *, HA_CHECK_OPT *) {
6561 assert(!(ha_table_flags() & HA_CAN_REPAIR));
6563 }
6565 virtual int end_bulk_insert() { return 0; }
6566
6567 /**
6568 Does this handler want to get a Record_buffer for multi-row reads
6569 via the ha_set_record_buffer() function? And if so, what is the
6570 maximum number of records to allocate space for in the buffer?
6571
6572 Storage engines that support using a Record_buffer should override
6573 this function and return true for scans that could benefit from a
6574 buffer.
6575
6576 @param[out] max_rows gets set to the maximum number of records to
6577 allocate space for in the buffer if the function
6578 returns true
6579
6580 @retval true if the handler would like a Record_buffer
6581 @retval false if the handler does not want a Record_buffer
6582 */
6583 virtual bool is_record_buffer_wanted(ha_rows *const max_rows) const {
6584 *max_rows = 0;
6585 return false;
6586 }
6587
6588 // Set se_private_id and se_private_data during upgrade
6589 virtual bool upgrade_table(THD *thd [[maybe_unused]],
6590 const char *dbname [[maybe_unused]],
6591 const char *table_name [[maybe_unused]],
6592 dd::Table *dd_table [[maybe_unused]]) {
6593 return false;
6594 }
6595
6596 /** Initialize sampling.
6597 @param[out] scan_ctx A scan context created by this method that has to be
6598 used in sample_next
6599 @param[in] sampling_percentage percentage of records that need to be sampled
6600 @param[in] sampling_seed random seed
6601 @param[in] sampling_method sampling method to be used; currently only
6602 SYSTEM sampling is supported
6603 @param[in] tablesample true if the sampling is for tablesample
6604 @return 0 for success, else failure. */
6605 virtual int sample_init(void *&scan_ctx, double sampling_percentage,
6606 int sampling_seed,
6607 enum_sampling_method sampling_method,
6608 const bool tablesample);
6609
6610 /** Get the next record for sampling.
6611 @param[in] scan_ctx Scan context of the sampling
6612 @param[in] buf buffer to place the read record
6613 @return 0 for success, else failure. */
6614 virtual int sample_next(void *scan_ctx, uchar *buf);
6615
6616 /** End sampling.
6617 @param[in] scan_ctx Scan context of the sampling
6618 @return 0 for success, else failure. */
6619 virtual int sample_end(void *scan_ctx);
6620
6621 /**
6622 * Loads a table into its defined secondary storage engine.
6623 *
6624 * @param table Table opened in primary storage engine. Its read_set tells
6625 * which columns to load.
6626 *
6627 * @return 0 if success, error code otherwise.
6628 */
6629 virtual int load_table(const TABLE &table [[maybe_unused]]) {
6630 /* purecov: begin inspected */
6631 assert(false);
6632 return HA_ERR_WRONG_COMMAND;
6633 /* purecov: end */
6634 }
6635
6636 /**
6637 * Unloads a table from its defined secondary storage engine.
6638 *
6639 * @param db_name Database name.
6640 * @param table_name Table name.
6641 * @param error_if_not_loaded If true, then errors will be reported by this
6642 * function. If false, no errors will be reported
6643 * (silently fail). This case of false is useful
6644 * during DROP TABLE where a failure to unload
6645 * should not prevent dropping the whole table.
6646 * @return 0 if success, error code otherwise.
6647 */
6648 virtual int unload_table(const char *db_name [[maybe_unused]],
6649 const char *table_name [[maybe_unused]],
6650 bool error_if_not_loaded [[maybe_unused]]) {
6651 /* purecov: begin inspected */
6652 assert(false);
6653 return HA_ERR_WRONG_COMMAND;
6654 /* purecov: end */
6655 }
6656
6657 protected:
6658 virtual int index_read(uchar *buf [[maybe_unused]],
6659 const uchar *key [[maybe_unused]],
6660 uint key_len [[maybe_unused]],
6661 enum ha_rkey_function find_flag [[maybe_unused]]) {
6662 return HA_ERR_WRONG_COMMAND;
6663 }
6664 virtual int index_read_last(uchar *buf [[maybe_unused]],
6665 const uchar *key [[maybe_unused]],
6666 uint key_len [[maybe_unused]]) {
6668 return HA_ERR_WRONG_COMMAND;
6669 }
6670
6671 public:
6672 /**
6673 This method is similar to update_row, however the handler doesn't need
6674 to execute the updates at this point in time. The handler can be certain
6675 that another call to bulk_update_row will occur OR a call to
6676 exec_bulk_update before the set of updates in this query is concluded.
6677
6678 Note: If HA_ERR_FOUND_DUPP_KEY is returned, the handler must read
6679 all columns of the row so MySQL can create an error message. If
6680 the columns required for the error message are not read, the error
6681 message will contain garbage.
6682
6683 @param old_data Old record
6684 @param new_data New record
6685 @param dup_key_found Number of duplicate keys found
6686
6687 */
6688 virtual int bulk_update_row(const uchar *old_data [[maybe_unused]],
6689 uchar *new_data [[maybe_unused]],
6690 uint *dup_key_found [[maybe_unused]]) {
6691 assert(false);
6692 return HA_ERR_WRONG_COMMAND;
6693 }
6694 /**
6695 Delete all rows in a table.
6696
6697 This is called both for cases of truncate and for cases where the
6698 optimizer realizes that all rows will be removed as a result of an
6699 SQL statement.
6700
6701 If the handler don't support this, then this function will
6702 return HA_ERR_WRONG_COMMAND and MySQL will delete the rows one
6703 by one.
6704 */
6705 virtual int delete_all_rows() {
6707 return HA_ERR_WRONG_COMMAND;
6708 }
6709 /**
6710 Quickly remove all rows from a table.
6711
6712 @param[in,out] table_def dd::Table object for table being truncated.
6713
6714 @remark This method is responsible for implementing MySQL's TRUNCATE
6715 TABLE statement, which is a DDL operation. As such, a engine
6716 can bypass certain integrity checks and in some cases avoid
6717 fine-grained locking (e.g. row locks) which would normally be
6718 required for a DELETE statement.
6719
6720 @remark Typically, truncate is not used if it can result in integrity
6721 violation. For example, truncate is not used when a foreign
6722 key references the table, but it might be used if foreign key
6723 checks are disabled.
6724
6725 @remark Engine is responsible for resetting the auto-increment counter.
6726
6727 @remark The table is locked in exclusive mode. All open TABLE/handler
6728 instances except the one which is used for truncate() call
6729 are closed.
6730
6731 @note It is assumed that transactional storage engines implementing
6732 this method can revert its effects if transaction is rolled
6733 back (e.g. because we failed to write statement to the binary
6734 log).
6735
6736 @note Changes to dd::Table object done by this method will be saved
6737 to data-dictionary only if storage engine supports atomic DDL
6738 (i.e. has HTON_SUPPORTS_ATOMIC_DDL flag set).
6739 */
6740 virtual int truncate(dd::Table *table_def [[maybe_unused]]) {
6741 return HA_ERR_WRONG_COMMAND;
6742 }
6743 virtual int optimize(THD *, HA_CHECK_OPT *) {
6745 }
6746 virtual int analyze(THD *, HA_CHECK_OPT *) {
6748 }
6749
6750 /**
6751 @brief Check and repair the table if necessary.
6752
6753 @param thd Thread object
6754
6755 @retval true Error/Not supported
6756 @retval false Success
6757
6758 @note Called if open_table_from_share fails and is_crashed().
6759 */
6760
6761 virtual bool check_and_repair(THD *thd [[maybe_unused]]) { return true; }
6762
6763 /**
6764 Disable indexes for a while.
6765
6766 @param mode Mode.
6767
6768 @retval 0 Success.
6769 @retval != 0 Error.
6770 */
6771
6772 virtual int disable_indexes(uint mode [[maybe_unused]]) {
6773 return HA_ERR_WRONG_COMMAND;
6774 }
6775
6776 /**
6777 Enable indexes again.
6778
6779 @param mode Mode.
6780
6781 @retval 0 Success.
6782 @retval != 0 Error.
6783 */
6784
6785 virtual int enable_indexes(uint mode [[maybe_unused]]) {
6786 return HA_ERR_WRONG_COMMAND;
6787 }
6788
6789 /**
6790 Discard or import tablespace.
6791
6792 @param [in] discard Indicates whether this is discard operation.
6793 @param [in,out] table_def dd::Table object describing the table
6794 in which tablespace needs to be discarded
6795 or imported. This object can be adjusted by
6796 storage engine if it supports atomic DDL
6797 (i.e. has HTON_SUPPORTS_ATOMIC_DDL flag set).
6798 These changes will be persisted in the
6799 data-dictionary.
6800 @retval 0 Success.
6801 @retval != 0 Error.
6802 */
6803
6804 virtual int discard_or_import_tablespace(bool discard [[maybe_unused]],
6806 [[maybe_unused]]) {
6808 return HA_ERR_WRONG_COMMAND;
6809 }
6810
6811 virtual void drop_table(const char *name);
6812
6813 /**
6814 Create table (implementation).
6815
6816 @param [in] name Table name.
6817 @param [in] form TABLE object describing the table to be
6818 created.
6819 @param [in] info HA_CREATE_INFO describing table.
6820 @param [in,out] table_def dd::Table object describing the table
6821 to be created. This object can be
6822 adjusted by storage engine if it
6823 supports atomic DDL (i.e. has
6824 HTON_SUPPORTS_ATOMIC_DDL flag set).
6825 These changes will be persisted in the
6826 data-dictionary. Can be NULL for
6827 temporary tables created by optimizer.
6828
6829 @retval 0 Success.
6830 @retval non-0 Error.
6831 */
6832 virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info,
6833 dd::Table *table_def) = 0;
6834
6835 virtual bool get_se_private_data(dd::Table *dd_table [[maybe_unused]],
6836 bool reset [[maybe_unused]]) {
6837 return false;
6838 }
6839
6840 /**
6841 Adjust definition of table to be created by adding implicit columns
6842 and indexes necessary for the storage engine.
6843
6844 @param [in] create_info HA_CREATE_INFO describing the table.
6845 @param [in] create_list List of columns in the table.
6846 @param [in] key_info Array of KEY objects describing table
6847 indexes.
6848 @param [in] key_count Number of indexes in the table.
6849 @param [in,out] table_obj dd::Table object describing the table
6850 to be created. Implicit columns and
6851 indexes are to be added to this object.
6852 Adjusted table description will be
6853 saved into the data-dictionary.
6854
6855 @retval 0 Success.
6856 @retval non-0 Error.
6857 */
6859 const HA_CREATE_INFO *create_info [[maybe_unused]],
6860 const List<Create_field> *create_list [[maybe_unused]],
6861 const KEY *key_info [[maybe_unused]], uint key_count [[maybe_unused]],
6862 dd::Table *table_obj [[maybe_unused]]) {
6863 return 0;
6864 }
6865
6866 virtual bool set_ha_share_ref(Handler_share **arg_ha_share) {
6867 ha_share = arg_ha_share;
6868 return false;
6869 }
6870
6871 void set_ha_table(TABLE *table_arg) { table = table_arg; }
6872
6873 int get_lock_type() const { return m_lock_type; }
6874
6875 /**
6876 Callback function that will be called by my_prepare_gcolumn_template
6877 once the table has been opened.
6878 */
6879 typedef void (*my_gcolumn_template_callback_t)(const TABLE *, void *);
6880 static bool my_prepare_gcolumn_template(THD *thd, const char *db_name,
6881 const char *table_name,
6883 void *ib_table);
6884 static bool my_eval_gcolumn_expr_with_open(THD *thd, const char *db_name,
6885 const char *table_name,
6886 const MY_BITMAP *const fields,
6887 uchar *record,
6888 const char **mv_data_ptr,
6889 ulong *mv_length);
6890
6891 /**
6892 Callback for computing generated column values.
6893
6894 Storage engines that need to have virtual column values for a row
6895 can use this function to get the values computed. The storage
6896 engine must have filled in the values for the base columns that
6897 the virtual columns depend on.
6898
6899 @param thd thread handle
6900 @param table table object
6901 @param fields bitmap of field index of evaluated generated
6902 column
6903 @param[in,out] record buff of base columns generated column depends.
6904 After calling this function, it will be
6905 used to return the value of the generated
6906 columns.
6907 @param[out] mv_data_ptr When given (not null) and the field
6908 needs to be calculated is a typed array field, it
6909 will contain pointer to field's calculated value.
6910 @param[out] mv_length Length of the data above
6911
6912 @retval true in case of error
6913 @retval false on success
6914 */
6915 static bool my_eval_gcolumn_expr(THD *thd, TABLE *table,
6916 const MY_BITMAP *const fields, uchar *record,
6917 const char **mv_data_ptr, ulong *mv_length);
6918
6919 /* This must be implemented if the handlerton's partition_flags() is set. */
6920 virtual Partition_handler *get_partition_handler() { return nullptr; }
6921
6922 /**
6923 Set se_private_id and se_private_data during upgrade
6924
6925 @param thd Pointer of THD
6926 @param dbname Database name
6927 @param table_name Table name
6928 @param dd_table dd::Table for the table
6929 @param table_arg TABLE object for the table.
6930
6931 @return Operation status
6932 @retval false Success
6933 @retval true Error
6934 */
6935
6936 bool ha_upgrade_table(THD *thd, const char *dbname, const char *table_name,
6937 dd::Table *dd_table, TABLE *table_arg);
6938
6939 /**
6940 Store a pointer to the handler of the primary table that
6941 corresponds to the secondary table in this handler.
6942 */
6943 void ha_set_primary_handler(handler *primary_handler);
6944
6945 /**
6946 Get a pointer to a handler for the table in the primary storage
6947 engine, if this handler is for a table in a secondary storage
6948 engine.
6949 */
6951
6952 /**
6953 Return max limits for a single set of multi-valued keys
6954
6955 @param[out] num_keys number of keys to store
6956 @param[out] keys_length total length of keys, bytes
6957 */
6958 void ha_mv_key_capacity(uint *num_keys, size_t *keys_length) const {
6959 return mv_key_capacity(num_keys, keys_length);
6960 }
6961
6962 /**
6963 Propagates the secondary storage engine offload failure reason for a query
6964 to the external engine when the offloaded query fails in the secondary
6965 storage engine.
6966 */
6967 virtual void set_external_table_offload_error(const char * /*reason*/) {}
6968
6969 /**
6970 Identifies and throws the propagated external engine query offload or exec
6971 failure reason given by the external engine handler.
6972 */
6973 virtual void external_table_offload_error() const {}
6974
6975 private:
6976 /**
6977 Engine-specific function for ha_can_store_mv_keys().
6978 Dummy function. SE's overloaded method is used instead.
6979 */
6980 /* purecov: begin inspected */
6981 virtual void mv_key_capacity(uint *num_keys, size_t *keys_length) const {
6982 *num_keys = 0;
6983 *keys_length = 0;
6984 }
6985 /* purecov: end */
6986
6987 /**
6988 Filter duplicate records when multi-valued index is used for retrieval
6989
6990 @returns
6991 true duplicate, such row id was already seen
6992 false row id is seen for the first time
6993 */
6994 bool filter_dup_records();
6995
6996 protected:
6998 void set_ha_share_ptr(Handler_share *arg_ha_share);
6999 void lock_shared_ha_data();
7000 void unlock_shared_ha_data();
7001
7002 friend class DsMrr_impl;
7003};
7004
7005/* Temporary Table handle for opening uncached table */
7007 public:
7009
7010 /** Open the table handler
7011 @param[in] thd Thread object
7012 @param[in] db_name Database name
7013 @param[in] table_name Table name
7014 @return table object or nullptr */
7015 TABLE *open(THD *thd, const char *db_name, const char *table_name);
7016
7018
7019 private:
7021};
7022
7023/**
7024 Function identifies any old data type present in table.
7025
7026 This function was handler::check_old_types().
7027 Function is not part of SE API. It is now converted to
7028 auxiliary standalone function.
7029
7030 @param[in] table TABLE object
7031 @param[in] check_temporal_upgrade Check if temporal upgrade is needed
7032
7033 @retval 0 ON SUCCESS
7034 @retval error code ON FAILURE
7035*/
7036
7037int check_table_for_old_types(const TABLE *table, bool check_temporal_upgrade);
7038
7039/*
7040 A Disk-Sweep MRR interface implementation
7041
7042 This implementation makes range (and, in the future, 'ref') scans to read
7043 table rows in disk sweeps.
7044
7045 Currently it is used by MyISAM and InnoDB. Potentially it can be used with
7046 any table handler that has non-clustered indexes and on-disk rows.
7047*/
7048
7050 public:
7051 DsMrr_impl(handler *owner) : h(owner), table(nullptr), h2(nullptr) {}
7052
7054 /*
7055 If ha_reset() has not been called then the h2 dialog might still
7056 exist. This must be closed and deleted (this is the case for
7057 internally created temporary tables).
7058 */
7059 if (h2) reset();
7060 assert(h2 == nullptr);
7061 }
7062
7063 private:
7064 /*
7065 The "owner" handler object (the one that calls dsmrr_XXX functions.
7066 It is used to retrieve full table rows by calling rnd_pos().
7067 */
7068 handler *const h;
7069 TABLE *table; /* Always equal to h->table */
7070
7071 /* Secondary handler object. It is used for scanning the index */
7073
7074 /* Buffer to store rowids, or (rowid, range_id) pairs */
7076 uchar *rowids_buf_cur; /* Current position when reading/writing */
7077 uchar *rowids_buf_last; /* When reading: end of used buffer space */
7078 uchar *rowids_buf_end; /* End of the buffer */
7079
7080 bool dsmrr_eof; /* true <=> We have reached EOF when reading index tuples */
7081
7082 /* true <=> need range association, buffer holds {rowid, range_id} pairs */
7084
7085 bool use_default_impl; /* true <=> shortcut all calls to default MRR impl */
7086 public:
7087 /**
7088 Initialize the DsMrr_impl object.
7089
7090 This object is used for both doing default MRR scans and DS-MRR scans.
7091 This function just initializes the object. To do a DS-MRR scan,
7092 this must also be initialized by calling dsmrr_init().
7093
7094 @param table_arg pointer to the TABLE that owns the handler
7095 */
7096
7097 void init(TABLE *table_arg) {
7098 assert(table_arg != nullptr);
7099 table = table_arg;
7100 }
7101
7102 int dsmrr_init(RANGE_SEQ_IF *seq_funcs, void *seq_init_param, uint n_ranges,
7104 void dsmrr_close();
7105
7106 /**
7107 Resets the DS-MRR object to the state it had after being initialized.
7108
7109 If there is an open scan then it will be closed.
7110
7111 This function should be called by handler::ha_reset() which is called
7112 when a statement is completed in order to make the handler object ready
7113 for re-use by a different statement.
7114 */
7115
7116 void reset();
7117 int dsmrr_fill_buffer();
7118 int dsmrr_next(char **range_info);
7119
7120 ha_rows dsmrr_info(uint keyno, uint n_ranges, uint keys, uint *bufsz,
7121 uint *flags, Cost_estimate *cost);
7122
7123 ha_rows dsmrr_info_const(uint keyno, RANGE_SEQ_IF *seq, void *seq_init_param,
7124 uint n_ranges, uint *bufsz, uint *flags,
7125 Cost_estimate *cost);
7126
7127 private:
7128 bool choose_mrr_impl(uint keyno, ha_rows rows, uint *flags, uint *bufsz,
7129 Cost_estimate *cost);
7130 bool get_disk_sweep_mrr_cost(uint keynr, ha_rows rows, uint flags,
7132};
7133
7134/* lookups */
7137/**
7138 Resolve handlerton plugin by name, without checking for "DEFAULT" or
7139 HTON_NOT_USER_SELECTABLE.
7140
7141 @param thd Thread context.
7142 @param name Plugin name.
7143
7144 @return plugin or NULL if not found.
7145*/
7148 bool is_temp_table);
7149plugin_ref ha_lock_engine(THD *thd, const handlerton *hton);
7151handler *get_new_handler(TABLE_SHARE *share, bool partitioned, MEM_ROOT *alloc,
7152 handlerton *db_type);
7153handlerton *ha_checktype(THD *thd, enum legacy_db_type database_type,
7154 bool no_substitute, bool report_error);
7155
7157 THD *thd, const LEX_CSTRING &secondary_engine) noexcept;
7158
7159/**
7160 Get default handlerton, if handler supplied is null.
7161
7162 @param thd Thread context.
7163 @param hton The handlerton passed.
7164
7165 @returns pointer to handlerton.
7166*/
7168 if (!hton) {
7169 hton = ha_checktype(thd, DB_TYPE_UNKNOWN, false, false);
7170 assert(hton);
7171 }
7172 return hton;
7173}
7174
7175static inline enum legacy_db_type ha_legacy_type(const handlerton *db_type) {
7176 return (db_type == nullptr) ? DB_TYPE_UNKNOWN : db_type->db_type;
7177}
7178
7179const char *ha_resolve_storage_engine_name(const handlerton *db_type);
7180
7181static inline bool ha_check_storage_engine_flag(const handlerton *db_type,
7182 uint32 flag) {
7183 return db_type == nullptr ? false : (db_type->flags & flag);
7184}
7185
7186/**
7187 Predicate to determine if a storage engine, represented by a handlerton*, is
7188 enabled.
7189 @note "Enabled" in this context refers only the state of the handlerton
7190 object, and does not consider the disabled_storage_engines system variable.
7191 This leads to the very counter-intuitive and confusing situation that it is
7192 possible for a storage engine to be enabled, but at the same time also be
7193 disabled.
7194 */
7195inline bool ha_storage_engine_is_enabled(const handlerton *db_type) {
7196 return (db_type && db_type->create) ? (db_type->state == SHOW_OPTION_YES)
7197 : false;
7198}
7199
7200/* basic stuff */
7201int ha_init_errors(void);
7202int ha_init(void);
7203void ha_end();
7206
7209void ha_close_connection(THD *thd);
7210void ha_kill_connection(THD *thd);
7211/** Invoke handlerton::pre_dd_shutdown() on every storage engine plugin. */
7212void ha_pre_dd_shutdown(void);
7213
7214/**
7215 Flush the log(s) of storage engine(s).
7216
7217 @param binlog_group_flush true if we got invoked by binlog group
7218 commit during flush stage, false in other cases.
7219 @retval false Succeed
7220 @retval true Error
7221*/
7222bool ha_flush_logs(bool binlog_group_flush = false);
7223void ha_drop_database(char *path);
7224int ha_create_table(THD *thd, const char *path, const char *db,
7225 const char *table_name, HA_CREATE_INFO *create_info,
7226 bool update_create_info, bool is_temp_table,
7228
7229int ha_delete_table(THD *thd, handlerton *db_type, const char *path,
7230 const char *db, const char *alias,
7231 const dd::Table *table_def, bool generate_warning);
7232bool ha_check_reserved_db_name(const char *name);
7233
7234/* statistics and info */
7235bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat);
7236
7237typedef bool Log_func(THD *, TABLE *, bool, const uchar *, const uchar *);
7238
7239int binlog_log_row(TABLE *table, const uchar *before_record,
7240 const uchar *after_record, Log_func *log_func);
7241
7242/* discovery */
7243int ha_create_table_from_engine(THD *thd, const char *db, const char *name);
7244bool ha_check_if_table_exists(THD *thd, const char *db, const char *name,
7245 bool *exists);
7246int ha_find_files(THD *thd, const char *db, const char *path, const char *wild,
7247 bool dir, List<LEX_STRING> *files);
7248int ha_table_exists_in_engine(THD *thd, const char *db, const char *name);
7249bool ha_check_if_supported_system_table(handlerton *hton, const char *db,
7250 const char *table_name);
7251bool ha_rm_tmp_tables(THD *thd, List<LEX_STRING> *files);
7252bool default_rm_tmp_tables(handlerton *hton, THD *thd, List<LEX_STRING> *files);
7253
7254/* key cache */
7255int ha_init_key_cache(std::string_view name, KEY_CACHE *key_cache);
7256int ha_resize_key_cache(KEY_CACHE *key_cache);
7257int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache);
7258
7259/* transactions: interface to handlerton functions */
7261int ha_commit_trans(THD *thd, bool all, bool ignore_global_read_lock = false);
7262int ha_commit_attachable(THD *thd);
7263int ha_rollback_trans(THD *thd, bool all);
7264
7265/**
7266 Stage of the recovery process where information is collected from the
7267 storage engines (SE), merged with information from the transaction
7268 coordinator (TC) and transactions states are determined and enforced.
7269
7270 Implemented heuristics is as follows:
7271
7272 1. The `commit_list` parameter contains the set of internally coordinated
7273 transactions that the TC ensures were marked as committed.
7274
7275 2. The `xa_state_list` parameter contains the list of externally
7276 coordinated transactions and their states, as recorded by the TC.
7277
7278 3. For each SE:
7279 a. Collect list of transactions found in `PREPARED_IN_TC` state in the
7280 SE and merge it with the information collected from the TC, in
7281 `xa_state_list`.
7282 b. Retrieve the list of transactions found in prepared state in the
7283 SE.
7284
7285 c. For each internally coordinated transactions found in prepared
7286 state:
7287 1. If the transaction is found in `commit_list`, commit it.
7288 2. If the transaction is NOT found in `commit_list` but
7289 `tc_heuristic_recover = TC_HEURISTIC_RECOVER_COMMIT`, commit it.
7290 3. Otherwise, roll it back.
7291
7292 d. For each externally coordinated transactions found in prepared
7293 state:
7294 1. If the transaction isn't found in `xa_state_list`, roll it back.
7295 2. If the transaction is found in `xa_state_list` in `COMMITTED`
7296 state, commit it.
7297 3. If the transaction is found in `xa_state_list` in `ROLLEDBACK`
7298 state, roll it back.
7299 4. If the transaction is found in `xa_state_list` in `PREPARED`
7300 state, ensure that the transaction state in the SE is
7301 `PREPARED_IN_TC`.
7302
7303 @param commit_list Set of XIDs of internally coordinated transactions
7304 found as been committed in the transaction coordinator
7305 state.
7306 @param xa_state_list Map between XIDs and states of externally
7307 coordinated transactions as found in the internal
7308 transaction coordinator state.
7309
7310 @return 0 if recovery was successful, non-zero otherwise.
7311*/
7312int ha_recover(Xid_commit_list *commit_list = nullptr,
7313 Xa_state_list *xa_state_list = nullptr);
7314
7315/**
7316 Perform SE-specific cleanup after recovery of transactions.
7317
7318 @note SE supporting atomic DDL can use this method to perform
7319 post-DDL actions for DDL statements which were committed
7320 or rolled back during recovery stage.
7321*/
7322void ha_post_recover();
7323
7324/*
7325 transactions: interface to low-level handlerton functions. These are
7326 intended to be used by the transaction coordinators to
7327 commit/prepare/rollback transactions in the engines.
7328*/
7329int ha_commit_low(THD *thd, bool all, bool run_after_commit = true);
7330/**
7331 Prepares the underlying transaction of the THD session object parameter
7332 in the storage engines that participate in the transaction.
7333
7334 In case of failure, an error will be emitted by the function in the case
7335 of internally coordinated transactions. In the case of externally
7336 coordinated transactions (XA), the error treatment must follow the
7337 XA/Open specification and is handled by the `Sql_cmd_xa_prepare` class.
7338
7339 @param thd The THD session object holding the transaction to be prepared.
7340 @param all Whether or not the prepare regards a full transaction or the
7341 statement being executed..
7342
7343 @return 0 if the transaction was successfully prepared, non-zero
7344 otherwise.
7345 */
7346int ha_prepare_low(THD *thd, bool all);
7347int ha_rollback_low(THD *thd, bool all);
7348
7349/* transactions: these functions never call handlerton functions directly */
7350int ha_enable_transaction(THD *thd, bool on);
7351
7352/* savepoints */
7355int ha_savepoint(THD *thd, SAVEPOINT *sv);
7356int ha_release_savepoint(THD *thd, SAVEPOINT *sv);
7357
7358/* these are called by storage engines */
7359void trans_register_ha(THD *thd, bool all, handlerton *ht,
7360 const ulonglong *trxid);
7361
7362int ha_reset_logs(THD *thd);
7363int ha_binlog_index_purge_file(THD *thd, const char *file);
7364void ha_reset_slave(THD *thd);
7365void ha_binlog_log_query(THD *thd, handlerton *db_type,
7366 enum_binlog_command binlog_command, const char *query,
7367 size_t query_length, const char *db,
7368 const char *table_name);
7369void ha_acl_notify(THD *thd, class Acl_change_notification *);
7370void ha_binlog_wait(THD *thd);
7371
7372/* It is required by basic binlog features on both MySQL server and libmysqld */
7373int ha_binlog_end(THD *thd);
7374
7375const char *get_canonical_filename(handler *file, const char *path,
7376 char *tmp_path);
7377
7378const char *table_case_name(const HA_CREATE_INFO *info, const char *name);
7379
7380void print_keydup_error(TABLE *table, KEY *key, const char *msg, myf errflag,
7381 const char *org_table_name);
7382void print_keydup_error(TABLE *table, KEY *key, myf errflag,
7383 const char *org_table_name);
7384
7385inline void print_keydup_error(TABLE *table, KEY *key, const char *msg,
7386 myf errflag) {
7387 print_keydup_error(table, key, msg, errflag, nullptr);
7388}
7389inline void print_keydup_error(TABLE *table, KEY *key, myf errflag) {
7390 print_keydup_error(table, key, errflag, nullptr);
7391}
7392
7394
7395bool ha_notify_exclusive_mdl(THD *thd, const MDL_key *mdl_key,
7396 ha_notification_type notification_type,
7397 bool *victimized);
7398bool ha_notify_table_ddl(THD *thd, const MDL_key *mdl_key,
7399 ha_notification_type notification_type,
7400 ha_ddl_type ddl_type, const char *old_db_name,
7401 const char *old_table_name, const char *new_db_name,
7402 const char *new_table_name);
7403
7404std::pair<int, bool> commit_owned_gtids(THD *thd, bool all);
7405bool set_tx_isolation(THD *thd, enum_tx_isolation tx_isolation, bool one_shot);
7407
7408/*
7409 This class is used by INFORMATION_SCHEMA.FILES to read SE specific
7410 tablespace dynamic metadata. Some member like m_type and id, is not
7411 really dynamic, but as this information is not stored in data dictionary
7412 in a generic format and still is SE specific Some member like m_type and
7413 id, is not really dynamic, but as this information is not stored in data
7414 dictionary in a generic format and still needs SE specific decision, we
7415 are requesting the same from SE.
7416*/
7417
7419 public:
7421 : m_id(0),
7423 m_free_extents(0),
7424 m_total_extents(0),
7425 m_extent_size(0),
7426 m_initial_size(0),
7427 m_maximum_size(0),
7429 m_version(~0ULL),
7430 m_data_free(0) {}
7431
7447};
7448
7449#endif /* HANDLER_INCLUDED */
app_data_ptr new_data(u_int n, char *val, cons_type consensus)
Definition: acl_change_notification.h:32
const std::string db
Definition: acl_change_notification.h:51
Data describing the table being created by CREATE TABLE or altered by ALTER TABLE.
Definition: sql_alter.h:204
Class describing changes to be done by ALTER TABLE.
Definition: handler.h:3195
static const HA_ALTER_FLAGS COALESCE_PARTITION
Definition: handler.h:3312
Alter_info * alter_info
Alter options, fields and keys for the new version of table.
Definition: handler.h:3412
static const HA_ALTER_FLAGS CHANGE_INDEX_OPTION
Change index option in a way which is likely not to require index recreation.
Definition: handler.h:3354
uint key_count
Size of key_info_buffer array.
Definition: handler.h:3448
static const HA_ALTER_FLAGS ALTER_VIRTUAL_COLUMN_TYPE
Definition: handler.h:3254
static const HA_ALTER_FLAGS DROP_PARTITION
Definition: handler.h:3306
static const HA_ALTER_FLAGS ADD_VIRTUAL_COLUMN
Definition: handler.h:3235
const char * unsupported_reason
Can be set by handler to describe why a given operation cannot be done in-place (HA_ALTER_INPLACE_NOT...
Definition: handler.h:3548
KEY * key_info_buffer
Array of KEYs for new version of table - including KEYs to be added.
Definition: handler.h:3445
static const HA_ALTER_FLAGS ADD_FOREIGN_KEY
Definition: handler.h:3285
static const HA_ALTER_FLAGS DROP_COLUMN
Definition: handler.h:3247
static const HA_ALTER_FLAGS ALTER_COLUMN_INDEX_LENGTH
Change in index length such that it does not require index rebuild.
Definition: handler.h:3364
static const HA_ALTER_FLAGS ADD_STORED_GENERATED_COLUMN
Definition: handler.h:3239
static const HA_ALTER_FLAGS ALTER_TABLE_REORG
Definition: handler.h:3318
static const HA_ALTER_FLAGS VALIDATE_VIRTUAL_COLUMN
Definition: handler.h:3347
static const HA_ALTER_FLAGS ADD_SPATIAL_INDEX
Definition: handler.h:3341
static const HA_ALTER_FLAGS DROP_CHECK_CONSTRAINT
Definition: handler.h:3382
static const HA_ALTER_FLAGS ALTER_STORED_GCOL_EXPR
Definition: handler.h:3282
uint virtual_column_add_count
Number of virtual columns to be added.
Definition: handler.h:3486
static const HA_ALTER_FLAGS RECREATE_TABLE
Recreate the table for ALTER TABLE FORCE, ALTER TABLE ENGINE and OPTIMIZE TABLE operations.
Definition: handler.h:3338
static const HA_ALTER_FLAGS STORED_GCOL_REEVAL
Change to one of columns on which stored generated column depends, so its values require re-evaluatio...
Definition: handler.h:3376
static const HA_ALTER_FLAGS ADD_PARTITION
Definition: handler.h:3303
static const HA_ALTER_FLAGS ADD_STORED_BASE_COLUMN
Definition: handler.h:3237
static const HA_ALTER_FLAGS ADD_PK_INDEX
Definition: handler.h:3227
uint index_drop_count
Size of index_drop_buffer array.
Definition: handler.h:3451
ulonglong HA_ALTER_FLAGS
Bits to show in detail what operations the storage engine is to execute.
Definition: handler.h:3212
static const HA_ALTER_FLAGS ALTER_COLUMN_STORAGE_TYPE
Definition: handler.h:3297
static const HA_ALTER_FLAGS ALTER_COLUMN_NAME
Definition: handler.h:3251
static const HA_ALTER_FLAGS ALTER_COLUMN_COLUMN_FORMAT
Definition: handler.h:3300
static const HA_ALTER_FLAGS ADD_COLUMN
Definition: handler.h:3241
static const HA_ALTER_FLAGS ALTER_REBUILD_PARTITION
Definition: handler.h:3357
static const HA_ALTER_FLAGS ALTER_INDEX_COMMENT
Definition: handler.h:3344
KEY_PAIR * index_rename_buffer
Array of KEY_PAIR objects describing indexes being renamed.
Definition: handler.h:3482
uint index_altered_visibility_count
Size of index_rename_buffer array.
Definition: handler.h:3472
void report_unsupported_error(const char *not_supported, const char *try_instead)
Used after check_if_supported_inplace_alter() to report error if the result does not match the LOCK/A...
Definition: handler.cc:4991
bool error_if_not_empty
Indicates whether operation should fail if table is non-empty.
Definition: handler.h:3428
static const HA_ALTER_FLAGS ADD_CHECK_CONSTRAINT
Definition: handler.h:3379
static const HA_ALTER_FLAGS ALTER_RENAME
Definition: handler.h:3294
void add_renamed_key(KEY *old_key, KEY *new_key)
Add old and new version of key to array of indexes to be renamed.
Definition: handler.h:3591
static const HA_ALTER_FLAGS SUSPEND_CHECK_CONSTRAINT
Definition: handler.h:3385
static const HA_ALTER_FLAGS ALTER_REMOVE_PARTITIONING
Definition: handler.h:3321
static const HA_ALTER_FLAGS ALTER_COLUMN_EQUAL_PACK_LENGTH
Change column datatype in such way that new type has compatible packed representation with old type,...
Definition: handler.h:3263
uint index_add_count
Size of index_add_buffer array.
Definition: handler.h:3460
static const HA_ALTER_FLAGS REORGANIZE_PARTITION
Definition: handler.h:3315
inplace_alter_handler_ctx * handler_ctx
Context information to allow handlers to keep context between in-place alter API calls.
Definition: handler.h:3497
static const HA_ALTER_FLAGS ALTER_VIRTUAL_GCOL_EXPR
Definition: handler.h:3281
static const HA_ALTER_FLAGS ADD_INDEX
Definition: handler.h:3215
static const HA_ALTER_FLAGS DROP_FOREIGN_KEY
Definition: handler.h:3288
uint index_rename_count
Size of index_rename_buffer array.
Definition: handler.h:3469
static const HA_ALTER_FLAGS ADD_UNIQUE_INDEX
Definition: handler.h:3221
HA_CREATE_INFO * create_info
Create options (like MAX_ROWS) for the new version of table.
Definition: handler.h:3399
uint handler_trivial_ctx
Can be set by handler along with handler_ctx.
Definition: handler.h:3534
KEY_PAIR * index_altered_visibility_buffer
Definition: handler.h:3483
static const HA_ALTER_FLAGS DROP_INDEX
Definition: handler.h:3218
static const HA_ALTER_FLAGS ALTER_COLUMN_NOT_NULLABLE
Definition: handler.h:3275
static const HA_ALTER_FLAGS DROP_UNIQUE_INDEX
Definition: handler.h:3224
static const HA_ALTER_FLAGS ALTER_PARTITION
Definition: handler.h:3309
static const HA_ALTER_FLAGS ALTER_COLUMN_NULLABLE
Definition: handler.h:3272
partition_info * modified_part_info
Partition_info taking into account the partition changes to be performed.
Definition: handler.h:3523
HA_ALTER_FLAGS handler_flags
Flags describing in detail which operations the storage engine is to execute.
Definition: handler.h:3515
Alter_inplace_info(HA_CREATE_INFO *create_info_arg, Alter_info *alter_info_arg, bool error_if_not_empty_arg, KEY *key_info_arg, uint key_count_arg, partition_info *modified_part_info_arg)
Definition: handler.h:3550
~Alter_inplace_info()
Definition: handler.h:3576
static const HA_ALTER_FLAGS VIRTUAL_GCOL_REEVAL
Change to one of columns on which virtual generated column depends, so its values require re-evaluati...
Definition: handler.h:3370
void add_added_key(KEY *new_key)
Add key to array of indexes to be added.
Definition: handler.h:3625
void add_altered_index_visibility(KEY *old_key, KEY *new_key)
Definition: handler.h:3599
static const HA_ALTER_FLAGS ALTER_VIRTUAL_COLUMN_ORDER
A virtual column has changed its position.
Definition: handler.h:3266
static const HA_ALTER_FLAGS RENAME_INDEX
Rename index.
Definition: handler.h:3332
uint virtual_column_drop_count
number of virtual columns to be dropped.
Definition: handler.h:3489
void add_modified_key(KEY *old_key, KEY *new_key)
Add old and new version of modified key to arrays of indexes to be dropped and added (correspondingly...
Definition: handler.h:3612
static const HA_ALTER_FLAGS DROP_PK_INDEX
Definition: handler.h:3230
static const HA_ALTER_FLAGS ALTER_STORED_COLUMN_ORDER
A stored column has changed its position (disregarding virtual columns)
Definition: handler.h:3269
bool online
true for online operation (LOCK=NONE)
Definition: handler.h:3526
KEY ** index_drop_buffer
Array of pointers to KEYs to be dropped belonging to the TABLE instance for the old version of the ta...
Definition: handler.h:3457
uint * index_add_buffer
Array of indexes into key_info_buffer for KEYs to be added, sorted in increasing order.
Definition: handler.h:3466
void add_dropped_key(KEY *old_key)
Drop key to array of indexes to be dropped.
Definition: handler.h:3619
static const HA_ALTER_FLAGS CHANGE_CREATE_OPTION
Definition: handler.h:3291
static const HA_ALTER_FLAGS DROP_VIRTUAL_COLUMN
Definition: handler.h:3245
static const HA_ALTER_FLAGS ALTER_COLUMN_VISIBILITY
Definition: handler.h:3388
static const HA_ALTER_FLAGS ALTER_STORED_COLUMN_TYPE
Definition: handler.h:3255
inplace_alter_handler_ctx ** group_commit_ctx
If the table uses several handlers, like ha_partition uses one handler per partition,...
Definition: handler.h:3509
static const HA_ALTER_FLAGS ALTER_COLUMN_DEFAULT
Definition: handler.h:3278
static const HA_ALTER_FLAGS DROP_STORED_COLUMN
Definition: handler.h:3246
static const HA_ALTER_FLAGS ALTER_ALL_PARTITION
Definition: handler.h:3324
Used to store optimizer cost estimates.
Definition: handler.h:3705
Cost_estimate & operator+=(const Cost_estimate &other)
Definition: handler.h:3754
Cost_estimate operator-(const Cost_estimate &other)
Definition: handler.h:3772
void add_import(double add_import_cost)
Add to import cost.
Definition: handler.h:3805
void reset()
Reset all costs to zero.
Definition: handler.h:3737
void set_max_cost()
Set current cost to the maximal double.
Definition: handler.h:3739
Cost_estimate()
Definition: handler.h:3713
void add_cpu(double add_cpu_cost)
Add to CPU cost.
Definition: handler.h:3799
double mem_cost
memory used (bytes)
Definition: handler.h:3710
double io_cost
cost of I/O operations
Definition: handler.h:3707
bool is_max_cost() const
Whether or not the total cost is the maximal double.
Definition: handler.h:3735
void add_mem(double add_mem_cost)
Add to memory cost.
Definition: handler.h:3811
bool operator<(const Cost_estimate &other) const
Definition: handler.h:3788
double get_cpu_cost() const
Definition: handler.h:3718
double get_mem_cost() const
Definition: handler.h:3720
double total_cost() const
Returns sum of time-consuming costs, i.e., not counting memory cost.
Definition: handler.h:3716
double get_io_cost() const
Definition: handler.h:3717
void add_io(double add_io_cost)
Add to IO cost.
Definition: handler.h:3793
double import_cost
cost of remote operations
Definition: handler.h:3709
double cpu_cost
cost of CPU operations
Definition: handler.h:3708
double get_import_cost() const
Definition: handler.h:3719
void multiply(double m)
Multiply io, cpu and import costs by parameter.
Definition: handler.h:3745
bool is_zero() const
Whether or not all costs in the object are zero.
Definition: handler.h:3727
bool operator>(const Cost_estimate &other) const
Definition: handler.h:3784
Cost_estimate operator+(const Cost_estimate &other)
Definition: handler.h:3765
Create_field is a description a field/column that may or may not exists in a table.
Definition: create_field.h:51
Definition: discrete_interval.h:41
Definition: handler.h:7049
DsMrr_impl(handler *owner)
Definition: handler.h:7051
bool get_disk_sweep_mrr_cost(uint keynr, ha_rows rows, uint flags, uint *buffer_size, Cost_estimate *cost)
Get cost of DS-MRR scan.
Definition: handler.cc:7034
void reset()
Resets the DS-MRR object to the state it had after being initialized.
Definition: handler.cc:6709
ha_rows dsmrr_info(uint keyno, uint n_ranges, uint keys, uint *bufsz, uint *flags, Cost_estimate *cost)
Definition: handler.cc:6851
ha_rows dsmrr_info_const(uint keyno, RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint *bufsz, uint *flags, Cost_estimate *cost)
Definition: handler.cc:6880
void dsmrr_close()
Definition: handler.cc:6698
uchar * rowids_buf_end
Definition: handler.h:7078
uchar * rowids_buf_cur
Definition: handler.h:7076
int dsmrr_fill_buffer()
DS-MRR: Fill the buffer with rowids and sort it by rowid.
Definition: handler.cc:6738
uchar * rowids_buf
Definition: handler.h:7075
handler * h2
Definition: handler.h:7072
handler *const h
Definition: handler.h:7068
~DsMrr_impl()
Definition: handler.h:7053
bool use_default_impl
Definition: handler.h:7085
void init(TABLE *table_arg)
Initialize the DsMrr_impl object.
Definition: handler.h:7097
int dsmrr_init(RANGE_SEQ_IF *seq_funcs, void *seq_init_param, uint n_ranges, uint mode, HANDLER_BUFFER *buf)
DS-MRR: Initialize and start MRR scan.
Definition: handler.cc:6521
bool choose_mrr_impl(uint keyno, ha_rows rows, uint *flags, uint *bufsz, Cost_estimate *cost)
DS-MRR Internals: Choose between Default MRR implementation and DS-MRR.
Definition: handler.cc:6937
bool dsmrr_eof
Definition: handler.h:7080
bool is_mrr_assoc
Definition: handler.h:7083
uchar * rowids_buf_last
Definition: handler.h:7077
TABLE * table
Definition: handler.h:7069
int dsmrr_next(char **range_info)
Definition: handler.cc:6805
Definition: field.h:575
Wrapper for struct ft_hints.
Definition: handler.h:3965
uint get_flags() const
Get Ft_hints flags.
Definition: handler.h:4028
void set_hint_flag(uint ft_flag)
Set Ft_hints flag.
Definition: handler.h:3993
double get_op_value() const
Get Ft_hints operation value.
Definition: handler.h:4014
struct ft_hints * get_hints()
Get ft_hints struct.
Definition: handler.h:4035
Ft_hints(uint ft_flags)
Definition: handler.h:3970
ha_rows get_limit() const
Get Ft_hints limit.
Definition: handler.h:4007
enum ft_operation get_op_type() const
Get Ft_hints operation type.
Definition: handler.h:4021
void set_hint_limit(ha_rows ft_limit)
Set Ft_hints limit.
Definition: handler.h:4000
void set_hint_op(enum ft_operation type, double value)
Set comparison operation type and and value for master MATCH function.
Definition: handler.h:3983
struct ft_hints hints
Definition: handler.h:3967
Definition: handler.h:1011
const char * get_source_name()
Get SE source file name.
Definition: handler.h:1102
void set_dest_name(const char *name)
Set SE destination file name.
Definition: handler.h:1114
virtual int file_cbk(Ha_clone_file from_file, uint len)=0
Callback providing data from current position of a file descriptor of specific length.
uint m_desc_len
SE's Serialized descriptor length.
Definition: handler.h:1176
void set_hton(handlerton *hton)
Set current storage engine handlerton.
Definition: handler.h:1056
handlerton * get_hton()
Get current storage engine handlerton.
Definition: handler.h:1060
virtual int buffer_cbk(uchar *from_buffer, uint len)=0
Callback providing data in buffer of specific length.
Ha_clone_cbk()
Constructor to initialize members.
Definition: handler.h:1014
const int HA_CLONE_FILE_CACHE
Data file is opened for read/write with OS buffer cache.
Definition: handler.h:1194
void mark_state_change(uint64_t estimate)
Set state information and notify state change.
Definition: handler.h:1151
bool is_os_buffer_cache() const
Check if the file descriptor is opened for read/write with OS buffer cache.
Definition: handler.h:1135
void set_os_buffer_cache()
Mark that the file descriptor is opened for read/write with OS buffer cache.
Definition: handler.h:1129
const int HA_CLONE_STATE_CHANGE
State change notification by SE.
Definition: handler.h:1203
const char * m_dest_name
Current destination file name.
Definition: handler.h:1182
int m_flag
Flag storing data related options.
Definition: handler.h:1188
void set_source_name(const char *name)
Set SE source file name.
Definition: handler.h:1106
bool is_zero_copy() const
Check if zero copy optimization is suggested.
Definition: handler.h:1141
const char * m_src_name
Current source file name.
Definition: handler.h:1179
bool is_state_change(uint64_t &estimate)
Check if SE notified state change.
Definition: handler.h:1157
uint m_loc_idx
SE index in caller's locator array.
Definition: handler.h:1167
const uchar * get_data_desc(uint *lenp)
Get data descriptor.
Definition: handler.h:1092
uint64_t m_state_estimate
Estimated bytes to be transferred.
Definition: handler.h:1185
const uchar * m_data_desc
SE's Serialized data descriptor.
Definition: handler.h:1173
const char * get_dest_name()
Get SE destination file name.
Definition: handler.h:1110
bool is_secure() const
Check if data needs secure transfer.
Definition: handler.h:1147
void set_zero_copy()
Mark that the file can be transferred with zero copy.
Definition: handler.h:1138
virtual ~Ha_clone_cbk()=default
virtual destructor.
const int HA_CLONE_SECURE
Data needs to be transferred securely over SSL connection.
Definition: handler.h:1200
virtual int apply_buffer_cbk(uchar *&to_buffer, uint &len)=0
Callback to get data in buffer.
uint m_client_buff_size
Caller's transfer buffer size.
Definition: handler.h:1170
virtual int apply_file_cbk(Ha_clone_file to_file)=0
Callback providing a file descriptor to write data starting from current position.
void set_ack()
Mark that ACK is needed for the data transfer before returning from callback.
Definition: handler.h:1121
bool is_ack_needed() const
Check if ACK is needed for the data transfer.
Definition: handler.h:1125
void set_client_buffer_size(uint size)
Set caller's transfer buffer size.
Definition: handler.h:1065
void set_secure()
Mark that data needs secure transfer.
Definition: handler.h:1144
const int HA_CLONE_ACK
Acknowledgement is needed for the data transfer.
Definition: handler.h:1191
void set_loc_index(uint idx)
Set current SE index.
Definition: handler.h:1073
void clear_flags()
Clear all flags set by SE.
Definition: handler.h:1117
handlerton * m_hton
Handlerton for the SE.
Definition: handler.h:1164
uint get_client_buffer_size()
Get caller's transfer buffer size.
Definition: handler.h:1069
uint get_loc_index()
Get current SE index.
Definition: handler.h:1077
const int HA_CLONE_ZERO_COPY
Data file can be transferred with zero copy.
Definition: handler.h:1197
void set_data_desc(const uchar *desc, uint len)
Set data descriptor.
Definition: handler.h:1083
Base class to be used by handlers different shares.
Definition: handler.h:3955
Handler_share()=default
virtual ~Handler_share()=default
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:851
Definition: sql_optimizer.h:133
JSON DOM abstract base class.
Definition: json_dom.h:173
Definition: key.h:57
Definition: key.h:113
const char * name
Name of key.
Definition: key.h:153
bool is_visible
True if this index is visible to the query optimizer.
Definition: key.h:201
Definition: sql_list.h:434
Mem_root_allocator is a C++ STL memory allocator based on MEM_ROOT.
Definition: mem_root_allocator.h:68
Class for partitioning specific operations.
Definition: partition_handler.h:194
Class to hold information regarding a table to be created on behalf of a plugin.
Definition: plugin_table.h:40
Class to hold information regarding a predefined tablespace created by a storage engine.
Definition: plugin_table.h:129
This class represents a buffer that can be used for multi-row reads.
Definition: record_buffer.h:47
Cost constants for a storage engine.
Definition: opt_costconstants.h:197
Simple intrusive linked list.
Definition: sql_list.h:46
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:168
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:34
Definition: table.h:2790
Data structure that contains the information about shared tablespaces.
Definition: fsp0space.h:47
Definition: handler.h:7006
Temp_table_handle()
Definition: handler.h:7008
~Temp_table_handle()
Definition: handler.cc:8512
TABLE * open(THD *thd, const char *db_name, const char *table_name)
Open the table handler.
Definition: handler.cc:8483
TABLE * table
Definition: handler.h:7020
Unique_on_insert – similar to above, but rejects duplicates on insert, not just on read of the final ...
Definition: uniques.h:123
Class to maintain list of externally coordinated transactions and their current state at recovery.
Definition: handler.h:1251
enum_ha_recover_xa_state add(XID const &xid, enum_ha_recover_xa_state state)
Adds a transaction and state to the underlying map.
Definition: handler.cc:8837
std::map< XID, enum_ha_recover_xa_state, std::less< XID >, Xa_state_list::allocator >::iterator iterator
Definition: handler.h:1258
enum_ha_recover_xa_state find(XID const &to_find)
Searches the underlying map to find an key that corresponds to the parameter.
Definition: handler.cc:8831
static Xa_state_list::instantiation_tuple new_instance()
Factory like method to instantiate all the infra-structure needed to create an Xa_state_list.
Definition: handler.cc:8869
Xa_state_list(Xa_state_list::list &populated_by_tc)
Class constructor.
Definition: handler.cc:8828
std::pair< const XID, enum_ha_recover_xa_state > pair
Definition: handler.h:1253
Xa_state_list::list & m_underlying
The underlying map holding the trx and states.
Definition: handler.h:1330
std::map< XID, enum_ha_recover_xa_state, std::less< XID >, Xa_state_list::allocator > list
Definition: handler.h:1256
std::tuple< std::unique_ptr< MEM_ROOT >, std::unique_ptr< Xa_state_list::allocator >, std::unique_ptr< Xa_state_list::list >, std::unique_ptr< Xa_state_list > > instantiation_tuple
Definition: handler.h:1261
virtual ~Xa_state_list()=default
The Properties class defines an interface for storing key=value pairs, where both key and value may b...
Definition: properties.h:74
Definition: table.h:47
Definition: tablespace.h:55
Definition: handler.h:3876
ulonglong index_file_length
Definition: handler.h:3880
uint block_size
Definition: handler.h:3899
ulonglong data_file_length
Definition: handler.h:3878
ulong update_time
Definition: handler.h:3898
ha_rows records
Definition: handler.h:3892
ulonglong max_data_file_length
Definition: handler.h:3879
ulong check_time
Definition: handler.h:3897
time_t create_time
Definition: handler.h:3896
ulonglong max_index_file_length
Definition: handler.h:3881
ulong mean_rec_length
Definition: handler.h:3894
ulonglong auto_increment_value
Definition: handler.h:3883
ha_statistics()
Definition: handler.h:3914
double table_in_mem_estimate
Estimate for how much of the table that is available in a memory buffer.
Definition: handler.h:3912
ulonglong delete_length
Definition: handler.h:3882
uint mrr_length_per_rec
Definition: handler.h:3904
ha_rows deleted
Definition: handler.h:3893
Definition: handler.h:7418
ulonglong m_id
Definition: handler.h:7432
ulonglong m_initial_size
Definition: handler.h:7439
dd::String_type m_row_format
Definition: handler.h:7443
ulonglong m_data_free
Definition: handler.h:7444
ulonglong m_version
Definition: handler.h:7442
dd::String_type m_status
Definition: handler.h:7445
ulonglong m_maximum_size
Definition: handler.h:7440
ulonglong m_logfile_group_number
Definition: handler.h:7435
ulonglong m_free_extents
Definition: handler.h:7436
ha_tablespace_statistics()
Definition: handler.h:7420
ulonglong m_autoextend_size
Definition: handler.h:7441
ulonglong m_total_extents
Definition: handler.h:7437
ulonglong m_extent_size
Definition: handler.h:7438
dd::String_type m_logfile_group_name
Definition: handler.h:7434
dd::String_type m_type
Definition: handler.h:7433
dd::String_type m_extra
Definition: handler.h:7446
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4413
virtual int sample_end(void *scan_ctx)
End sampling.
Definition: handler.cc:3088
KEY_PART_INFO * range_key_part
Definition: handler.h:4472
virtual int ft_read(uchar *)
Definition: handler.h:5480
virtual bool get_foreign_dup_key(char *child_table_name, uint child_table_name_len, char *child_key_name, uint child_key_name_len)
Retrieves the names of the table and the key for which there was a duplicate entry in the case of HA_...
Definition: handler.cc:4608
virtual int load_table(const TABLE &table)
Loads a table into its defined secondary storage engine.
Definition: handler.h:6629
virtual int repair(THD *, HA_CHECK_OPT *)
In this method check_opt can be modified to specify CHECK option to use to call check() upon the tabl...
Definition: handler.h:6560
ulonglong insert_id_for_cur_row
insert id for the current row (autogenerated; if not autogenerated, it's 0).
Definition: handler.h:4522
virtual bool is_index_algorithm_supported(enum ha_key_alg key_alg) const
Check if SE supports specific key algorithm.
Definition: handler.h:5338
virtual void set_external_table_offload_error(const char *)
Propagates the secondary storage engine offload failure reason for a query to the external engine whe...
Definition: handler.h:6967
virtual double read_time(uint index, uint ranges, ha_rows rows)
The cost of reading a set of ranges from the table using an index to access it.
Definition: handler.h:4985
handler * m_primary_handler
Pointer to the handler of the table in the primary storage engine, if this handler represents a table...
Definition: handler.h:4469
virtual ~handler(void)
Definition: handler.h:4673
@ SAMPLING
Definition: handler.h:4499
@ NONE
Definition: handler.h:4499
@ INDEX
Definition: handler.h:4499
@ RND
Definition: handler.h:4499
int ha_index_init(uint idx, bool sorted)
Initialize use of index.
Definition: handler.cc:2876
virtual int index_prev(uchar *)
Definition: handler.h:5425
virtual FT_INFO * ft_init_ext(uint flags, uint inx, String *key)
Definition: handler.cc:3012
virtual void external_table_offload_error() const
Identifies and throws the propagated external engine query offload or exec failure reason given by th...
Definition: handler.h:6973
virtual uint max_supported_key_length() const
Definition: handler.h:5790
const Item * pushed_cond
Definition: handler.h:4501
void set_ha_table(TABLE *table_arg)
Definition: handler.h:6871
Unique_on_insert * m_unique
Definition: handler.h:4637
std::mt19937 m_random_number_engine
Definition: handler.h:4541
virtual int reset()
Reset state of file to after 'open'.
Definition: handler.h:6510
virtual int records_from_index(ha_rows *num_rows, uint index)
Number of rows in table counted using the secondary index chosen by optimizer.
Definition: handler.cc:3135
virtual int open(const char *name, int mode, uint test_if_locked, const dd::Table *table_def)=0
virtual int index_first(uchar *)
Definition: handler.h:5428
Handler_share * get_ha_share_ptr()
Get an initialized ha_share.
Definition: handler.cc:8077
bool m_update_generated_read_fields
Some non-virtual ha_* functions, responsible for reading rows, like ha_rnd_pos(), must ensure that vi...
Definition: handler.h:4634
batch_mode_t
Internal state of the batch instrumentation.
Definition: handler.h:4546
@ PSI_BATCH_MODE_STARTING
Batch mode used, before first table io.
Definition: handler.h:4550
@ PSI_BATCH_MODE_STARTED
Batch mode used, after first table io.
Definition: handler.h:4552
@ PSI_BATCH_MODE_NONE
Batch mode not used.
Definition: handler.h:4548
Discrete_interval auto_inc_interval_for_cur_row
Interval returned by get_auto_increment() and being consumed by the inserter.
Definition: handler.h:4527
void restore_auto_increment(ulonglong prev_insert_id)
Definition: handler.h:5718
bool ha_check_and_repair(THD *thd)
Check and repair table: public interface.
Definition: handler.cc:4856
virtual enum ha_key_alg get_default_index_algorithm() const
Get default key algorithm for SE.
Definition: handler.h:5327
double table_in_memory_estimate() const
Return an estimate of how much of the table that is currently stored in main memory.
Definition: handler.cc:5922
virtual const char * table_type() const =0
The following can be called without an open handler.
virtual Cost_estimate read_cost(uint index, double ranges, double rows)
Cost estimate for reading a set of ranges from the table using an index to access it.
Definition: handler.cc:6060
bool in_range_check_pushed_down
Definition: handler.h:4478
uint ranges_in_seq
Definition: handler.h:4439
uint max_key_parts() const
Definition: handler.h:5777
virtual bool primary_key_is_clustered() const
Check if the primary key is clustered or not.
Definition: handler.h:5877
bool m_virt_gcol_in_end_range
Flag which tells if end_range contains a virtual generated column.
Definition: handler.h:4492
int ha_index_next_pushed(uchar *buf)
Definition: handler.cc:3570
ha_statistics stats
Definition: handler.h:4433
void rebind_psi()
Definition: handler.cc:2711
int ha_update_row(const uchar *old_data, uchar *new_data)
Update the current row.
Definition: handler.cc:8002
int ha_delete_all_rows()
Delete all rows: public interface.
Definition: handler.cc:4804
virtual int index_init(uint idx, bool sorted)
Definition: handler.h:6447
virtual int enable_indexes(uint mode)
Enable indexes again.
Definition: handler.h:6785
int check_collation_compatibility()
Check for incompatible collation changes.
Definition: handler.cc:4493
virtual uint lock_count(void) const
Get number of lock objects returned in store_lock.
Definition: handler.h:5833
std::function< void(void *cookie)> Load_end_cbk
This callback is called by each parallel load thread when processing of rows has ended for the adapte...
Definition: handler.h:4870
virtual const TABLE * parent_of_pushed_join() const
If this handler instance is a child in a pushed join sequence returned TABLE instance being my parent...
Definition: handler.h:5971
virtual uint max_supported_key_parts() const
Definition: handler.h:5789
enum_range_scan_direction range_scan_direction
Definition: handler.h:4462
bool eq_range
Definition: handler.h:4473
virtual int disable_indexes(uint mode)
Disable indexes for a while.
Definition: handler.h:6772
virtual uint extra_rec_buf_length() const
Definition: handler.h:5200
key_range * end_range
End value for a range scan.
Definition: handler.h:4487
virtual void init_table_handle_for_HANDLER()
Definition: handler.h:5763
uint active_index
Definition: handler.h:4495
RANGE_SEQ_IF mrr_funcs
Definition: handler.h:4437
int ha_index_last(uchar *buf)
Reads the last row via index.
Definition: handler.cc:3446
virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share)
Change the internal TABLE_SHARE pointer.
Definition: handler.h:4953
virtual int extra(enum ha_extra_function operation)
Storage engine specific implementation of ha_extra()
Definition: handler.h:5585
virtual void end_bulk_update()
Perform any needed clean-up, no outstanding updates are there at the moment.
Definition: handler.h:5381
int ha_multi_range_read_next(char **range_info)
Definition: handler.cc:6390
int ha_end_bulk_insert()
End bulk insert.
Definition: handler.cc:4777
uint errkey
Definition: handler.h:4493
virtual ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key)
Find number of records in a range.
Definition: handler.h:5517
virtual int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint mode, HANDLER_BUFFER *buf)
Initialize the MRR scan.
Definition: handler.cc:6378
virtual int multi_range_read_next(char **range_info)
Get next record in MRR scan.
Definition: handler.cc:6420
virtual int update_row(const uchar *old_data, uchar *new_data)
Update a single row.
Definition: handler.h:6497
virtual int index_read_pushed(uchar *, const uchar *, key_part_map)
Definition: handler.h:5983
virtual bool check_if_incompatible_data(HA_CREATE_INFO *create_info, uint table_changes)
Part of old, deprecated in-place ALTER API.
Definition: handler.h:5993
int ha_enable_indexes(uint mode)
Enable indexes: public interface.
Definition: handler.cc:4882
virtual bool is_fatal_error(int error)
Determine whether an error is fatal or not.
Definition: handler.cc:4142
virtual int sample_next(void *scan_ctx, uchar *buf)
Get the next record for sampling.
Definition: handler.cc:3090
double index_in_memory_estimate(uint keyno) const
Return an estimate of how much of the index that is currently stored in main memory.
Definition: handler.cc:5941
bool filter_dup_records()
Filter duplicate records when multi-valued index is used for retrieval.
Definition: handler.cc:8450
int m_lock_type
The lock type set by when calling::ha_external_lock().
Definition: handler.h:4613
handlerton * ht
Definition: handler.h:4427
virtual bool is_ignorable_error(int error)
Determine whether an error can be ignored or not.
Definition: handler.cc:4117
TABLE_SHARE * table_share
Definition: handler.h:4420
int ha_read_range_next()
Definition: handler.cc:7341
int ha_create(const char *name, TABLE *form, HA_CREATE_INFO *info, dd::Table *table_def)
Create a table in the engine: public interface.
Definition: handler.cc:5048
virtual int info(uint flag)=0
General method to gather info from handler.
virtual bool start_read_removal(void)
Start read (before write) removal on the current table.
Definition: handler.h:5617
int ha_sample_end(void *scan_ctx)
End sampling.
Definition: handler.cc:3054
void ha_start_bulk_insert(ha_rows rows)
Start bulk insert.
Definition: handler.cc:4762
int ha_delete_row(const uchar *buf)
Definition: handler.cc:8030
int ha_index_next_same(uchar *buf, const uchar *key, uint keylen)
Reads the next same row via index.
Definition: handler.cc:3482
int ha_index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map)
Definition: handler.cc:3259
virtual void cancel_pushed_idx_cond()
Reset information about pushed index conditions.
Definition: handler.h:5949
int ha_sample_init(void *&scan_ctx, double sampling_percentage, int sampling_seed, enum_sampling_method sampling_method, const bool tablesample)
Initialize sampling.
Definition: handler.cc:3035
virtual void append_create_info(String *packet)
Definition: handler.h:5762
virtual uint max_supported_key_part_length(HA_CREATE_INFO *create_info) const
Definition: handler.h:5791
bool ha_upgrade_table(THD *thd, const char *dbname, const char *table_name, dd::Table *dd_table, TABLE *table_arg)
Set se_private_id and se_private_data during upgrade.
Definition: handler.cc:8362
virtual int check(THD *, HA_CHECK_OPT *)
Definition: handler.h:6553
virtual const Item * cond_push(const Item *cond)
Push condition down to the table handler.
Definition: handler.h:5914
virtual longlong get_memory_buffer_size() const
Return an estimate on the amount of memory the storage engine will use for caching data in memory.
Definition: handler.h:5096
virtual int rnd_next(uchar *buf)=0
virtual void unlock_row()
Unlock last accessed row.
Definition: handler.h:5691
virtual int preload_keys(THD *, HA_CHECK_OPT *)
Definition: handler.h:5749
uint max_keys() const
Definition: handler.h:5774
void ha_statistic_increment(ulonglong System_status_var::*offset) const
Definition: handler.cc:2687
int ha_bulk_update_row(const uchar *old_data, uchar *new_data, uint *dup_key_found)
Bulk update row: public interface.
Definition: handler.cc:4790
virtual double index_only_read_time(uint keynr, double records)
Calculate cost of 'index only' scan for given index and number of records.
Definition: handler.cc:5912
double m_sampling_percentage
Definition: handler.h:4542
virtual FT_INFO * ft_init_ext_with_hints(uint inx, String *key, Ft_hints *hints)
Definition: handler.h:5467
void set_end_range(const key_range *range, enum_range_scan_direction direction)
Set the end position for a range scan.
Definition: handler.cc:7407
int ha_index_next(uchar *buf)
Reads the next row via index.
Definition: handler.cc:3328
virtual int index_read(uchar *buf, const uchar *key, uint key_len, enum ha_rkey_function find_flag)
Definition: handler.h:6658
int ha_discard_or_import_tablespace(bool discard, dd::Table *table_def)
Discard or import tablespace: public interface.
Definition: handler.cc:4895
uint pushed_idx_cond_keyno
Definition: handler.h:4504
virtual void column_bitmaps_signal()
Signal that the table->read_set and table->write_set table maps changed The handler is allowed to set...
Definition: handler.cc:3944
virtual Partition_handler * get_partition_handler()
Definition: handler.h:6920
virtual ha_rows end_read_removal(void)
End read (before write) removal and return the number of rows really written.
Definition: handler.h:5627
HANDLER_BUFFER * multi_range_buffer
Definition: handler.h:4438
uchar * ref
Pointer to current row.
Definition: handler.h:4429
int ha_reset()
Check handler usage and reset state of file to after 'open'.
Definition: handler.cc:7946
virtual int index_next_same(uchar *buf, const uchar *key, uint keylen)
Definition: handler.cc:5111
virtual bool was_semi_consistent_read()
Definition: handler.h:5675
int ha_records(ha_rows *num_rows, uint index)
Wrapper function to call records_from_index() in storage engine.
Definition: handler.h:5296
virtual Cost_estimate index_scan_cost(uint index, double ranges, double rows)
Cost estimate for reading a number of ranges from an index.
Definition: handler.cc:6040
int ha_check(THD *thd, HA_CHECK_OPT *check_opt)
to be actually called to get 'check()' functionality
Definition: handler.cc:4682
virtual int index_next(uchar *)
Definition: handler.h:5422
int ha_read_range_first(const key_range *start_key, const key_range *end_key, bool eq_range, bool sorted)
Definition: handler.cc:7322
virtual void update_create_info(HA_CREATE_INFO *create_info)
Update create info as part of ALTER TABLE.
Definition: handler.h:5744
virtual int rnd_end()
Definition: handler.h:6463
uint key_used_on_scan
Definition: handler.h:4494
virtual ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys, uint *bufsz, uint *flags, Cost_estimate *cost)
Get cost and other information about MRR scan over some sequence of ranges.
Definition: handler.cc:6319
virtual Cost_estimate table_scan_cost()
Cost estimate for doing a complete table scan.
Definition: handler.cc:6026
virtual 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)
Get cost and other information about MRR scan over a known list of ranges.
Definition: handler.cc:6160
virtual ulong index_flags(uint idx, uint part, bool all_parts) const =0
virtual int external_lock(THD *thd, int lock_type)
Is not invoked for non-transactional temporary tables.
Definition: handler.h:6546
int ha_extra(enum ha_extra_function operation)
Request storage engine to do an extra operation: enable,disable or run some functionality.
Definition: handler.cc:8456
ulonglong next_insert_id
next_insert_id is the next value which should be inserted into the auto_increment column: in a insert...
Definition: handler.h:4515
virtual bool low_byte_first() const
Definition: handler.h:5799
void ha_set_primary_handler(handler *primary_handler)
Store a pointer to the handler of the primary table that corresponds to the secondary table in this h...
Definition: handler.cc:8768
uint ref_length
Length of ref (1-8 or the clustered key length)
Definition: handler.h:4497
virtual double scan_time()
Definition: handler.h:4966
int ha_analyze(THD *thd, HA_CHECK_OPT *check_opt)
Analyze table: public interface.
Definition: handler.cc:4843
virtual uint max_supported_record_length() const
Definition: handler.h:5787
virtual enum_alter_inplace_result check_if_supported_inplace_alter(TABLE *altered_table, Alter_inplace_info *ha_alter_info)
Check if a storage engine supports a particular alter table in-place.
Definition: handler.cc:4939
ulonglong Table_flags
Definition: handler.h:4417
virtual void parallel_scan_end(void *scan_ctx)
End of the parallel scan.
Definition: handler.h:4897
bool ha_commit_inplace_alter_table(TABLE *altered_table, Alter_inplace_info *ha_alter_info, bool commit, const dd::Table *old_table_def, dd::Table *new_table_def)
Public function wrapping the actual handler call.
Definition: handler.cc:4914
PSI_table_share * ha_table_share_psi(const TABLE_SHARE *share) const
Acquire the instrumented table information from a table share.
Definition: handler.cc:2745
int get_lock_type() const
Definition: handler.h:6873
std::function< bool(void *cookie, ulong ncols, ulong row_len, const ulong *col_offsets, const ulong *null_byte_offsets, const ulong *null_bitmasks)> Load_init_cbk
This callback is called by each parallel load thread at the beginning of the parallel load for the ad...
Definition: handler.h:4848
Table_flags ha_table_flags() const
The cached_table_flags is set at ha_open and ha_external_lock.
Definition: handler.h:4759
virtual int extra_opt(enum ha_extra_function operation, ulong cache_size)
Definition: handler.h:5590
void ha_drop_table(const char *name)
Drop table in the engine: public interface.
Definition: handler.cc:5035
bool ha_prepare_inplace_alter_table(TABLE *altered_table, Alter_inplace_info *ha_alter_info, const dd::Table *old_table_def, dd::Table *new_table_def)
Public functions wrapping the actual handler call.
Definition: handler.cc:4903
void start_psi_batch_mode()
Put the handler in 'batch' mode when collecting table io instrumented events.
Definition: handler.cc:2724
int ha_index_or_rnd_end()
Definition: handler.h:4753
virtual bool is_crashed() const
Check if the table is crashed.
Definition: handler.h:5809
int ha_truncate(dd::Table *table_def)
Truncate table: public interface.
Definition: handler.cc:4817
virtual int close(void)=0
int ha_index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag)
Read [part of] row via [part of] index.
Definition: handler.cc:3229
int ha_sample_next(void *scan_ctx, uchar *buf)
Get the next record for sampling.
Definition: handler.cc:3062
void unbind_psi()
Definition: handler.cc:2699
virtual int assign_to_keycache(THD *, HA_CHECK_OPT *)
Definition: handler.h:5746
virtual bool start_bulk_update()
Definition: handler.h:5356
uchar * dup_ref
Pointer to duplicate row.
Definition: handler.h:4431
bool end_psi_batch_mode_if_started()
If a PSI batch was started, turn if off.
Definition: handler.h:4600
int ha_check_for_upgrade(HA_CHECK_OPT *check_opt)
Definition: handler.cc:4525
handler * ha_get_primary_handler() const
Get a pointer to a handler for the table in the primary storage engine, if this handler is for a tabl...
Definition: handler.h:6950
bool ha_get_se_private_data(dd::Table *dd_table, bool reset)
Submit a dd::Table object representing a core DD table having hardcoded data to be filled in by the D...
Definition: handler.cc:5081
virtual uint32 calculate_key_hash_value(Field **field_array)
Definition: handler.h:5558
uint max_record_length() const
Definition: handler.h:5771
void unlock_shared_ha_data()
Release lock for protecting ha_share.
Definition: handler.cc:8123
virtual int parallel_scan_init(void *&scan_ctx, size_t *num_threads, bool use_reserved_threads)
Initializes a parallel scan.
Definition: handler.h:4821
void mark_trx_read_write()
A helper function to mark a transaction read-write, if it is started.
Definition: handler.cc:4710
virtual uint number_of_pushed_joins() const
Reports number of tables included in pushed join which this handler instance is part of.
Definition: handler.h:5959
virtual int sample_init(void *&scan_ctx, double sampling_percentage, int sampling_seed, enum_sampling_method sampling_method, const bool tablesample)
Initialize sampling.
Definition: handler.cc:3083
PSI_table * m_psi
Instrumented table associated with this handler.
Definition: handler.h:4539
virtual int discard_or_import_tablespace(bool discard, dd::Table *table_def)
Discard or import tablespace.
Definition: handler.h:6804
virtual int exec_bulk_update(uint *dup_key_found)
After this call all outstanding updates must be performed.
Definition: handler.h:5373
int update_auto_increment()
Definition: handler.cc:3741
virtual int indexes_are_disabled(void)
Check if indexes are disabled.
Definition: handler.h:5761
Record_buffer * ha_get_record_buffer() const
Get the record buffer that was set with ha_set_record_buffer().
Definition: handler.h:4708
virtual Table_flags table_flags(void) const =0
THD * ha_thd() const
Definition: handler.cc:2692
batch_mode_t m_psi_batch_mode
Batch mode state.
Definition: handler.h:4559
virtual int index_read_last(uchar *buf, const uchar *key, uint key_len)
Definition: handler.h:6664
virtual int start_stmt(THD *thd, thr_lock_type lock_type)
Start a statement when table is locked.
Definition: handler.h:5706
virtual const TABLE * member_of_pushed_join() const
If this handler instance is part of a pushed join sequence returned TABLE instance being root of the ...
Definition: handler.h:5965
virtual int index_next_pushed(uchar *)
Definition: handler.h:5987
FT_INFO * ft_handler
Definition: handler.h:4498
int ha_index_read_pushed(uchar *buf, const uchar *key, key_part_map keypart_map)
Definition: handler.cc:3554
virtual const handlerton * hton_supporting_engine_pushdown()
Get the handlerton of the storage engine if the SE is capable of pushing down some of the AccessPath ...
Definition: handler.h:5609
virtual bool is_record_buffer_wanted(ha_rows *const max_rows) const
Does this handler want to get a Record_buffer for multi-row reads via the ha_set_record_buffer() func...
Definition: handler.h:6583
Handler_share ** ha_share
Pointer where to store/retrieve the Handler_share pointer.
Definition: handler.h:4618
virtual handler * clone(const char *name, MEM_ROOT *mem_root)
Definition: handler.cc:2655
int ha_optimize(THD *thd, HA_CHECK_OPT *check_opt)
Optimize table: public interface.
Definition: handler.cc:4830
Table_flags cached_table_flags
Definition: handler.h:4422
virtual int analyze(THD *, HA_CHECK_OPT *)
Definition: handler.h:6746
int ha_external_lock(THD *thd, int lock_type)
These functions represent the public interface to users of the handler class, hence they are not virt...
Definition: handler.cc:7903
virtual void notify_table_changed(Alter_inplace_info *ha_alter_info)
Notify the storage engine that the table definition has been updated.
Definition: handler.h:6368
handler(handlerton *ht_arg, TABLE_SHARE *share_arg)
Definition: handler.h:4640
virtual uint max_supported_keys() const
Definition: handler.h:5788
virtual int records(ha_rows *num_rows)
Number of rows in table.
Definition: handler.cc:3101
virtual int rnd_init(bool scan)=0
rnd_init() can be called two times without rnd_end() in between (it only makes sense if scan=1).
uint max_key_length() const
Definition: handler.h:5780
range_seq_t mrr_iter
Definition: handler.h:4436
int handle_records_error(int error, ha_rows *num_rows)
Function will handle the error code from call to records() and records_from_index().
Definition: handler.cc:3175
virtual int rename_table(const char *from, const char *to, const dd::Table *from_table_def, dd::Table *to_table_def)
Default rename_table() and delete_table() rename/delete files with a given name and extensions from h...
Definition: handler.cc:4641
int ha_records(ha_rows *num_rows)
Wrapper function to call records() in storage engine.
Definition: handler.h:5284
void lock_shared_ha_data()
Take a lock for protecting shared handler data.
Definition: handler.cc:8113
PSI_table_locker * m_psi_locker
The current event in a batch.
Definition: handler.h:4571
int ha_open(TABLE *table, const char *name, int mode, int test_if_locked, const dd::Table *table_def)
Definition: handler.cc:2775
virtual void start_bulk_insert(ha_rows)
Definition: handler.h:6564
static bool my_prepare_gcolumn_template(THD *thd, const char *db_name, const char *table_name, my_gcolumn_template_callback_t myc, void *ib_table)
Callback to allow InnoDB to prepare a template for generated column processing.
Definition: handler.cc:8384
virtual bool inplace_alter_table(TABLE *altered_table, Alter_inplace_info *ha_alter_info, const dd::Table *old_table_def, dd::Table *new_table_def)
Alter the table structure in-place with operations specified using HA_ALTER_FLAGS and Alter_inplace_i...
Definition: handler.h:6280
uint get_index(void) const
Definition: handler.h:5350
virtual int read_range_first(const key_range *start_key, const key_range *end_key, bool eq_range_arg, bool sorted)
Read first row between two ranges.
Definition: handler.cc:7292
int ha_delete_table(const char *name, const dd::Table *table_def)
Delete table: public interface.
Definition: handler.cc:5022
virtual void get_auto_increment(ulonglong offset, ulonglong increment, ulonglong nb_desired_values, ulonglong *first_value, ulonglong *nb_reserved_values)
Reserves an interval of auto_increment values from the handler.
Definition: handler.cc:3966
virtual bool prepare_inplace_alter_table(TABLE *altered_table, Alter_inplace_info *ha_alter_info, const dd::Table *old_table_def, dd::Table *new_table_def)
Allows the storage engine to update internal structures with concurrent writes blocked.
Definition: handler.h:6243
virtual uint min_record_length(uint options) const
Definition: handler.h:5795
void init()
This is called after create to allow us to set up cached variables.
Definition: handler.h:4691
void set_ha_share_ptr(Handler_share *arg_ha_share)
Set ha_share to be used by all instances of the same table/partition.
Definition: handler.cc:8098
virtual std::string explain_extra() const
Return extra handler specific text for EXPLAIN.
Definition: handler.h:4684
virtual int write_row(uchar *buf)
Write a row.
Definition: handler.h:6485
virtual void try_semi_consistent_read(bool)
Tell the engine whether it should avoid unnecessary lock waits.
Definition: handler.h:5682
enum_range_scan_direction
Definition: handler.h:4453
@ RANGE_SCAN_ASC
Definition: handler.h:4453
@ RANGE_SCAN_DESC
Definition: handler.h:4453
void end_psi_batch_mode()
End a batch started with start_psi_batch_mode.
Definition: handler.cc:2733
void set_next_insert_id(ulonglong id)
Definition: handler.h:5714
virtual int ft_init()
Definition: handler.h:5465
int compare_key_icp(const key_range *range) const
Definition: handler.cc:7485
TABLE * table
Definition: handler.h:4421
void ha_notify_table_changed(Alter_inplace_info *ha_alter_info)
Public function wrapping the actual handler call.
Definition: handler.h:6201
int ha_index_prev(uchar *buf)
Reads the previous row via index.
Definition: handler.cc:3372
int ha_rnd_pos(uchar *buf, uchar *pos)
Read row via random scan from position.
Definition: handler.cc:2992
int ha_index_first(uchar *buf)
Reads the first row via index.
Definition: handler.cc:3408
bool ha_inplace_alter_table(TABLE *altered_table, Alter_inplace_info *ha_alter_info, const dd::Table *old_table_def, dd::Table *new_table_def)
Public function wrapping the actual handler call.
Definition: handler.h:6177
Record_buffer * m_record_buffer
Buffer for multi-row reads.
Definition: handler.h:4456
void ha_release_auto_increment()
Definition: handler.cc:4030
virtual int truncate(dd::Table *table_def)
Quickly remove all rows from a table.
Definition: handler.h:6740
virtual int index_end()
Definition: handler.h:6451
virtual table_map tables_in_pushed_join() const
Definition: handler.h:5975
virtual int delete_all_rows()
Delete all rows in a table.
Definition: handler.h:6705
virtual int rnd_pos_by_record(uchar *record)
This function only works for handlers having HA_PRIMARY_KEY_REQUIRED_FOR_POSITION set.
Definition: handler.h:5488
int ha_load_table(const TABLE &table)
Loads a table into its defined secondary storage engine: public interface.
Definition: handler.cc:5064
virtual void drop_table(const char *name)
Definition: handler.cc:4662
virtual int unload_table(const char *db_name, const char *table_name, bool error_if_not_loaded)
Unloads a table from its defined secondary storage engine.
Definition: handler.h:6648
void ha_mv_key_capacity(uint *num_keys, size_t *keys_length) const
Return max limits for a single set of multi-valued keys.
Definition: handler.h:6958
virtual int optimize(THD *, HA_CHECK_OPT *)
Definition: handler.h:6743
int ha_index_read_idx_map(uchar *buf, uint index, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag)
Initializes an index and read it.
Definition: handler.cc:3289
virtual int bulk_update_row(const uchar *old_data, uchar *new_data, uint *dup_key_found)
This method is similar to update_row, however the handler doesn't need to execute the updates at this...
Definition: handler.h:6688
virtual bool check_and_repair(THD *thd)
Check and repair the table if necessary.
Definition: handler.h:6761
virtual bool auto_repair() const
Check if the table can be automatically repaired.
Definition: handler.h:5818
virtual int end_bulk_insert()
Definition: handler.h:6565
virtual int index_read_idx_map(uchar *buf, uint index, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag)
Positions an index cursor to the index specified in argument.
Definition: handler.cc:7544
virtual bool start_bulk_delete()
Definition: handler.h:5361
uint auto_inc_intervals_count
Number of reserved auto-increment intervals.
Definition: handler.h:4534
void ha_set_record_buffer(Record_buffer *buffer)
Set a record buffer that the storage engine can use for multi-row reads.
Definition: handler.h:4701
virtual ha_checksum checksum() const
Definition: handler.h:5800
virtual void mv_key_capacity(uint *num_keys, size_t *keys_length) const
Engine-specific function for ha_can_store_mv_keys().
Definition: handler.h:6981
static bool my_eval_gcolumn_expr_with_open(THD *thd, const char *db_name, const char *table_name, const MY_BITMAP *const fields, uchar *record, const char **mv_data_ptr, ulong *mv_length)
Callback for generated columns processing.
Definition: handler.cc:8422
virtual bool get_se_private_data(dd::Table *dd_table, bool reset)
Definition: handler.h:6835
int ha_repair(THD *thd, HA_CHECK_OPT *check_opt)
Repair table: public interface.
Definition: handler.cc:4739
int ha_rnd_next(uchar *buf)
Read next row via random scan.
Definition: handler.cc:2961
virtual void position(const uchar *record)=0
void adjust_next_insert_id_after_explicit_value(ulonglong nr)
Definition: handler.cc:3616
void(* my_gcolumn_template_callback_t)(const TABLE *, void *)
Callback function that will be called by my_prepare_gcolumn_template once the table has been opened.
Definition: handler.h:6879
int ha_rnd_end()
End use of random access.
Definition: handler.cc:2939
uint get_dup_key(int error)
Definition: handler.cc:4598
virtual bool upgrade_table(THD *thd, const char *dbname, const char *table_name, dd::Table *dd_table)
Definition: handler.h:6589
int ha_write_row(uchar *buf)
Definition: handler.cc:7974
virtual int delete_table(const char *name, const dd::Table *table_def)
Delete a table.
Definition: handler.cc:4613
virtual int get_extra_columns_and_keys(const HA_CREATE_INFO *create_info, const List< Create_field > *create_list, const KEY *key_info, uint key_count, dd::Table *table_obj)
Adjust definition of table to be created by adding implicit columns and indexes necessary for the sto...
Definition: handler.h:6858
virtual void use_hidden_primary_key()
use_hidden_primary_key() is called in case of an update/delete when (table_flags() and HA_PRIMARY_KEY...
Definition: handler.cc:8061
int ha_ft_read(uchar *buf)
Definition: handler.cc:3019
key_range save_end_range
Definition: handler.h:4461
PSI_table_locker_state m_psi_locker_state
Storage for the event in a batch.
Definition: handler.h:4577
ha_rows estimation_rows_to_insert
Definition: handler.h:4424
virtual int rnd_pos(uchar *buf, uchar *pos)=0
bool mrr_is_output_sorted
Definition: handler.h:4441
virtual int index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map)
The following functions works like index_read, but it find the last row with the current key value or...
Definition: handler.h:5440
int ha_close(void)
Close handler.
Definition: handler.cc:2845
uint max_key_part_length(HA_CREATE_INFO *create_info) const
Definition: handler.h:5783
virtual bool set_ha_share_ref(Handler_share **arg_ha_share)
Definition: handler.h:6866
virtual void release_auto_increment()
Definition: handler.h:6550
const TABLE_SHARE * get_table_share() const
Definition: handler.h:4957
virtual int read_range_next()
Read next row between two endpoints.
Definition: handler.cc:7369
int ha_read_first_row(uchar *buf, uint primary_key)
Read first row (only) from a table.
Definition: handler.cc:3524
virtual ha_rows estimate_rows_upper_bound()
Return upper bound of current number of records in the table (max.
Definition: handler.h:5306
bool has_transactions()
Definition: handler.h:5197
virtual int delete_row(const uchar *buf)
Definition: handler.h:6502
Item * pushed_idx_cond
Definition: handler.h:4503
int compare_key_in_buffer(const uchar *buf) const
Check if the key in the given buffer (which is not necessarily TABLE::record[0]) is within range.
Definition: handler.cc:7520
virtual int parallel_scan(void *scan_ctx, void **thread_ctxs, Load_init_cbk init_fn, Load_cbk load_fn, Load_end_cbk end_fn)
Run the parallel read of data.
Definition: handler.h:4885
virtual int check_for_upgrade(HA_CHECK_OPT *)
admin commands - called from mysql_admin_table
Definition: handler.h:6552
enum handler::@50 inited
int ha_disable_indexes(uint mode)
Disable indexes: public interface.
Definition: handler.cc:4869
double estimate_in_memory_buffer(ulonglong table_index_size) const
Make a guesstimate for how much of a table or index is in a memory buffer in the case where the stora...
Definition: handler.cc:5969
virtual int index_last(uchar *)
Definition: handler.h:5431
virtual double page_read_cost(uint index, double reads)
Cost estimate for doing a number of non-sequentially accesses against the storage engine.
Definition: handler.cc:6079
virtual Item * idx_cond_push(uint keyno, Item *idx_cond)
Push down an index condition to the handler.
Definition: handler.h:5944
int key_compare_result_on_equal
Definition: handler.h:4463
int compare_key(key_range *range)
Compare if found key (in row) is over max-value.
Definition: handler.cc:7450
KEY_MULTI_RANGE mrr_cur_range
Definition: handler.h:4446
bool mrr_have_range
Definition: handler.h:4444
virtual int cmp_ref(const uchar *ref1, const uchar *ref2) const
Compare two positions.
Definition: handler.h:5890
bool ha_is_record_buffer_wanted(ha_rows *const max_rows) const
Does this handler want to get a Record_buffer for multi-row reads via the ha_set_record_buffer() func...
Definition: handler.h:4725
ulonglong m_psi_numrows
The number of rows in the batch.
Definition: handler.h:4565
virtual bool commit_inplace_alter_table(TABLE *altered_table, Alter_inplace_info *ha_alter_info, bool commit, const dd::Table *old_table_def, dd::Table *new_table_def)
Commit or rollback the changes made during prepare_inplace_alter_table() and inplace_alter_table() in...
Definition: handler.h:6338
virtual int end_bulk_delete()
Execute all outstanding deletes and close down the bulk delete.
Definition: handler.h:5388
virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info, dd::Table *table_def)=0
Create table (implementation).
virtual double worst_seek_times(double reads)
Provide an upper cost-limit of doing a specified number of seek-and-read key lookups.
Definition: handler.cc:6093
int ha_rename_table(const char *from, const char *to, const dd::Table *from_table_def, dd::Table *to_table_def)
Rename table: public interface.
Definition: handler.cc:5007
virtual enum row_type get_real_row_type(const HA_CREATE_INFO *create_info) const
Get real row type for the table created based on one specified by user, CREATE TABLE options and SE c...
Definition: handler.h:5314
virtual int index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag)
Positions an index cursor to the index specified in the handle ('active_index').
Definition: handler.h:5401
std::function< bool(void *cookie, uint nrows, void *rowdata, uint64_t partition_id)> Load_cbk
This callback is called by each parallel load thread when processing of rows is required for the adap...
Definition: handler.h:4863
int ha_index_end()
End use of index.
Definition: handler.cc:2896
virtual THR_LOCK_DATA ** store_lock(THD *thd, THR_LOCK_DATA **to, enum thr_lock_type lock_type)=0
Is not invoked for non-transactional temporary tables.
int ha_unload_table(const char *db_name, const char *table_name, bool error_if_not_loaded)
Unloads a table from its defined secondary storage engine: public interface.
Definition: handler.cc:5071
int ha_rnd_init(bool scan)
Initialize table for random read or scan.
Definition: handler.cc:2920
virtual bool get_error_message(int error, String *buf)
Return an error message specific to this handler.
Definition: handler.cc:4479
bool implicit_emptied
Definition: handler.h:4500
virtual void print_error(int error, myf errflag)
Print error that we got from handler function.
Definition: handler.cc:4177
static bool my_eval_gcolumn_expr(THD *thd, TABLE *table, const MY_BITMAP *const fields, uchar *record, const char **mv_data_ptr, ulong *mv_length)
Callback for computing generated column values.
Definition: handler.cc:8440
In-place alter handler context.
Definition: handler.h:3178
virtual void set_shared_data(const inplace_alter_handler_ctx *ctx)
Definition: handler.h:3182
virtual ~inplace_alter_handler_ctx()=default
inplace_alter_handler_ctx()=default
Definition: partition_info.h:209
Legacy struct for passing tablespace information to SEs.
Definition: handler.h:860
ts_command_type ts_cmd_type
Definition: handler.h:864
bool wait_until_completed
Definition: handler.h:877
ulonglong undo_buffer_size
Definition: handler.h:870
ulonglong extent_size
Definition: handler.h:869
st_alter_tablespace(const char *tablespace, const char *logfile_group, ts_command_type cmd, enum ts_alter_tablespace_type alter_tablespace_cmd, const char *datafile, const char *undofile, const Tablespace_options &opts)
Proper constructor even for all-public class simplifies initialization and allows members to be const...
Definition: sql_tablespace.cc:93
const char * logfile_group_name
Definition: handler.h:863
ulonglong file_block_size
Definition: handler.h:875
const char * encryption
Definition: handler.h:879
const char * undo_file_name
Definition: handler.h:868
const char * tablespace_name
Definition: handler.h:862
const char * ts_comment
Definition: handler.h:878
std::optional< ulonglong > autoextend_size
Definition: handler.h:873
ulonglong redo_buffer_size
Definition: handler.h:871
ulonglong max_size
Definition: handler.h:874
ulonglong initial_size
Definition: handler.h:872
const char * data_file_name
Definition: handler.h:867
uint nodegroup_id
Definition: handler.h:876
bool is_tablespace_command()
Definition: handler.h:881
A table definition from the master.
Definition: rpl_utility.h:248
static MEM_ROOT mem_root
Definition: client_plugin.cc:110
static bool report_error(THD *thd, int error_code, Sql_condition::enum_severity_level level, Args... args)
Definition: error_handler.cc:291
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:222
Some definitions for full-text indices.
ft_operation
Operation types, used in FT_HINTS.
Definition: ft_global.h:99
@ FT_OP_UNDEFINED
Definition: ft_global.h:100
struct PSI_table_locker PSI_table_locker
Definition: psi_table_bits.h:43
struct PSI_table_share PSI_table_share
Definition: psi_table_bits.h:100
struct PSI_table PSI_table
Definition: psi_table_bits.h:107
static int flags[50]
Definition: hp_test1.cc:40
static int flag
Definition: hp_test1.cc:40
static uint keys
Definition: hp_test2.cc:46
#define IN_MEMORY_ESTIMATE_UNKNOWN
If the "in memory estimate" for a table (in ha_statistics.table_in_mem_estimate) or index (in KEY::m_...
Definition: key.h:111
constexpr const LEX_CSTRING NULL_CSTR
Definition: lex_string.h:47
A better implementation of the UNIX ctype(3) library.
#define STRING_WITH_LEN(X)
Definition: m_string.h:315
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
This file includes constants used by all storage engines.
#define HA_OPTION_PACK_RECORD
Indicates that storage engine needs to use packed row format.
Definition: my_base.h:602
#define rows2double(A)
Definition: my_base.h:1139
ha_panic_function
Definition: my_base.h:431
ha_key_alg
Definition: my_base.h:97
@ HA_KEY_ALG_SE_SPECIFIC
Used for cases when key algorithm which is supported by SE can't be described by one of other classes...
Definition: my_base.h:106
ha_rkey_function
Definition: my_base.h:78
ulong key_part_map
Definition: my_base.h:1007
my_off_t ha_rows
Definition: my_base.h:1140
ha_extra_function
Definition: my_base.h:184
#define HA_POS_ERROR
Definition: my_base.h:1142
#define HA_ERR_WRONG_COMMAND
Command not supported.
Definition: my_base.h:840
#define HA_OPTION_COMPRESS_RECORD
Flag indicating that table is compressed.
Definition: my_base.h:628
ha_storage_media
Definition: my_base.h:115
@ HA_SM_DEFAULT
Definition: my_base.h:116
Abstraction functions over zlib/intrinsics.
std::uint32_t ha_checksum
Definition: my_checksum.h:106
Header for compiler-dependent features.
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
Utility functions for converting between ulonglong and double.
#define ulonglong2double(A)
Definition: my_double2ulonglong.h:46
Some integer typedefs for easier portability.
int myf
Definition: my_inttypes.h:94
unsigned long long int ulonglong
Definition: my_inttypes.h:56
ulonglong my_off_t
Definition: my_inttypes.h:72
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
uint64_t uint64
Definition: my_inttypes.h:69
uint32_t uint32
Definition: my_inttypes.h:67
Common #defines and includes for file and socket I/O.
constexpr const size_t IO_SIZE
Definition: my_io.h:159
Common header for many mysys elements.
uint64_t table_map
Definition: my_table_map.h:30
void set_my_errno(int my_errno)
Set the MySQL thread-local storage variant of errno.
Definition: my_thr_init.cc:345
static char * query
Definition: myisam_ftdump.cc:45
static HashTable ht
Definition: mysql.cc:148
Log error(cerr, "ERROR")
Log info(cout, "NOTE")
static bool interrupted
Definition: mysqladmin.cc:66
static char * path
Definition: mysqldump.cc:137
struct stats stats
Definition: mysqlslap.cc:236
static Secondary_engine * secondary_engine
Definition: mysqltest.cc:249
static int record
Definition: mysqltest.cc:188
bool is_temp_table(const HA_CREATE_INFO &ci)
Definition: sql_table.cc:212
Definition: buf0block_hint.cc:30
constexpr value_type primary_key
Definition: classic_protocol_constants.h:269
std::string dir
Double write files location.
Definition: buf0dblwr.cc:77
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
unsigned long long Object_id
Definition: object_id.h:31
enum_column_types
Definition: column.h:53
Char_string_template< String_type_allocator > String_type
Definition: string_type.h:51
Definition: os0file.h:86
Definition: hypergraph.cc:30
void print(trx_t *trx, dict_index_t *index, std::ostream &out, ref_t ref, bool fatal)
Print information about the given LOB.
Definition: lob0impl.cc:1331
std::string file_name(Log_file_id file_id)
Provides name of the log file with the given file id, e.g.
Definition: log0pre_8_0_30.cc:94
static int destroy(mysql_cond_t *that, const char *, unsigned int)
Definition: mysql_cond_v1_native.cc:54
std::string join(Container cont, const std::string &delim)
join elements of an container into a string separated by a delimiter.
Definition: string.h:151
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:420
size_t buffer_size(const ConstBufferSequence &buffers) noexcept
Definition: buffer.h:315
Definition: options.cc:49
const char * table_name
Definition: rules_table_service.cc:56
const char * db_name
Definition: rules_table_service.cc:55
mode
Definition: file_handle.h:60
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2874
static int exists(node_address *name, node_list const *nodes, u_int with_uid)
Definition: node_list.cc:106
int(* Page_Track_Callback)(MYSQL_THD thd, const unsigned char *buffer, size_t buf_len, int num_pages, void *user_ctx)
Page tracking callback function.
Definition: page_track_service.h:66
struct result result
Definition: result.h:34
Performance schema instrumentation interface.
required string key
Definition: replication_asynchronous_connection_failover.proto:60
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
required uint64 version
Definition: replication_group_member_actions.proto:41
required string type
Definition: replication_group_member_actions.proto:34
ulonglong prev_insert_id(ulonglong nr, struct System_variables *variables)
Computes the largest number X:
Definition: handler.cc:3641
void trans_register_ha(THD *thd, bool all, handlerton *ht, const ulonglong *trxid)
Register a storage engine for a transaction.
Definition: handler.cc:1290
bool(* sdi_get_t)(const dd::Tablespace &tablespace, const sdi_key_t *sdi_key, void *sdi, uint64 *sdi_len)
Retrieve SDI for a given SDI key.
Definition: handler.h:1761
int ha_finalize_handlerton(st_plugin_int *plugin)
Definition: handler.cc:723
bool(* ddse_dict_init_t)(dict_init_mode_t dict_init_mode, uint version, List< const dd::Object_table > *DDSE_tables, List< const Plugin_tablespace > *DDSE_tablespaces)
Definition: handler.h:1897
handlerton * ha_checktype(THD *thd, enum legacy_db_type database_type, bool no_substitute, bool report_error)
Use other database handler if databasehandler is not compiled in.
Definition: handler.cc:565
bool(* qc_engine_callback)(THD *thd, const char *table_key, uint key_length, ulonglong *engine_data)
Definition: handler.h:139
int(* savepoint_set_t)(handlerton *hton, THD *thd, void *sv)
sv points to an uninitialized storage area of requested size (see savepoint_offset description)
Definition: handler.h:1362
bool(* show_status_t)(handlerton *hton, THD *thd, stat_print_fn *print, enum ha_stat_type stat)
Definition: handler.h:1493
#define UNDEF_NODEGROUP
Definition: handler.h:827
static const uint32 HTON_FKS_WITH_ANY_PREFIX_SUPPORTING_KEYS
Storage engine supports non-hash keys which have common prefix with the foreign key as supporting key...
Definition: handler.h:2994
int(*)(uint64_t *purge_id) page_track_purge_t
Purge page tracking data.
Definition: handler.h:2545
bool(* sdi_set_t)(handlerton *hton, const dd::Tablespace &tablespace, const dd::Table *table, const sdi_key_t *sdi_key, const void *sdi, uint64 sdi_len)
Insert/Update SDI for a given SDI key.
Definition: handler.h:1776
int ha_rollback_low(THD *thd, bool all)
Definition: handler.cc:1977
bool ha_notify_exclusive_mdl(THD *thd, const MDL_key *mdl_key, ha_notification_type notification_type, bool *victimized)
Notify/get permission from all interested storage engines before acquisition or after release of excl...
Definition: handler.cc:8588
size_t num_hton2plugins()
Returns the size of the array holding pointers to plugins.
Definition: handler.cc:240
int ha_find_files(THD *thd, const char *db, const char *path, const char *wild, bool dir, List< LEX_STRING > *files)
Definition: handler.cc:5714
bool(* dict_recover_t)(dict_recovery_mode_t dict_recovery_mode, uint version)
Do recovery in the DDSE as part of initializing the data dictionary.
Definition: handler.h:1950
int(*)(handlerton *hton, THD *thd, const uchar *&loc, uint &loc_len, uint &task_id, Ha_clone_mode mode, const char *data_dir) Clone_apply_begin_t
Begin apply to destination database.
Definition: handler.h:2226
constexpr const uint32 SDI_TYPE_TABLE
Id for identifying Table SDIs.
Definition: handler.h:120
void ha_kill_connection(THD *thd)
Definition: handler.cc:964
enum_ha_recover_xa_state
Enumeration of possible states for externally coordinated transactions (XA).
Definition: handler.h:1231
#define COMPATIBLE_DATA_NO
Definition: handler.h:821
std::unordered_set< my_xid, std::hash< my_xid >, std::equal_to< my_xid >, Mem_root_allocator< my_xid > > Xid_commit_list
Single occurrence set of XIDs of internally coordinated transactions found as been committed in the t...
Definition: handler.h:1245
bool(* lock_hton_log_t)(handlerton *hton)
Lock a handlerton (resource) log to collect log information.
Definition: handler.h:2295
Ha_clone_mode
Clone start operation mode.
Definition: handler.h:941
@ HA_CLONE_MODE_ADD_TASK
Add a new task to a running clone operation.
Definition: handler.h:949
@ HA_CLONE_MODE_START
Start a new clone operation.
Definition: handler.h:943
@ HA_CLONE_MODE_MAX
Max value for clone mode.
Definition: handler.h:955
@ HA_CLONE_MODE_VERSION
Get version for transfer data format.
Definition: handler.h:952
@ HA_CLONE_MODE_RESTART
Re-start a clone operation after failure.
Definition: handler.h:946
int(*)(uint64_t *start_id) page_track_start_t
Start page tracking.
Definition: handler.h:2520
static const size_t MAX_FK_NAME_SUFFIX_LENGTH
Maximum possible length of SE-specific suffixes for auto-generated foreign key names.
Definition: handler.h:3018
ha_stat_type
Definition: handler.h:931
@ HA_ENGINE_LOGS
Definition: handler.h:931
@ HA_ENGINE_MUTEX
Definition: handler.h:931
@ HA_ENGINE_STATUS
Definition: handler.h:931
st_plugin_int * remove_hton2plugin(uint slot)
Definition: handler.cc:248
int check_table_for_old_types(const TABLE *table, bool check_temporal_upgrade)
Function identifies any old data type present in table.
Definition: handler.cc:4555
static const uint MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT
Options for the START TRANSACTION statement.
Definition: handler.h:632
int ha_create_table(THD *thd, const char *path, const char *db, const char *table_name, HA_CREATE_INFO *create_info, bool update_create_info, bool is_temp_table, dd::Table *table_def)
Initiates table-file and calls appropriate database-creator.
Definition: handler.cc:5182
std::pair< int, bool > commit_owned_gtids(THD *thd, bool all)
The function computes condition to call gtid persistor wrapper, and executes it.
Definition: handler.cc:1536
int ha_resize_key_cache(KEY_CACHE *key_cache)
Resize key cache.
Definition: handler.cc:5603
std::bitset< HA_CLONE_TYPE_MAX > Ha_clone_flagset
Definition: handler.h:983
bool(*)(THD *thd, LEX *lex) optimize_secondary_engine_t
Optimize a statement for execution on a secondary storage engine.
Definition: handler.h:2354
bool(* notify_alter_table_t)(THD *thd, const MDL_key *mdl_key, ha_notification_type notification_type)
Notify/get permission from storage engine before or after execution of ALTER TABLE operation on the t...
Definition: handler.h:2035
bool(* savepoint_rollback_can_release_mdl_t)(handlerton *hton, THD *thd)
Check if storage engine allows to release metadata locks which were acquired after the savepoint if r...
Definition: handler.h:1370
void(* dict_register_dd_table_id_t)(dd::Object_id hard_coded_tables)
Initialize the set of hard coded DD table ids.
Definition: handler.h:1905
ts_command_type
Definition: handler.h:830
@ CREATE_LOGFILE_GROUP
Definition: handler.h:834
@ DROP_UNDO_TABLESPACE
Definition: handler.h:842
@ TS_CMD_NOT_DEFINED
Definition: handler.h:831
@ ALTER_TABLESPACE
Definition: handler.h:833
@ DROP_LOGFILE_GROUP
Definition: handler.h:837
@ ALTER_ACCESS_MODE_TABLESPACE
Definition: handler.h:839
@ ALTER_UNDO_TABLESPACE
Definition: handler.h:841
@ CHANGE_FILE_TABLESPACE
Definition: handler.h:838
@ DROP_TABLESPACE
Definition: handler.h:836
@ CREATE_UNDO_TABLESPACE
Definition: handler.h:840
@ CREATE_TABLESPACE
Definition: handler.h:832
@ ALTER_LOGFILE_GROUP
Definition: handler.h:835
bool(* is_dict_readonly_t)()
Check if the DDSE is started in a way that leaves thd DD being read only.
Definition: handler.h:1798
int(* recover_t)(handlerton *hton, XA_recover_txn *xid_list, uint len, MEM_ROOT *mem_root)
Definition: handler.h:1388
const char *(*)(THD *thd) get_secondary_engine_offload_or_exec_fail_reason_t
Looks up and returns a specific secondary engine query offload or exec failure reason as a string giv...
Definition: handler.h:2443
bool(* get_table_statistics_t)(const char *db_name, const char *table_name, dd::Object_id se_private_id, const dd::Properties &ts_se_private_data, const dd::Properties &tbl_se_private_data, uint flags, ha_statistics *stats)
Retrieve ha_statistics from SE.
Definition: handler.h:2111
#define HA_MAX_REC_LENGTH
Definition: handler.h:617
#define HTON_SUPPORTS_ATOMIC_DDL
Engine supports atomic DDL.
Definition: handler.h:2912
int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache)
Move all tables from one key cache to another one.
Definition: handler.cc:5624
int(* savepoint_release_t)(handlerton *hton, THD *thd, void *sv)
Definition: handler.h:1373
plugin_ref ha_lock_engine(THD *thd, const handlerton *hton)
Definition: handler.cc:516
int(*)(handlerton *hton, THD *thd, const uchar *loc, uint loc_len, uint task_id, int in_err) Clone_apply_end_t
End apply to destination database.
Definition: handler.h:2250
int(* find_files_t)(handlerton *hton, THD *thd, const char *db, const char *path, const char *wild, bool dir, List< LEX_STRING > *files)
Definition: handler.h:1663
int(*)(THD *thd, AccessPath *query, JOIN *) push_to_engine_t
Let storage engine inspect the query Accesspath and pick whatever it like for being pushed down to th...
Definition: handler.h:1687
bool(* redo_log_set_state_t)(THD *thd, bool enable)
Enable or Disable SE write ahead logging.
Definition: handler.h:2090
void ha_post_recover()
Perform SE-specific cleanup after recovery of transactions.
Definition: handler.cc:8763
void(* acl_notify_t)(THD *thd, const class Acl_change_notification *notice)
Definition: handler.h:1657
int(*)(handlerton *hton, THD *thd, const uchar *loc, uint loc_len, uint task_id, int in_err, Ha_clone_cbk *cbk) Clone_apply_t
Apply data to destination database in chunks via callback.
Definition: handler.h:2239
TYPELIB tx_isolation_typelib
Definition: handler.cc:293
handlerton * ha_default_temp_handlerton(THD *thd)
Return the default storage engine handlerton used for explicitly created temp tables for a thread.
Definition: handler.cc:370
bool(* collect_hton_log_info_t)(handlerton *hton, Json_dom *json)
Collect a handlerton (resource) log information.
Definition: handler.h:2307
int(*)(handlerton *hton, THD *thd) set_prepared_in_tc_t
Instructs the storage engine to mark the externally coordinated transactions held by the THD paramete...
Definition: handler.h:1401
void ha_reset_slave(THD *thd)
Definition: handler.cc:5821
void ha_end()
Definition: handler.cc:914
static enum legacy_db_type ha_legacy_type(const handlerton *db_type)
Definition: handler.h:7175
int(*)(handlerton *hton, THD *thd, const uchar *loc, uint loc_len, uint task_id, int in_err) Clone_end_t
End copy from source database.
Definition: handler.h:2212
int ha_release_savepoint(THD *thd, SAVEPOINT *sv)
Definition: handler.cc:2373
static const uint MYSQL_START_TRANS_OPT_READ_WRITE
Definition: handler.h:636
int(*)(uint64_t *stop_id) page_track_stop_t
Stop page tracking.
Definition: handler.h:2532
bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat)
Definition: handler.cc:7647
bool(* unlock_hton_log_t)(handlerton *hton)
Unlock a handlerton (resource) log after collecting log information.
Definition: handler.h:2301
constexpr const uint64_t HA_CREATE_USED_ENGINE_ATTRIBUTE
Definition: handler.h:788
void(* se_before_rollback_t)(void *arg)
Definition: handler.h:2503
int(*)(Page_Track_Callback cbk_func, void *cbk_ctx, uint64_t *start_id, uint64_t *stop_id, unsigned char *buffer, size_t buffer_len) page_track_get_page_ids_t
Fetch tracked pages.
Definition: handler.h:2571
plugin_ref ha_resolve_by_name_raw(THD *thd, const LEX_CSTRING &name)
Resolve handlerton plugin by name, without checking for "DEFAULT" or HTON_NOT_USER_SELECTABLE.
Definition: handler.cc:387
#define HA_ADMIN_NOT_IMPLEMENTED
Definition: handler.h:175
bool(* is_supported_system_table_t)(const char *db, const char *table_name, bool is_sql_layer_system_table)
Check if the given db.tablename is a system table for this SE.
Definition: handler.h:1704
bool ha_rm_tmp_tables(THD *thd, List< LEX_STRING > *files)
Ask all SEs to drop all temporary tables which have been left from previous server run.
Definition: handler.cc:5527
bool(*)(THD *thd, LEX *lex) prepare_secondary_engine_t
Prepare the secondary engine for executing a statement.
Definition: handler.h:2340
#define HA_CAN_REPAIR
Definition: handler.h:369
bool ha_check_if_supported_system_table(handlerton *hton, const char *db, const char *table_name)
Check if a given table is a system table.
Definition: handler.cc:5407
int ha_commit_attachable(THD *thd)
Commit the attachable transaction in storage engines.
Definition: handler.cc:2142
bool ha_secondary_engine_supports_ddl(THD *thd, const LEX_CSTRING &secondary_engine) noexcept
Definition: handler.cc:437
xa_status_code(*)(handlerton *hton, XID *xid) set_prepared_in_tc_by_xid_t
Instructs the storage engine to mark the externally coordinated transactions identified by the XID pa...
Definition: handler.h:1461
int(* close_connection_t)(handlerton *hton, THD *thd)
close_connection is only called if thd->ha_data[xxx_hton.slot] is non-zero, so even if you don't need...
Definition: handler.h:1341
const char * tx_isolation_names[]
Definition: handler.cc:291
TYPELIB * ha_known_exts()
Definition: handler.cc:7602
bool(* sdi_create_t)(dd::Tablespace *tablespace)
Create SDI in a tablespace.
Definition: handler.h:1715
bool(* dict_init_t)(dict_init_mode_t dict_init_mode, uint version, List< const Plugin_table > *DDSE_tables, List< const Plugin_tablespace > *DDSE_tablespaces)
Initialize the SE for being used to store the DD tables.
Definition: handler.h:1893
int(* panic_t)(handlerton *hton, enum ha_panic_function flag)
Definition: handler.h:1478
constexpr const uint64_t HA_CREATE_USED_SECONDARY_ENGINE_ATTRIBUTE
Definition: handler.h:789
void ha_drop_database(char *path)
Definition: handler.cc:927
int(* get_tablespace_t)(THD *thd, LEX_CSTRING db_name, LEX_CSTRING table_name, LEX_CSTRING *tablespace_name)
Get the tablespace name from the SE for the given schema and table.
Definition: handler.h:1532
static bool ha_check_storage_engine_flag(const handlerton *db_type, uint32 flag)
Definition: handler.h:7181
int ha_prepare_low(THD *thd, bool all)
Prepares the underlying transaction of the THD session object parameter in the storage engines that p...
Definition: handler.cc:2288
ha_ddl_type
Definition: handler.h:933
@ HA_TRUNCATE_DDL
Definition: handler.h:936
@ HA_INVALID_DDL
Definition: handler.h:934
@ HA_ALTER_DDL
Definition: handler.h:935
@ HA_RENAME_DDL
Definition: handler.h:937
int ha_init_key_cache(std::string_view name, KEY_CACHE *key_cache)
Init a key cache if it has not been initied before.
Definition: handler.cc:5584
uint64_t SecondaryEngineFlags
Definition: handler.h:2458
int(* finish_upgrade_t)(THD *thd, bool failed_upgrade)
Finish upgrade process inside storage engines.
Definition: handler.h:1599
void(*)(std::vector< std::pair< uint64_t, bool > > &status) page_track_get_status_t
Fetch the status of the page tracking system.
Definition: handler.h:2598
bool(* rm_tmp_tables_t)(handlerton *hton, THD *thd, List< LEX_STRING > *files)
Drop all temporary tables which have been left from previous server run belonging to this SE.
Definition: handler.h:1813
static const uint32 HTON_FKS_WITH_SUPPORTING_HASH_KEYS
Storage engine supports hash keys as supporting keys for foreign keys.
Definition: handler.h:2981
static const uint MYSQL_START_TRANS_OPT_HIGH_PRIORITY
Definition: handler.h:638
int ha_binlog_index_purge_file(THD *thd, const char *file)
Definition: handler.cc:5831
#define HTON_SECONDARY_ENGINE_SUPPORTS_DDL
Whether the secondary engine supports DDLs.
Definition: handler.h:2935
bool(* get_index_column_cardinality_t)(const char *db_name, const char *table_name, const char *index_name, uint index_ordinal_position, uint column_ordinal_position, dd::Object_id se_private_id, ulonglong *cardinality)
Retrieve index column cardinality from SE.
Definition: handler.h:2136
bool default_rm_tmp_tables(handlerton *hton, THD *thd, List< LEX_STRING > *files)
Default implementation for handlerton::rm_tmp_tables() method which simply removes all files from "fi...
Definition: handler.cc:5539
enum_alter_inplace_result
Return values for check_if_supported_inplace_alter().
Definition: handler.h:197
@ HA_ALTER_INPLACE_NOT_SUPPORTED
Definition: handler.h:199
@ HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE
Definition: handler.h:203
@ HA_ALTER_INPLACE_INSTANT
Definition: handler.h:205
@ HA_ALTER_INPLACE_SHARED_LOCK
Definition: handler.h:202
@ HA_ALTER_INPLACE_NO_LOCK
Definition: handler.h:204
@ HA_ALTER_INPLACE_EXCLUSIVE_LOCK
Definition: handler.h:200
@ HA_ALTER_ERROR
Definition: handler.h:198
@ HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE
Definition: handler.h:201
constexpr const decltype(handlerton::flags) HTON_SUPPORTS_ENGINE_ATTRIBUTE
Definition: handler.h:2926
bool Log_func(THD *, TABLE *, bool, const uchar *, const uchar *)
Definition: handler.h:7237
void(*)(THD *thd, const char *) set_secondary_engine_offload_fail_reason_t
Sets a specific secondary engine offload failure reason for a query represented by the thread context...
Definition: handler.h:2455
static const uint MYSQL_START_TRANS_OPT_READ_ONLY
Definition: handler.h:634
void(* kill_connection_t)(handlerton *hton, THD *thd)
Terminate connection/statement notification.
Definition: handler.h:1344
uint calculate_key_len(TABLE *table, uint key, key_part_map keypart_map)
Calculates length of key.
Definition: handler.cc:7556
int(* prepare_t)(handlerton *hton, THD *thd, bool all)
Definition: handler.h:1386
bool(* sdi_drop_t)(dd::Tablespace *tablespace)
Drop SDI in a tablespace.
Definition: handler.h:1724
void print_keydup_error(TABLE *table, KEY *key, const char *msg, myf errflag, const char *org_table_name)
Construct and emit duplicate key error message using information from table's record buffer.
Definition: handler.cc:4065
int ha_init(void)
Definition: handler.cc:899
int(* alter_tablespace_t)(handlerton *hton, THD *thd, st_alter_tablespace *ts_info, const dd::Tablespace *old_ts_def, dd::Tablespace *new_ts_def)
Create/drop or alter tablespace in the storage engine.
Definition: handler.h:1554
int ha_enable_transaction(THD *thd, bool on)
Tell the storage engine that it is allowed to "disable transaction" in the handler.
Definition: handler.cc:5093
bool secondary_engine_supports_ddl(const handlerton *hton)
Definition: handler.h:2948
Ha_clone_type
Clone operation types.
Definition: handler.h:959
@ HA_CLONE_BLOCKING
Caller must block all write operation to the SE.
Definition: handler.h:961
@ HA_CLONE_RESTART
SE supports restarting clone after network failure.
Definition: handler.h:977
@ HA_CLONE_HYBRID
For transactional SE, use both page tracking and redo to optimize clone with concurrent dml.
Definition: handler.h:971
@ HA_CLONE_MULTI_TASK
SE supports multiple threads for clone.
Definition: handler.h:974
@ HA_CLONE_TYPE_MAX
Maximum value of clone type.
Definition: handler.h:980
@ HA_CLONE_PAGE
For transactional SE, track page changes to support concurrent dml.
Definition: handler.h:967
@ HA_CLONE_REDO
For transactional SE, archive redo to support concurrent dml.
Definition: handler.h:964
enum_schema_tables
Definition: handler.h:913
@ SCH_OPTIMIZER_TRACE
Definition: handler.h:918
@ SCH_ENGINES
Definition: handler.h:916
@ SCH_TABLE_PRIVILEGES
Definition: handler.h:924
@ SCH_COLUMN_PRIVILEGES
Definition: handler.h:915
@ SCH_SCHEMA_PRIVILEGES
Definition: handler.h:922
@ SCH_PLUGINS
Definition: handler.h:919
@ SCH_PROFILES
Definition: handler.h:921
@ SCH_LAST
Definition: handler.h:928
@ SCH_TMP_TABLE_KEYS
Definition: handler.h:927
@ SCH_TABLESPACES
Definition: handler.h:923
@ SCH_USER_PRIVILEGES
Definition: handler.h:925
@ SCH_PROCESSLIST
Definition: handler.h:920
@ SCH_OPEN_TABLES
Definition: handler.h:917
@ SCH_TMP_TABLE_COLUMNS
Definition: handler.h:926
@ SCH_FIRST
Definition: handler.h:914
constexpr const uint64_t HA_CREATE_USED_AUTOEXTEND_SIZE
These flags convey that the options AUTOEXTEND_SIZE has been specified in the CREATE TABLE statement.
Definition: handler.h:802
bool(* get_tablespace_type_by_name_t)(const char *tablespace_name, Tablespace_type *space_type)
Get the tablespace type given the name, from the SE.
Definition: handler.h:1643
bool ha_check_if_table_exists(THD *thd, const char *db, const char *name, bool *exists)
Try to find a table in a storage engine.
Definition: handler.cc:5344
std::vector< sdi_key_t > sdi_container
Definition: handler.h:134
st_plugin_int * hton2plugin(uint slot)
Maps from slot to plugin. May return NULL if plugin has been unloaded.
Definition: handler.cc:238
st_plugin_int * insert_hton2plugin(uint slot, st_plugin_int *plugin)
For unit testing.
Definition: handler.cc:242
SecondaryEngineFlag
Definition: handler.h:2459
@ USE_EXTERNAL_EXECUTOR
This flag can be set to signal that a secondary storage engine will not use MySQL's executor (see JOI...
void ha_pre_dd_shutdown(void)
Invoke handlerton::pre_dd_shutdown() on every storage engine plugin.
Definition: handler.cc:979
void get_sweep_read_cost(TABLE *table, ha_rows nrows, bool interrupted, Cost_estimate *cost)
Get cost of reading nrows table records in a "disk sweep".
Definition: handler.cc:7202
constexpr const decltype(handlerton::flags) HTON_SUPPORTS_GENERATED_INVISIBLE_PK
Engine supports Generated invisible primary key.
Definition: handler.h:2931
bool(* get_tablespace_type_t)(const dd::Tablespace &space, Tablespace_type *space_type)
Get the tablespace type from the SE.
Definition: handler.h:1631
bool(* rotate_encryption_master_key_t)(void)
Initiate master key rotation.
Definition: handler.h:2079
void(* post_recover_t)(void)
Perform SE-specific cleanup after recovery of transactions.
Definition: handler.h:2289
bool(* notify_rename_table_t)(THD *thd, const MDL_key *mdl_key, ha_notification_type notification_type, const char *old_db_name, const char *old_table_name, const char *new_db_name, const char *new_table_name)
Notify/get permission from storage engine before or after execution of RENAME TABLE operation on the ...
Definition: handler.h:2052
int ha_commit_trans(THD *thd, bool all, bool ignore_global_read_lock=false)
Definition: handler.cc:1608
#define HTON_IS_SECONDARY_ENGINE
Engine is a secondary storage engine.
Definition: handler.h:2918
int(* start_consistent_snapshot_t)(handlerton *hton, THD *thd)
Definition: handler.h:1480
enum_stats_auto_recalc
Definition: handler.h:3035
@ HA_STATS_AUTO_RECALC_DEFAULT
Definition: handler.h:3036
@ HA_STATS_AUTO_RECALC_OFF
Definition: handler.h:3038
@ HA_STATS_AUTO_RECALC_ON
Definition: handler.h:3037
const char *(* get_tablespace_filename_ext_t)()
SE interface for getting tablespace extension.
Definition: handler.h:1563
ts_alter_tablespace_type
Definition: handler.h:845
@ TS_ALTER_TABLESPACE_TYPE_NOT_DEFINED
Definition: handler.h:846
@ ALTER_UNDO_TABLESPACE_SET_ACTIVE
Definition: handler.h:851
@ ALTER_UNDO_TABLESPACE_SET_INACTIVE
Definition: handler.h:852
@ ALTER_TABLESPACE_OPTIONS
Definition: handler.h:850
@ ALTER_TABLESPACE_DROP_FILE
Definition: handler.h:848
@ ALTER_TABLESPACE_RENAME
Definition: handler.h:849
@ ALTER_TABLESPACE_ADD_FILE
Definition: handler.h:847
void(* binlog_log_query_t)(handlerton *hton, THD *thd, enum_binlog_command binlog_command, const char *query, uint query_length, const char *db, const char *table_name)
Definition: handler.h:1652
xa_status_code(* commit_by_xid_t)(handlerton *hton, XID *xid)
Definition: handler.h:1451
bool is_index_access_error(int error)
Check whether an error is index access error or not after an index read.
Definition: handler.cc:8824
plugin_ref ha_resolve_by_name(THD *thd, const LEX_CSTRING *name, bool is_temp_table)
Return the storage engine handlerton for the supplied name.
Definition: handler.cc:402
void(* replace_native_transaction_in_thd_t)(THD *thd, void *new_trx_arg, void **ptr_trx_arg)
Definition: handler.h:1855
constexpr const uint64_t HA_CREATE_USED_READ_ONLY
ALTER SCHEMA|DATABASE has an explicit READ_ONLY clause.
Definition: handler.h:796
bool(* sdi_delete_t)(const dd::Tablespace &tablespace, const dd::Table *table, const sdi_key_t *sdi_key)
Delete SDI for a given SDI key.
Definition: handler.h:1789
bool(* get_tablespace_statistics_t)(const char *tablespace_name, const char *file_name, const dd::Properties &ts_se_private_data, ha_tablespace_statistics *stats)
Retrieve ha_tablespace_statistics from SE.
Definition: handler.h:2156
int(* discover_t)(handlerton *hton, THD *thd, const char *db, const char *name, uchar **frmblob, size_t *frmlen)
Definition: handler.h:1660
ulong total_ha_2pc
Definition: handler.cc:262
int(* table_exists_in_engine_t)(handlerton *hton, THD *thd, const char *db, const char *name)
Definition: handler.h:1667
enum_binlog_command
Definition: handler.h:696
@ LOGCOM_DROP_TABLE
Definition: handler.h:700
@ LOGCOM_CREATE_DB
Definition: handler.h:701
@ LOGCOM_DROP_DB
Definition: handler.h:703
@ LOGCOM_RENAME_TABLE
Definition: handler.h:699
@ LOGCOM_ALTER_TABLE
Definition: handler.h:698
@ LOGCOM_ALTER_DB
Definition: handler.h:702
@ LOGCOM_CREATE_TABLE
Definition: handler.h:697
static const uint32 HTON_FKS_NEED_DIFFERENT_PARENT_AND_SUPPORTING_KEYS
Storage engine does not support using the same key for both parent and supporting key,...
Definition: handler.h:3001
bool set_tx_isolation(THD *thd, enum_tx_isolation tx_isolation, bool one_shot)
Set the transaction isolation level for the next transaction and update session tracker information a...
Definition: handler.cc:8718
bool ha_is_storage_engine_disabled(handlerton *se_engine)
Definition: handler.cc:511
const char * ha_row_type[]
Definition: handler.cc:280
bool ha_notify_table_ddl(THD *thd, const MDL_key *mdl_key, ha_notification_type notification_type, ha_ddl_type ddl_type, const char *old_db_name, const char *old_table_name, const char *new_db_name, const char *new_table_name)
Notify/get permission from all interested storage engines before or after executed DDL (ALTER TABLE,...
Definition: handler.cc:8686
handlerton * ha_resolve_by_legacy_type(THD *thd, enum legacy_db_type db_type)
Definition: handler.cc:547
handler * get_new_handler(TABLE_SHARE *share, bool partitioned, MEM_ROOT *alloc, handlerton *db_type)
Create handler object for the table in the storage engine.
Definition: handler.cc:603
#define HA_PRIMARY_KEY_REQUIRED_FOR_POSITION
Definition: handler.h:289
enum_tx_isolation
Definition: handler.h:3028
@ ISO_READ_UNCOMMITTED
Definition: handler.h:3029
@ ISO_REPEATABLE_READ
Definition: handler.h:3031
@ ISO_READ_COMMITTED
Definition: handler.h:3030
@ ISO_SERIALIZABLE
Definition: handler.h:3032
bool(* notify_truncate_table_t)(THD *thd, const MDL_key *mdl_key, ha_notification_type notification_type)
Notify/get permission from storage engine before or after execution of TRUNCATE TABLE operation on th...
Definition: handler.h:2069
void(* pre_dd_shutdown_t)(handlerton *hton)
Shut down all storage engine background tasks that might access the data dictionary,...
Definition: handler.h:1350
const char * ha_resolve_storage_engine_name(const handlerton *db_type)
Definition: handler.cc:255
bool(* flush_logs_t)(handlerton *hton, bool binlog_group_flush)
Flush the log(s) of storage engine(s).
Definition: handler.h:1491
bool ha_check_reserved_db_name(const char *name)
Check if the database name is reserved word used by SE.
Definition: handler.cc:8807
const char * table_case_name(const HA_CREATE_INFO *info, const char *name)
Definition: handler.cc:4048
const char * get_canonical_filename(handler *file, const char *path, char *tmp_path)
make canonical filename
Definition: handler.cc:2468
bool(* dict_set_server_version_t)()
Store the current server version number into the header of the dictionary tablespace.
Definition: handler.h:1970
int ha_rollback_to_savepoint(THD *thd, SAVEPOINT *sv)
Definition: handler.cc:2227
int ha_panic(enum ha_panic_function flag)
int(* commit_t)(handlerton *hton, THD *thd, bool all)
'all' is true if it's a real commit, that makes persistent changes 'all' is false if it's not in fact...
Definition: handler.h:1382
int ha_recover(Xid_commit_list *commit_list=nullptr, Xa_state_list *xa_state_list=nullptr)
Stage of the recovery process where information is collected from the storage engines (SE),...
Definition: xa.cc:268
int ha_delete_table(THD *thd, handlerton *db_type, const char *path, const char *db, const char *alias, const dd::Table *table_def, bool generate_warning)
Delete table from the storage engine.
Definition: handler.cc:2515
static const uint32 HTON_FKS_WITH_EXTENDED_PARENT_KEYS
Engine takes into account hidden part of key (coming from primary key) when determines if it can serv...
Definition: handler.h:3012
row_type
Definition: handler.h:676
@ ROW_TYPE_COMPRESSED
Definition: handler.h:681
@ ROW_TYPE_REDUNDANT
Definition: handler.h:682
@ ROW_TYPE_NOT_USED
Definition: handler.h:677
@ ROW_TYPE_FIXED
Definition: handler.h:679
@ ROW_TYPE_PAGED
Unused.
Definition: handler.h:685
@ ROW_TYPE_DEFAULT
Definition: handler.h:678
@ ROW_TYPE_COMPACT
Definition: handler.h:683
@ ROW_TYPE_DYNAMIC
Definition: handler.h:680
bool() stat_print_fn(THD *thd, const char *type, size_t type_len, const char *file, size_t file_len, const char *status, size_t status_len)
Definition: handler.h:142
const handlerton * SecondaryEngineHandlerton(const THD *thd)
Returns the handlerton of the secondary engine that is used in the session, or nullptr if a secondary...
Definition: handler.cc:8774
static const LEX_CSTRING FK_NAME_DEFAULT_SUFFIX
Suffix for auto-generated foreign key names for tables in SE's which don't specify own suffix.
Definition: handler.h:3026
handlerton * ha_default_handlerton(THD *thd)
Return the default storage engine handlerton used for non-temp tables for thread.
Definition: handler.cc:346
int ha_savepoint(THD *thd, SAVEPOINT *sv)
Definition: handler.cc:2331
void ha_close_connection(THD *thd)
Definition: handler.cc:949
int(*)(handlerton *hton, THD *thd, const uchar *&loc, uint &loc_len, uint &task_id, Ha_clone_type type, Ha_clone_mode mode) Clone_begin_t
Begin copy from source database.
Definition: handler.h:2177
int(* upgrade_logs_t)(THD *thd)
Upgrade logs after the checkpoint from where upgrade process can only roll forward.
Definition: handler.h:1611
bool(* is_reserved_db_name_t)(handlerton *hton, const char *name)
Definition: handler.h:2326
int(* savepoint_rollback_t)(handlerton *hton, THD *thd, void *sv)
sv points to a storage area, that was earlier passed to the savepoint_set call
Definition: handler.h:1356
void(*)(Ha_clone_flagset &flags) Clone_capability_t
Get capability flags for clone operation.
Definition: handler.h:2164
int ha_binlog_end(THD *thd)
Definition: handler.cc:5877
const char * binlog_format_names[]
Definition: mysqld.cc:1313
constexpr const uint64_t HA_CREATE_USED_START_TRANSACTION
This option is used to convey that the create table should not commit the operation and keep the tran...
Definition: handler.h:786
int(*)(uint64_t *start_id, uint64_t *stop_id, uint64_t *num_pages) page_track_get_num_page_ids_t
Fetch approximate number of tracked pages in the given range.
Definition: handler.h:2592
int(*)(handlerton *hton, THD *thd, const uchar *loc, uint loc_len, uint task_id, Ha_clone_cbk *cbk) Clone_copy_t
Copy data from source database in chunks via callback.
Definition: handler.h:2188
xa_status_code
X/Open XA distributed transaction status codes.
Definition: handler.h:1404
@ XAER_ASYNC
asynchronous operation already outstanding
Definition: handler.h:1413
@ XAER_PROTO
routine invoked in an improper context
Definition: handler.h:1433
@ XAER_INVAL
invalid arguments were given
Definition: handler.h:1428
@ XAER_NOTA
the XID is not valid
Definition: handler.h:1423
@ XAER_OUTSIDE
resource manager doing work outside transaction
Definition: handler.h:1448
@ XAER_RMFAIL
resource manager unavailable
Definition: handler.h:1438
@ XA_OK
normal execution
Definition: handler.h:1408
@ XAER_DUPID
the XID already exists
Definition: handler.h:1443
@ XAER_RMERR
a resource manager error occurred in the transaction branch
Definition: handler.h:1418
void ha_binlog_wait(THD *thd)
Definition: handler.cc:5826
bool(* dict_get_server_version_t)(uint *version)
Get the server version id stored in the header of the dictionary tablespace.
Definition: handler.h:1962
int ha_start_consistent_snapshot(THD *thd)
Definition: handler.cc:2414
constexpr const uint32 SDI_TYPE_TABLESPACE
Id for identifying Tablespace SDIs.
Definition: handler.h:123
int(*)(handlerton *hton, THD *thd, const uchar *loc, uint loc_len, uint task_id, int in_err, Ha_clone_cbk *cbk) Clone_ack_t
Acknowledge data transfer to source database.
Definition: handler.h:2201
bool(* is_valid_tablespace_name_t)(ts_command_type ts_cmd, const char *tablespace_name)
SE specific validation of the tablespace name.
Definition: handler.h:1517
int ha_table_exists_in_engine(THD *thd, const char *db, const char *name)
Definition: handler.cc:5757
int(* upgrade_tablespace_t)(THD *thd)
Get the tablespace data from SE and insert it into Data dictionary.
Definition: handler.h:1574
bool(* notify_exclusive_mdl_t)(THD *thd, const MDL_key *mdl_key, ha_notification_type notification_type, bool *victimized)
Notify/get permission from storage engine before acquisition or after release of exclusive metadata l...
Definition: handler.h:2003
int ha_commit_low(THD *thd, bool all, bool run_after_commit=true)
Commit the sessions outstanding transaction.
Definition: handler.cc:1880
uint(* partition_flags_t)()
The flag values are defined in sql_partition.h.
Definition: handler.h:1503
bool ha_flush_logs(bool binlog_group_flush=false)
Flush the log(s) of storage engine(s).
Definition: handler.cc:2438
dict_recovery_mode_t
Mode for data dictionary recovery.
Definition: handler.h:1929
@ DICT_RECOVERY_RESTART_SERVER
Restart of an existing server.
Definition: handler.h:1932
@ DICT_RECOVERY_INITIALIZE_TABLESPACES
First start, create tablespaces.
Definition: handler.h:1931
@ DICT_RECOVERY_INITIALIZE_SERVER
First start of a new server.
Definition: handler.h:1930
bool(* sdi_get_keys_t)(const dd::Tablespace &tablespace, sdi_vector_t &vector)
Get the SDI keys in a tablespace into vector.
Definition: handler.h:1733
ulong savepoint_alloc_size
Definition: handler.cc:264
int(* fill_is_table_t)(handlerton *hton, THD *thd, Table_ref *tables, class Item *cond, enum enum_schema_tables)
Definition: handler.h:1646
int(* binlog_func_t)(handlerton *hton, THD *thd, enum_binlog_func fn, void *arg)
Definition: handler.h:1649
int ha_create_table_from_engine(THD *thd, const char *db, const char *name)
Try to discover table from engine.
Definition: handler.cc:5264
enum_binlog_func
Definition: handler.h:688
@ BFN_BINLOG_WAIT
Definition: handler.h:691
@ BFN_BINLOG_END
Definition: handler.h:692
@ BFN_RESET_SLAVE
Definition: handler.h:690
@ BFN_BINLOG_PURGE_FILE
Definition: handler.h:693
@ BFN_RESET_LOGS
Definition: handler.h:689
void set_externally_disabled_storage_engine_names(const char *)
Read a comma-separated list of storage engine names.
Definition: handler.cc:460
void(* se_after_commit_t)(void *arg)
Definition: handler.h:2499
bool(*)(THD *thd, const JoinHypergraph &hypergraph, AccessPath *access_path) secondary_engine_modify_access_path_cost_t
Evaluates the cost of executing the given access path in this secondary storage engine,...
Definition: handler.h:2429
int(* rollback_t)(handlerton *hton, THD *thd, bool all)
Definition: handler.h:1384
void(* dict_cache_reset_t)(const char *schema_name, const char *table_name)
Invalidate an entry in the local dictionary cache.
Definition: handler.h:1917
bool ha_rollback_to_savepoint_can_release_mdl(THD *thd)
Check if all storage engines used in transaction agree that after rollback to savepoint it is safe to...
Definition: handler.cc:2204
int binlog_log_row(TABLE *table, const uchar *before_record, const uchar *after_record, Log_func *log_func)
Definition: handler.cc:7832
void * range_seq_t
Definition: handler.h:3650
int ha_init_errors(void)
Register handler error messages for use with my_error().
Definition: handler.cc:638
bool(*)(THD *thd, const JOIN &join, double optimizer_cost, bool *use_best_so_far, bool *cheaper, double *secondary_engine_cost) compare_secondary_engine_cost_t
Compares the cost of two join plans in the secondary storage engine.
Definition: handler.h:2377
handlerton * get_default_handlerton(THD *thd, handlerton *hton)
Get default handlerton, if handler supplied is null.
Definition: handler.h:7167
int ha_rollback_trans(THD *thd, bool all)
Definition: handler.cc:2043
constexpr const ha_rows EXTRA_RECORDS
Definition: handler.h:117
enum_sampling_method
Definition: handler.h:706
int ha_reset_logs(THD *thd)
Definition: handler.cc:5815
bool ha_storage_engine_is_enabled(const handlerton *db_type)
Predicate to determine if a storage engine, represented by a handlerton*, is enabled.
Definition: handler.h:7195
dict_init_mode_t
Mode for initializing the data dictionary.
Definition: handler.h:1859
@ DICT_INIT_IGNORE_FILES
Don't care about files at all.
Definition: handler.h:1863
@ DICT_INIT_UPGRADE_57_FILES
Used for upgrade from mysql-5.7.
Definition: handler.h:1862
@ DICT_INIT_CREATE_FILES
Create all required SE files.
Definition: handler.h:1860
@ DICT_INIT_CHECK_FILES
Verify existence of expected files.
Definition: handler.h:1861
bool(* check_fk_column_compat_t)(const Ha_fk_column_type *child_column_type, const Ha_fk_column_type *parent_column_type, bool check_charsets)
Check SE considers types of child and parent columns in foreign key to be compatible.
Definition: handler.h:2322
constexpr SecondaryEngineFlags MakeSecondaryEngineFlags()
Creates an empty bitmap of access path types.
Definition: handler.h:2479
void(* drop_database_t)(handlerton *hton, char *path)
Definition: handler.h:1476
bool ha_is_externally_disabled(const handlerton &)
Returns true if the storage engine of the handlerton argument has been listed in the disabled_storage...
Definition: handler.cc:504
int(*)(handlerton *hton, Xa_state_list &xa_list) recover_prepared_in_tc_t
Retrieves information about externally coordinated transactions for which the two-phase prepare was f...
Definition: handler.h:1396
static const uint32 HTON_FKS_WITH_PREFIX_PARENT_KEYS
Engine supports both unique and non-unique parent keys for foreign keys which contain full foreign ke...
Definition: handler.h:2970
void(* dict_cache_reset_tables_and_tablespaces_t)()
Invalidate all table and tablespace entries in the local dictionary cache.
Definition: handler.h:1926
#define HA_NO_TRANSACTIONS
Definition: handler.h:210
void(* post_ddl_t)(THD *thd)
Perform post-commit/rollback cleanup after DDL statement (e.g.
Definition: handler.h:2280
bool ddl_is_atomic(const handlerton *hton)
Definition: handler.h:2954
ulonglong my_xid
Definition: handler.h:1227
legacy_db_type
Definition: handler.h:640
@ DB_TYPE_MARIA
Definition: handler.h:668
@ DB_TYPE_FEDERATED_DB
Definition: handler.h:659
@ DB_TYPE_GEMINI
Definition: handler.h:654
@ DB_TYPE_FIRST_DYNAMIC
Definition: handler.h:672
@ DB_TYPE_MISAM
Definition: handler.h:644
@ DB_TYPE_HEAP
Definition: handler.h:647
@ DB_TYPE_TABLE_FUNCTION
Definition: handler.h:665
@ DB_TYPE_DIAB_ISAM
Definition: handler.h:642
@ DB_TYPE_TEMPTABLE
Definition: handler.h:671
@ DB_TYPE_HASH
Definition: handler.h:643
@ DB_TYPE_PARTITION_DB
Definition: handler.h:661
@ DB_TYPE_BINLOG
Definition: handler.h:662
@ DB_TYPE_SOLID
Definition: handler.h:663
@ DB_TYPE_UNKNOWN
Definition: handler.h:641
@ DB_TYPE_ISAM
Definition: handler.h:648
@ DB_TYPE_MRG_MYISAM
Definition: handler.h:651
@ DB_TYPE_PERFORMANCE_SCHEMA
Performance schema engine.
Definition: handler.h:670
@ DB_TYPE_EXAMPLE_DB
Definition: handler.h:656
@ DB_TYPE_CSV_DB
Definition: handler.h:658
@ DB_TYPE_NDBCLUSTER
Definition: handler.h:655
@ DB_TYPE_INNODB
Definition: handler.h:653
@ DB_TYPE_FALCON
Definition: handler.h:667
@ DB_TYPE_DEFAULT
Definition: handler.h:673
@ DB_TYPE_BLACKHOLE_DB
Definition: handler.h:660
@ DB_TYPE_MYISAM
Definition: handler.h:650
@ DB_TYPE_RMS_ISAM
Definition: handler.h:646
@ DB_TYPE_BERKELEY_DB
Definition: handler.h:652
@ DB_TYPE_MRG_ISAM
Definition: handler.h:649
@ DB_TYPE_PBXT
Definition: handler.h:664
@ DB_TYPE_PISAM
Definition: handler.h:645
@ DB_TYPE_ARCHIVE_DB
Definition: handler.h:657
@ DB_TYPE_MEMCACHE
Definition: handler.h:666
void(* se_before_commit_t)(void *arg)
Definition: handler.h:2495
int ha_initialize_handlerton(st_plugin_int *plugin)
Definition: handler.cc:773
ha_notification_type
Definition: handler.h:932
@ HA_NOTIFY_POST_EVENT
Definition: handler.h:932
@ HA_NOTIFY_PRE_EVENT
Definition: handler.h:932
bool(* upgrade_space_version_t)(dd::Tablespace *tablespace)
Get the tablespace data from SE and insert it into Data dictionary.
Definition: handler.h:1585
Tablespace_type
Definition: handler.h:1613
xa_status_code(* rollback_by_xid_t)(handlerton *hton, XID *xid)
Definition: handler.h:1453
void ha_binlog_log_query(THD *thd, handlerton *db_type, enum_binlog_command binlog_command, const char *query, size_t query_length, const char *db, const char *table_name)
Definition: handler.cc:5860
handler *(* create_t)(handlerton *hton, TABLE_SHARE *table, bool partitioned, MEM_ROOT *mem_root)
Create handler object for the table in the storage engine.
Definition: handler.h:1473
void ha_acl_notify(THD *thd, class Acl_change_notification *)
Definition: handler.cc:5891
SE_cost_constants *(* get_cost_constants_t)(uint storage_category)
Retrieve cost constants to be used for this storage engine.
Definition: handler.h:1840
static bool commit(THD *thd)
Commit the current statement and transaction.
Definition: sql_cmd_srs.cc:152
File containing constants that can be used throughout the server.
SHOW_COMP_OPTION
Definition: sql_const.h:228
@ SHOW_OPTION_YES
Definition: sql_const.h:228
constexpr const unsigned int MAX_KEY
Definition: sql_const.h:46
constexpr const unsigned int MAX_REF_PARTS
Definition: sql_const.h:47
constexpr const unsigned int MAX_KEY_LENGTH
Definition: sql_const.h:48
case opt name
Definition: sslopt-case.h:33
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:193
Definition: m_ctype.h:385
Definition: handler.h:2252
Clone_apply_t clone_apply
Definition: handler.h:2264
Clone_end_t clone_end
Definition: handler.h:2260
Clone_capability_t clone_capability
Definition: handler.h:2254
Clone_apply_begin_t clone_apply_begin
Definition: handler.h:2263
Clone_begin_t clone_begin
Definition: handler.h:2257
Clone_copy_t clone_copy
Definition: handler.h:2258
Clone_apply_end_t clone_apply_end
Definition: handler.h:2265
Clone_ack_t clone_ack
Definition: handler.h:2259
Definition: ft_global.h:72
Definition: handler.h:3644
uchar * buffer_end
Definition: handler.h:3646
uchar * buffer
Definition: handler.h:3645
uchar * end_of_used_area
Definition: handler.h:3647
Definition: handler.h:3631
KEY_CACHE * key_cache
Definition: handler.h:3634
uint sql_flags
Definition: handler.h:3633
uint flags
Definition: handler.h:3632
Struct to hold information about the table that should be created.
Definition: handler.h:3044
ulonglong auto_increment_value
Definition: handler.h:3083
bool m_hidden
Definition: handler.h:3115
bool m_transactional_ddl
Definition: handler.h:3121
bool m_implicit_tablespace_autoextend_size_change
Definition: handler.h:3128
handlerton * db_type
Definition: handler.h:3094
LEX_STRING compress
Algorithm (and possible options) to be used for InnoDB's transparent page compression.
Definition: handler.h:3060
LEX_STRING encrypt_type
This attribute is used for InnoDB's transparent page encryption.
Definition: handler.h:3068
LEX_CSTRING engine_attribute
Definition: handler.h:3123
ulong avg_row_length
Definition: handler.h:3085
const CHARSET_INFO * table_charset
Definition: handler.h:3045
const char * data_file_name
Definition: handler.h:3078
ulonglong m_implicit_tablespace_autoextend_size
Definition: handler.h:3126
bool secondary_load
Secondary engine load status.
Definition: handler.h:3076
ulong table_options
Definition: handler.h:3084
const CHARSET_INFO * default_table_charset
Definition: handler.h:3046
uint stats_sample_pages
Definition: handler.h:3090
const char * alias
Definition: handler.h:3080
uint null_bits
Definition: handler.h:3105
uint merge_insert_method
Definition: handler.h:3107
LEX_STRING connect_string
Definition: handler.h:3048
const char * tablespace
Definition: handler.h:3050
ulonglong max_rows
Definition: handler.h:3081
void init_create_options_from_share(const TABLE_SHARE *share, uint64_t used_fields)
Fill HA_CREATE_INFO to be used by ALTER as well as upgrade code.
Definition: handler.cc:2583
const char * password
Definition: handler.h:3049
ha_storage_media storage_media
Definition: handler.h:3108
LEX_STRING comment
Definition: handler.h:3051
const char * index_file_name
Definition: handler.h:3079
SQL_I_List< Table_ref > merge_list
Definition: handler.h:3093
std::uint32_t key_block_size
Definition: handler.h:3089
LEX_CSTRING secondary_engine_attribute
Definition: handler.h:3124
LEX_CSTRING secondary_engine
Secondary engine of the table.
Definition: handler.h:3074
ulonglong min_rows
Definition: handler.h:3082
uint64_t used_fields
Definition: handler.h:3086
bool schema_read_only
Definition: handler.h:3047
enum_stats_auto_recalc stats_auto_recalc
Definition: handler.h:3092
File reference for clone.
Definition: handler.h:989
@ FILE_DESC
File descriptor.
Definition: handler.h:996
@ FILE_HANDLE
File handle.
Definition: handler.h:993
enum Ha_clone_file::@47 type
File reference type.
void * file_handle
File handle for windows.
Definition: handler.h:1006
int file_desc
File descriptor.
Definition: handler.h:1003
Column type description for foreign key columns compatibility check.
Definition: handler.h:1214
size_t elements_count
Definition: handler.h:1222
bool is_unsigned
Definition: handler.h:1224
size_t char_length
Definition: handler.h:1220
const CHARSET_INFO * field_charset
Definition: handler.h:1221
uint numeric_scale
Definition: handler.h:1223
dd::enum_column_types type
Definition: handler.h:1215
A struct containing a join hypergraph of a single query block, encapsulating the constraints given by...
Definition: make_join_hypergraph.h:77
Definition: keycache.h:73
Definition: my_base.h:1131
Structure describing changes to an index to be caused by ALTER TABLE.
Definition: handler.h:3150
KEY * new_key
Pointer to KEY object describing new version of index in Alter_inplace_info::key_info_buffer array.
Definition: handler.h:3161
KEY * old_key
Pointer to KEY object describing old version of index in TABLE::key_info array for TABLE instance rep...
Definition: handler.h:3156
The LEX object currently serves three different purposes:
Definition: sql_lex.h:3709
Metadata lock object key.
Definition: mdl.h:365
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: mysql_lex_string.h:40
Definition: mysql_lex_string.h:35
Definition: my_bitmap.h:43
State data storage for start_table_io_wait_v1_t, start_table_lock_wait_v1_t.
Definition: psi_table_bits.h:69
Page track interface.
Definition: handler.h:2601
page_track_get_num_page_ids_t get_num_page_ids
Definition: handler.h:2606
page_track_purge_t purge
Definition: handler.h:2604
page_track_start_t start
Definition: handler.h:2602
page_track_stop_t stop
Definition: handler.h:2603
page_track_get_status_t get_status
Definition: handler.h:2607
page_track_get_page_ids_t get_page_ids
Definition: handler.h:2605
Definition: handler.h:3652
range_seq_t(* init)(void *init_params, uint n_ranges, uint flags)
Definition: handler.h:3665
uint(* next)(range_seq_t seq, KEY_MULTI_RANGE *range)
Definition: handler.h:3679
bool(* skip_record)(range_seq_t seq, char *range_info, uchar *rowid)
Definition: handler.h:3696
Definition: transaction_info.h:44
Per thread status variables.
Definition: system_variables.h:511
This structure is shared between different table objects.
Definition: table.h:689
Definition: table.h:1398
Definition: thr_lock.h:124
Definition: typelib.h:35
Structure used by parser to store options for tablespace statements and pass them on to Execution cla...
Definition: sql_tablespace.h:43
Info about FULLTEXT index hints, passed to the storage engine.
Definition: ft_global.h:117
double op_value
Operation value.
Definition: ft_global.h:123
ha_rows limit
LIMIT value, HA_POS_ERROR if not set.
Definition: ft_global.h:125
enum ft_operation op_type
Operation type.
Definition: ft_global.h:121
uint flags
FULLTEXT flags, see FT_NL, etc.
Definition: ft_global.h:119
handlerton is a singleton structure - one instance per storage engine - to provide access to storage ...
Definition: handler.h:2621
sdi_get_keys_t sdi_get_keys
Definition: handler.h:2723
sdi_drop_t sdi_drop
Definition: handler.h:2722
unlock_hton_log_t unlock_hton_log
Definition: handler.h:2780
notify_alter_table_t notify_alter_table
Definition: handler.h:2754
dict_cache_reset_t dict_cache_reset
Definition: handler.h:2692
void * data
Location for engines to keep personal structures.
Definition: handler.h:2773
set_prepared_in_tc_by_xid_t set_prepared_in_tc_by_xid
Definition: handler.h:2670
se_before_rollback_t se_before_rollback
Definition: handler.h:2855
sdi_set_t sdi_set
Definition: handler.h:2725
lock_hton_log_t lock_hton_log
Definition: handler.h:2779
is_dict_readonly_t is_dict_readonly
Definition: handler.h:2749
alter_tablespace_t alter_tablespace
Definition: handler.h:2680
finish_upgrade_t finish_upgrade
Definition: handler.h:2687
create_t create
Definition: handler.h:2671
collect_hton_log_info_t collect_hton_log_info
Definition: handler.h:2781
dict_register_dd_table_id_t dict_register_dd_table_id
Definition: handler.h:2691
redo_log_set_state_t redo_log_set_state
Definition: handler.h:2758
find_files_t find_files
Definition: handler.h:2712
ddse_dict_init_t ddse_dict_init
Definition: handler.h:2690
replace_native_transaction_in_thd_t replace_native_transaction_in_thd
Definition: handler.h:2752
LEX_CSTRING fk_name_suffix
Suffix for auto-generated foreign key names for tables using this storage engine.
Definition: handler.h:2796
pre_dd_shutdown_t pre_dd_shutdown
Definition: handler.h:2657
check_fk_column_compat_t check_fk_column_compat
Definition: handler.h:2786
SecondaryEngineFlags secondary_engine_flags
Bitmap which contains the supported join types and other flags for a secondary storage engine when us...
Definition: handler.h:2827
uint32 license
Flag for Engine License.
Definition: handler.h:2771
is_supported_system_table_t is_supported_system_table
Definition: handler.h:2715
secondary_engine_modify_access_path_cost_t secondary_engine_modify_access_path_cost
Pointer to a function that evaluates the cost of executing an access path in a secondary storage engi...
Definition: handler.h:2834
commit_t commit
Definition: handler.h:2662
get_tablespace_statistics_t get_tablespace_statistics
Definition: handler.h:2762
se_after_commit_t se_after_commit
Definition: handler.h:2854
savepoint_set_t savepoint_set
Definition: handler.h:2658
uint savepoint_offset
To store per-savepoint data storage engine is provided with an area of a requested size (0 is ok here...
Definition: handler.h:2651
drop_database_t drop_database
Definition: handler.h:2672
savepoint_release_t savepoint_release
Definition: handler.h:2661
enum legacy_db_type db_type
Historical number used for frm file to determine the correct storage engine.
Definition: handler.h:2631
is_valid_tablespace_name_t is_valid_tablespace_name
Definition: handler.h:2678
se_before_commit_t se_before_commit
Definition: handler.h:2853
flush_logs_t flush_logs
Definition: handler.h:2675
uint slot
Each storage engine has it's own memory area (actually a pointer) in the thd, for storing per-connect...
Definition: handler.h:2641
dict_get_server_version_t dict_get_server_version
Definition: handler.h:2696
get_tablespace_type_t get_tablespace_type
Definition: handler.h:2684
close_connection_t close_connection
Definition: handler.h:2655
rotate_encryption_master_key_t rotate_encryption_master_key
Definition: handler.h:2757
notify_truncate_table_t notify_truncate_table
Definition: handler.h:2756
start_consistent_snapshot_t start_consistent_snapshot
Definition: handler.h:2674
savepoint_rollback_t savepoint_rollback
Definition: handler.h:2659
fill_is_table_t fill_is_table
Definition: handler.h:2688
binlog_func_t binlog_func
Definition: handler.h:2708
optimize_secondary_engine_t optimize_secondary_engine
Pointer to a function that optimizes the current statement for execution on the secondary storage eng...
Definition: handler.h:2813
notify_exclusive_mdl_t notify_exclusive_mdl
Definition: handler.h:2753
get_cost_constants_t get_cost_constants
Definition: handler.h:2751
set_secondary_engine_offload_fail_reason_t set_secondary_engine_offload_fail_reason
Pointer to a function that sets the offload failure reason as a string for a thread context (represen...
Definition: handler.h:2851
rollback_by_xid_t rollback_by_xid
Definition: handler.h:2668
sdi_delete_t sdi_delete
Definition: handler.h:2726
get_index_column_cardinality_t get_index_column_cardinality
Definition: handler.h:2761
rollback_t rollback
Definition: handler.h:2663
dict_recover_t dict_recover
Definition: handler.h:2695
rm_tmp_tables_t rm_tmp_tables
Definition: handler.h:2750
prepare_secondary_engine_t prepare_secondary_engine
Pointer to a function that prepares a secondary engine for executing a statement.
Definition: handler.h:2804
get_table_statistics_t get_table_statistics
Definition: handler.h:2760
Page_track_t page_track
Page tracking interface.
Definition: handler.h:2858
sdi_create_t sdi_create
Definition: handler.h:2721
dict_init_t dict_init
Definition: handler.h:2689
uint32 foreign_keys_flags
Flags describing details of foreign key support by storage engine.
Definition: handler.h:2784
binlog_log_query_t binlog_log_query
Definition: handler.h:2709
get_tablespace_filename_ext_t get_tablespace_filename_ext
Definition: handler.h:2681
upgrade_logs_t upgrade_logs
Definition: handler.h:2686
get_secondary_engine_offload_or_exec_fail_reason_t get_secondary_engine_offload_or_exec_fail_reason
Pointer to a function that returns the query offload or exec failure reason as a string given a threa...
Definition: handler.h:2843
partition_flags_t partition_flags
Definition: handler.h:2677
const char ** file_extensions
Null-ended array of file extensions that exist for the storage engine.
Definition: handler.h:2747
dict_cache_reset_tables_and_tablespaces_t dict_cache_reset_tables_and_tablespaces
Definition: handler.h:2694
push_to_engine_t push_to_engine
Definition: handler.h:2714
Clone_interface_t clone_interface
Clone data transfer interfaces.
Definition: handler.h:2768
recover_prepared_in_tc_t recover_prepared_in_tc
Definition: handler.h:2666
discover_t discover
Definition: handler.h:2711
table_exists_in_engine_t table_exists_in_engine
Definition: handler.h:2713
upgrade_tablespace_t upgrade_tablespace
Definition: handler.h:2682
sdi_get_t sdi_get
Definition: handler.h:2724
get_tablespace_type_by_name_t get_tablespace_type_by_name
Definition: handler.h:2685
get_tablespace_t get_tablespace
Definition: handler.h:2679
dict_set_server_version_t dict_set_server_version
Definition: handler.h:2697
recover_t recover
Definition: handler.h:2665
SHOW_COMP_OPTION state
Historical marker for if the engine is available or not.
Definition: handler.h:2625
post_recover_t post_recover
Definition: handler.h:2765
uint32 flags
Global handler flags.
Definition: handler.h:2701
upgrade_space_version_t upgrade_space_version
Definition: handler.h:2683
kill_connection_t kill_connection
Definition: handler.h:2656
prepare_t prepare
Definition: handler.h:2664
panic_t panic
Definition: handler.h:2673
post_ddl_t post_ddl
Definition: handler.h:2764
compare_secondary_engine_cost_t compare_secondary_engine_cost
Pointer to a function that estimates the cost of executing a join in a secondary storage engine.
Definition: handler.h:2821
commit_by_xid_t commit_by_xid
Definition: handler.h:2667
set_prepared_in_tc_t set_prepared_in_tc
Definition: handler.h:2669
acl_notify_t acl_notify
Definition: handler.h:2710
show_status_t show_status
Definition: handler.h:2676
is_reserved_db_name_t is_reserved_db_name
Definition: handler.h:2698
savepoint_rollback_can_release_mdl_t savepoint_rollback_can_release_mdl
Definition: handler.h:2660
notify_rename_table_t notify_rename_table
Definition: handler.h:2755
Definition: my_base.h:1124
Definition: gen_lex_token.cc:149
Definition: result.h:30
Key to identify a dictionary object.
Definition: handler.h:126
uint32 type
Type of Object, For ex: column, index, etc.
Definition: handler.h:128
uint64 id
Object id which should be unique in tablespsace.
Definition: handler.h:131
Definition: handler.h:135
sdi_container m_vec
Definition: handler.h:136
Definition: handler.h:812
const char * db
Definition: handler.h:813
const char * tablename
Definition: handler.h:814
Definition: sql_plugin_ref.h:45
Plain structure to store information about XA transaction id and a list of table names involved into ...
Definition: xa.h:290
Definition: mysqlslap.cc:238
struct xid_t is binary compatible with the XID structure as in the X/Open CAE Specification,...
Definition: xa.h:83
thr_lock_type
Definition: thr_lock.h:51
Include file for Sun RPC to compile out of the box.
unsigned int uint
Definition: uca9-dump.cc:75
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:510
static uint64_t cache_size
Definition: xcom_cache.cc:362
static int all(site_def const *s, node_no node)
Definition: xcom_transport.cc:871