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