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