MySQL 8.0.39
Source Code Documentation
dict0dd.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2015, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/dict0dd.h
29Data dictionary interface */
30
31#ifndef dict0dd_h
32#define dict0dd_h
33
34#include "dict0dict.h"
35#include "dict0mem.h"
36#include "dict0types.h"
37#include "my_compiler.h"
38#include "univ.i"
39
40#ifndef UNIV_HOTBACKUP
42#include "dd/dd.h"
43#include "dd/dd_schema.h"
44#include "dd/dd_table.h"
45#include "dd/dictionary.h"
46#include "dd/properties.h"
47#include "dd/types/column.h"
50#include "dd/types/index.h"
52#include "dd/types/partition.h"
54#include "dd/types/table.h"
55#include "dd/types/tablespace.h"
57#include "dd_table_share.h"
58#include "sess0sess.h"
59#else
60#include "mysql_com.h"
61#endif /* !UNIV_HOTBACKUP */
62#include "mysql_version.h"
63
64#ifndef UNIV_HOTBACKUP
65class THD;
66class MDL_ticket;
67
68/** DD functions return false for success and true for failure
69because that is the way the server functions are defined. */
70constexpr bool DD_SUCCESS = false;
71constexpr bool DD_FAILURE = true;
72
73/** Handler name for InnoDB */
74static constexpr char handler_name[] = "InnoDB";
75
76static const char innobase_hton_name[] = "InnoDB";
77
78/** String constant for AUTOEXTEND_SIZE option string */
79static constexpr char autoextend_size_str[] = "autoextend_size";
80
81/** Determine if give version is a valid row version */
82bool dd_is_valid_row_version(uint32_t version);
83
84/** Determine if column is INSTANT ADD */
85bool dd_column_is_added(const dd::Column *dd_col);
86
87/** Determine if column is INSTANT DROP */
88bool dd_column_is_dropped(const dd::Column *dd_col);
89
90/** Get the row version in which column is INSTANT ADD */
91uint32_t dd_column_get_version_added(const dd::Column *dd_col);
92
93/** Get the row version in which column is INSTANT DROP */
94uint32_t dd_column_get_version_dropped(const dd::Column *dd_col);
95
96/** Maximum hardcoded data dictionary tables. */
97constexpr uint32_t DICT_MAX_DD_TABLES = 1024;
98
99/** InnoDB private keys for dd::Table */
101 /** Auto-increment counter */
103 /** DATA DIRECTORY (static metadata) */
105 /** Dynamic metadata version */
107 /** Discard flag. Please don't use it directly, and instead use
108 dd_is_discarded and dd_set_discarded functions. Discard flag is defined
109 for both dd::Table and dd::Partition and it's easy to confuse.
110 The functions will choose right implementation for you, depending on
111 whether the argument is dd::Table or dd::Partition. */
113 /** Columns before first instant ADD COLUMN, used only for V1 */
115 /** Sentinel */
118
119/** InnoDB private keys for dd::Column */
120/** About the DD_INSTANT_COLUMN_DEFAULT*, please note that if it's a
121partitioned table, not every default value is needed for every partition.
122For example, after ALTER TABLE ... PARTITION, maybe some partitions only
123need part or even none of the default values. Let's say there are two
124partitions, p1 and p2. p1 needs 10 default values while p2 needs 2.
125If another ALTER ... PARTITION makes p1 a fresh new partition which
126doesn't need the default values any more, currently, the extra 8(10 - 2)
127default values are not removed form dd::Column::se_private_data. */
129 /** Default value when it was added instantly */
131 /** Default value is null or not */
133 /** Row version when this column was added instantly */
135 /** Row version when this column was dropped instantly */
137 /** Column physical position on row when it was created */
139 /** Sentinel */
142
143#endif /* !UNIV_HOTBACKUP */
144
145/** Server version that the tablespace created */
147
148/** The tablespace version that the tablespace created */
150
151#ifndef UNIV_HOTBACKUP
152/** InnoDB private keys for dd::Partition */
154 /** Row format for this partition */
156 /** Columns before first instant ADD COLUMN.
157 This is necessary for each partition because different partition
158 may have different instant column numbers, especially, for a
159 newly truncated partition, it can have no instant columns.
160 So partition level one should be always >= table level one. */
162 /** Discard flag. Please don't use it directly, and instead use
163 dd_is_discarded and dd_set_discarded functions. Discard flag is defined
164 for both dd::Table and dd::Partition and it's easy to confuse.
165 The functions will choose right implementation for you, depending on
166 whether the argument is dd::Table or dd::Partition. */
168 /** Sentinel */
171
172/** InnoDB private keys for dd::Tablespace */
174 /** Tablespace flags */
176 /** Tablespace identifier */
178 /** Discard attribute */
180 /** Server version */
182 /** TABLESPACE_VERSION */
184 /** Current state attribute */
186 /** Sentinel */
189
190/** Values for InnoDB private key "state" for dd::Tablespace */
192 /** Normal IBD tablespace */
194 /** Discarded IBD tablespace */
196 /** Corrupted IBD tablespace */
198 /** Active undo tablespace */
200 /** Inactive undo tablespace being truncated, selected
201 explicitly by ALTER UNDO TABLESPACE SET INACTIVE.
202 Note: the DD is not updated when an undo space is selected
203 for truncation implicitly by the purge thread. */
205 /** Inactive undo tablespace being truncated, selected
206 explicitly by ALTER UNDO TABLESPACE SET INACTIVE. */
208 /** Sentinel */
211
212/** InnoDB implicit tablespace name or prefix, which should be same to
213dict_sys_t::s_file_per_table_name */
214static constexpr char reserved_implicit_name[] = "innodb_file_per_table";
215
216/** InnoDB private key strings for dd::Tablespace.
217@see dd_space_keys */
219 "flags", "id", "discard", "server_version", "space_version", "state"};
220
221/** InnoDB private value strings for key string "state" in dd::Tablespace.
222@see dd_space_state_values */
224 "normal", /* for IBD spaces */
225 "discarded", /* for IBD spaces */
226 "corrupted", /* for IBD spaces */
227 "active", /* for undo spaces*/
228 "inactive", /* for undo spaces */
229 "empty", /* for undo spaces */
230 "unknown" /* for non-existing or unknown spaces */
231};
232
233/** InnoDB private key strings for dd::Table. @see dd_table_keys */
235 "autoinc", "data_directory", "version", "discard", "instant_col"};
236
237/** InnoDB private key strings for dd::Column, @see dd_column_keys */
239 "default", "default_null", "version_added", "version_dropped",
240 "physical_pos"};
241
242/** InnoDB private key strings for dd::Partition. @see dd_partition_keys */
244 "format", "instant_col", "discard"};
245
246/** InnoDB private keys for dd::Index or dd::Partition_index */
248 /** Index identifier */
250 /** Space id */
252 /** Table id */
254 /** Root page number */
256 /** Creating transaction ID */
258 /** Sentinel */
261
262/** InnoDB private key strings for dd::Index or dd::Partition_index.
263@see dd_index_keys */
265 "id", "space_id", "table_id", "root", "trx_id"};
266
267/** InnoDB private key strings for dd::Index or dd::Partition_index.
268@see dd_index_keys */
269extern const char *const dd_index_key_strings[DD_INDEX__LAST];
270
271/** dd::Partition::options() key for INDEX DIRECTORY */
272static const dd::String_type index_file_name_key("index_file_name");
273/** dd::Partition::options() key for DATA DIRECTORY */
274static const dd::String_type data_file_name_key("data_file_name");
275
276/** Table names needed to process I_S queries. */
277static const dd::String_type dd_tables_name("mysql/tables");
278static const dd::String_type dd_partitions_name("mysql/table_partitions");
279static const dd::String_type dd_tablespaces_name("mysql/tablespaces");
280static const dd::String_type dd_indexes_name("mysql/indexes");
281static const dd::String_type dd_columns_name("mysql/columns");
282
283#ifdef UNIV_DEBUG
284
285/** Hard-coded data dictionary information */
287 /** Data dictionary table name */
288 const char *name;
289 /** Number of indexes */
291};
292
293/** The hard-coded data dictionary tables. */
295 INNODB_DD_TABLE("dd_properties", 1),
296
297 INNODB_DD_TABLE("innodb_dynamic_metadata", 1),
298 INNODB_DD_TABLE("innodb_table_stats", 1),
299 INNODB_DD_TABLE("innodb_index_stats", 1),
300 INNODB_DD_TABLE("innodb_ddl_log", 2),
301
302 INNODB_DD_TABLE("catalogs", 2),
303 INNODB_DD_TABLE("character_sets", 3),
304 INNODB_DD_TABLE("check_constraints", 3),
305 INNODB_DD_TABLE("collations", 3),
306 INNODB_DD_TABLE("column_statistics", 3),
307 INNODB_DD_TABLE("column_type_elements", 1),
308 INNODB_DD_TABLE("columns", 5),
309 INNODB_DD_TABLE("events", 6),
310 INNODB_DD_TABLE("foreign_key_column_usage", 3),
311 INNODB_DD_TABLE("foreign_keys", 4),
312 INNODB_DD_TABLE("index_column_usage", 3),
313 INNODB_DD_TABLE("index_partitions", 3),
314 INNODB_DD_TABLE("index_stats", 1),
315 INNODB_DD_TABLE("indexes", 3),
316 INNODB_DD_TABLE("parameter_type_elements", 1),
317 INNODB_DD_TABLE("parameters", 3),
318 INNODB_DD_TABLE("resource_groups", 2),
319 INNODB_DD_TABLE("routines", 7),
320 INNODB_DD_TABLE("schemata", 3),
321 INNODB_DD_TABLE("st_spatial_reference_systems", 3),
322 INNODB_DD_TABLE("table_partition_values", 1),
323 INNODB_DD_TABLE("table_partitions", 7),
324 INNODB_DD_TABLE("table_stats", 1),
325 INNODB_DD_TABLE("tables", 10),
326 INNODB_DD_TABLE("tablespace_files", 2),
327 INNODB_DD_TABLE("tablespaces", 2),
328 INNODB_DD_TABLE("triggers", 7),
329 INNODB_DD_TABLE("view_routine_usage", 2),
330 INNODB_DD_TABLE("view_table_usage", 2)};
331
332/** Number of hard-coded data dictionary tables */
334
335/** @return total number of indexes of all DD Tables. */
336uint32_t dd_get_total_indexes_num();
337
338#endif /* UNIV_DEBUG */
339
340#endif /* !UNIV_HOTBACKUP */
341
342/** Class to decode or encode a stream of default value for instant table.
343The decode/encode are necessary because that the default values would b
344kept as InnoDB format stream, which is in fact byte stream. However,
345to store them in the DD se_private_data, it requires text(char).
346So basically, the encode will change the byte stream into char stream,
347by splitting every byte into two chars, for example, 0xFF, would be split
348into 0x0F and 0x0F. So the final storage space would be double. For the
349decode, it's the converse process, combining two chars into one byte. */
351 public:
352 /** Constructor */
354
355 /** Destructor */
357
358 /** Encode the specified stream in format of bytes into chars
359 @param[in] stream stream to encode in bytes
360 @param[in] in_len length of the stream
361 @param[out] out_len length of the encoded stream
362 @return the encoded stream, which would be destroyed if the class
363 itself is destroyed */
364 const char *encode(const byte *stream, size_t in_len, size_t *out_len);
365
366 /** Decode the specified stream, which is encoded by encode()
367 @param[in] stream stream to decode in chars
368 @param[in] in_len length of the stream
369 @param[out] out_len length of the decoded stream
370 @return the decoded stream, which would be destroyed if the class
371 itself is destroyed */
372 const byte *decode(const char *stream, size_t in_len, size_t *out_len);
373
374 private:
375 /** Clean-up last result */
377
378 private:
379 /** The encoded or decoded stream */
380 byte *m_result;
381};
382
383#ifndef UNIV_HOTBACKUP
384/** Determine if a dd::Partition is the first leaf partition in the table
385@param[in] dd_part dd::Partition
386@return True If it's the first partition
387@retval False Not the first one */
388inline bool dd_part_is_first(const dd::Partition *dd_part) {
389 return (dd_part == *(dd_part->table().leaf_partitions().begin()));
390}
391
392/** Determine if a dd::Table is partitioned table
393@param[in] table dd::Table
394@return True If partitioned table
395@retval False non-partitioned table */
396inline bool dd_table_is_partitioned(const dd::Table &table) {
397 return (table.partition_type() != dd::Table::PT_NONE);
398}
399
400#ifdef UNIV_DEBUG
401/** Check if the instant columns are consistent with the se_private_data
402in dd::Table
403@param[in] dd_table dd::Table
404@return true if consistent, otherwise false */
405bool dd_instant_columns_consistent(const dd::Table &dd_table);
406#endif /* UNIV_DEBUG */
407
408/** Scan through all the keys to identify the key parts which are
409greater than the maximum size supported by the table record format.
410@param table MySQL table definition.
411@param max_part_len Maximum index part length allowed.
412@param visitor Function wrapper to invoke lambda expression.
413*/
415 const TABLE *table, const size_t max_part_len,
416 std::function<void(const KEY &)> visitor);
417
418/** Determine if a dd::Table has any INSTANT ADD column(s) in V1
419@param[in] table dd::Table
420@return true if table has instant column(s) in V1, false otherwise */
421inline bool dd_table_is_upgraded_instant(const dd::Table &table) {
422 if (table.is_temporary()) {
423 return false;
424 }
425
426 return (table.se_private_data().exists(
428}
429
430/** Determine if dd::Table has INSTANT ADD columns.
431@param[in] table table definition
432@return true if table has INSTANT ADD column(s), false otherwise */
433inline bool dd_table_has_instant_add_cols(const dd::Table &table) {
434 if (table.is_temporary()) {
435 return false;
436 }
437
438 for (const auto column : table.columns()) {
439 if (dd_column_is_added(column)) {
440 return true;
441 }
442 }
443
444 return false;
445}
446
447/** Determine if dd::Table has INSTANT DROPPED columns.
448@param[in] table table definition
449@return true if table has INSTANT DROP column(s), false otherwise */
450inline bool dd_table_has_instant_drop_cols(const dd::Table &table) {
451 if (table.is_temporary()) {
452 return false;
453 }
454
455 for (const auto column : table.columns()) {
456 if (dd_column_is_dropped(column)) {
457 return true;
458 }
459 }
460
461 return false;
462}
463
464static inline bool is_system_column(const char *col_name) {
465 ut_ad(col_name != nullptr);
466 return (strncmp(col_name, "DB_ROW_ID", 9) == 0 ||
467 strncmp(col_name, "DB_TRX_ID", 9) == 0 ||
468 strncmp(col_name, "DB_ROLL_PTR", 11) == 0);
469}
470
471/** Set different column counters.
472@param[in] table dd::Table
473@param[out] i_c initial column count
474@param[out] c_c current column count
475@param[out] t_c total column count
476@param[in] current_row_version current row version */
477inline void dd_table_get_column_counters(const dd::Table &table, uint32_t &i_c,
478 uint32_t &c_c, uint32_t &t_c,
479 uint32_t &current_row_version) {
480 size_t n_dropped_cols = 0;
481 size_t n_added_cols = 0;
482 size_t n_added_and_dropped_cols = 0;
483 size_t n_current_cols = 0;
484
485 for (const auto column : table.columns()) {
486 if (is_system_column(column->name().c_str()) || column->is_virtual()) {
487 continue;
488 }
489
490 if (dd_column_is_dropped(column)) {
491 n_dropped_cols++;
492 if (dd_column_is_added(column)) {
493 n_added_and_dropped_cols++;
494 }
495
496 uint32_t v_dropped = dd_column_get_version_dropped(column);
497 ut_ad(dd_is_valid_row_version(v_dropped));
498 current_row_version = std::max(current_row_version, v_dropped);
499
500 continue;
501 }
502
503 if (dd_column_is_added(column)) {
504 n_added_cols++;
505
506 uint32_t v_added = dd_column_get_version_added(column);
508 current_row_version = std::max(current_row_version, v_added);
509 }
510
511 n_current_cols++;
512 }
513
514 ut_ad(n_dropped_cols >= n_added_and_dropped_cols);
515 size_t n_orig_dropped_cols = n_dropped_cols - n_added_and_dropped_cols;
516 c_c = n_current_cols;
517 i_c = (n_current_cols - n_added_cols) + n_orig_dropped_cols;
518 t_c = n_current_cols + n_dropped_cols;
519}
520
521/** Determine if a dd::Table has row versions
522@param[in] table dd::Table
523@return true if table has row versions, false otherwise */
524inline bool dd_table_has_row_versions(const dd::Table &table) {
525 if (table.is_temporary()) {
526 return false;
527 }
528
529 bool has_row_version = false;
530 for (const auto column : table.columns()) {
531 if (column->is_virtual()) {
532 continue;
533 }
534
535 /* Phy_pos metadata is populated for columns which belongs to table having
536 row versions. Check if non virtual column has it. */
537 if (column->se_private_data().exists(
539 has_row_version = true;
540 }
541
542 /* Checking only for one column is enough. */
543 break;
544 }
545
546#ifdef UNIV_DEBUG
547 if (has_row_version) {
548 bool found_inst_add_or_drop_col = false;
549 for (const auto column : table.columns()) {
550 if (dd_column_is_dropped(column) || dd_column_is_added(column)) {
551 found_inst_add_or_drop_col = true;
552 break;
553 }
554 }
555 ut_ad(found_inst_add_or_drop_col);
556 }
557#endif
558
559 return has_row_version;
560}
561
562/** Determine if a dd::Table has any INSTANTly ADDed/DROPped column
563@param[in] table dd::Table
564@return true if table has instant column(s), false otherwise */
565inline bool dd_table_has_instant_cols(const dd::Table &table) {
566 if (table.is_temporary()) {
567 return false;
568 }
569
570 bool instant_v1 = dd_table_is_upgraded_instant(table);
571 bool instant_v2 = dd_table_has_row_versions(table);
572
573 bool instant = instant_v1 || instant_v2;
574
575 /* If table has instant columns, make sure they are consistent with DD */
576 ut_ad(!instant || dd_instant_columns_consistent(table));
577
578 return (instant);
579}
580
581/** Determine if a dd::Partition has any instant column
582@param[in] part dd::Partition
583@return true If it's a partitioned table with instant columns
584@return false Not a partitioned table with instant columns */
585inline bool dd_part_has_instant_cols(const dd::Partition &part) {
586 bool instant = part.se_private_data().exists(
588 ut_ad(!instant || dd_table_has_instant_cols(part.table()));
589
590 return (instant);
591}
592
593/** Determine if any partition of the table still has instant columns
594@param[in] table dd::Table of the partitioned table
595@return true If any partition still has instant columns
596@return false No one has instant columns */
597inline bool dd_table_part_has_instant_cols(const dd::Table &table) {
599
600 /* For table having INSTANT ADD cols in v1, will have partition specific
601 INSTANT Metadata. */
602 if (dd_table_is_upgraded_instant(table)) {
603 for (auto part : table.leaf_partitions()) {
604 if (dd_part_has_instant_cols(*part)) {
605 return (true);
606 }
607 }
608 }
609
610 return (false);
611}
612
613/** Determine if dd::Table is discarded. Please note that
614in case of partitioned Table, only it's leaf partitions can be marked
615as discarded. However, it's fine to call this function on partitioned
616Table - it will just return false
617
618@param[in] table non-partitioned dd::Table
619@return true if table is marked as discarded
620@return false if table is not marked as discarded */
621inline bool dd_is_discarded(const dd::Table &table) {
622 const dd::Properties &table_private = table.se_private_data();
623 bool is_discarded = false;
624 if (table_private.exists(dd_table_key_strings[DD_TABLE_DISCARD])) {
625 table_private.get(dd_table_key_strings[DD_TABLE_DISCARD], &is_discarded);
626 }
627
628 /* In case of partitioned tables, only partitions/subpartitions can ever
629 be marked as discarded */
630 ut_ad(!is_discarded || !dd_table_is_partitioned(table));
631
632 return is_discarded;
633}
634
635/** Determine if dd::Partition is discarded. Please note that
636only leaf partitions can be marked as discarded (that is, if partition has
637subpartitions, then only subpartitions can be marked as discarded)
638
639Function can be safely called on a partition, even if it has subpartitions -
640it will just return false.
641
642@param[in] partition dd::Partition
643@return true if partition is marked as discarded
644@return false if partition is not marked as discarded */
645inline bool dd_is_discarded(const dd::Partition &partition) {
646 const dd::Properties &partition_private = partition.se_private_data();
647 bool is_discarded = false;
648 if (partition_private.exists(
651 &is_discarded);
652 }
653
654 return is_discarded;
655}
656
657/** Sets appropriate discard attribute of dd::Table
658Please note that this function must not be called on partitioned tables
659@param[in] table non-partitioned dd::Table
660@param[in] discard true if Table is discarded, false otherwise */
661void dd_set_discarded(dd::Table &table, bool discard);
662
663/** Sets appropriate discard attribute of dd::Partition
664Please note that this function can be only called on leaf_partitions.
665@param[in] partition leaf dd::Partition
666@param[in] discard true if Table is discarded, false otherwise */
667void dd_set_discarded(dd::Partition &partition, bool discard);
668
669/** Get the first index of a table or partition.
670@tparam Table dd::Table or dd::Partition
671@tparam Index dd::Index or dd::Partition_index
672@param[in] table table containing user columns and indexes
673@return the first index
674@retval NULL if there are no indexes */
675template <typename Table, typename Index>
676inline const Index *dd_first(const Table *table) {
677 return (*table->indexes().begin());
678}
679
680/** Get the first index of a table.
681@param[in] table table containing user columns and indexes
682@return the first index
683@retval NULL if there are no indexes */
684inline const dd::Index *dd_first_index(const dd::Table *table) {
685 return (dd_first<dd::Table, dd::Index>(table));
686}
687
688/** Get the first index of a partition.
689@param[in] partition partition or subpartition
690@return the first index
691@retval NULL if there are no indexes */
693 const dd::Partition *partition) {
694 return (dd_first<dd::Partition, dd::Partition_index>(partition));
695}
696
697#ifdef UNIV_DEBUG
698/** Determine if a partition is materialized.
699@param[in] part partition
700@return whether the partition is materialized */
701inline bool dd_part_is_stored(const dd::Partition *part) {
702 return (part->table().subpartition_type() == dd::Table::ST_NONE ||
703 part->parent());
704}
705#endif /* UNIV_DEBUG */
706
707/** Get the explicit dd::Tablespace::id of a table.
708@param[in] table non-partitioned table
709@return the explicit dd::Tablespace::id
710@retval dd::INVALID_OBJECT_ID if there is no explicit tablespace */
713 return (table.tablespace_id());
714}
715
716/** Get the explicit dd::Tablespace::id of a partition.
717@param[in] partition partition or subpartition
718@return the explicit dd::Tablespace::id
719@retval dd::INVALID_OBJECT_ID if there is no explicit tablespace */
720inline dd::Object_id dd_get_space_id(const dd::Partition &partition);
721
722/** Set the AUTO_INCREMENT attribute.
723@param[in,out] se_private_data dd::Table::se_private_data
724@param[in] autoinc the auto-increment value */
725void dd_set_autoinc(dd::Properties &se_private_data, uint64_t autoinc);
726
727/** Get the version attribute.
728@param[in] dd_table dd::Table
729@return table dynamic metadata version if exists, otherwise 0 */
730inline uint64_t dd_get_version(const dd::Table *dd_table);
731
732/** Copy the AUTO_INCREMENT and version attribute if exist.
733@param[in] src dd::Table::se_private_data to copy from
734@param[out] dest dd::Table::se_private_data to copy to */
735void dd_copy_autoinc(const dd::Properties &src, dd::Properties &dest);
736
737/** Copy the metadata of a table definition if there was an instant
738ADD COLUMN happened. This should be done when it's not an ALTER TABLE
739with rebuild.
740@param[in,out] new_table New table definition
741@param[in] old_table Old table definition */
742void dd_copy_instant_n_cols(dd::Table &new_table, const dd::Table &old_table);
743
744/** Copy the engine-private parts of a table or partition definition
745when the change does not affect InnoDB. This mainly copies the common
746private data between dd::Table and dd::Partition
747@tparam Table dd::Table or dd::Partition
748@param[in,out] new_table Copy of old table or partition
749definition
750@param[in] old_table Old table or partition definition */
751template <typename Table>
752void dd_copy_private(Table &new_table, const Table &old_table);
753
754/** Copy the engine-private parts of column definitions of a table
755@param[in] ha_alter_info alter info
756@param[in,out] new_table Copy of old table
757@param[in] old_table Old table
758@param[in] dict_table InnoDB table cache */
759void dd_copy_table_columns(const Alter_inplace_info *ha_alter_info,
760 dd::Table &new_table, const dd::Table &old_table,
761 dict_table_t *dict_table);
762
763/** Copy the metadata of a table definition, including the INSTANT
764ADD COLUMN information. This should be done when it's not an ALTER TABLE
765with rebuild. Basically, check dd::Table::se_private_data and
766dd::Column::se_private_data.
767@param[in] ha_alter_info alter info
768@param[in,out] new_table Copy of old table definition
769@param[in] old_table Old table definition */
770inline void dd_copy_table(const Alter_inplace_info *ha_alter_info,
771 dd::Table &new_table, const dd::Table &old_table) {
772 /* Copy columns first, to make checking in dd_copy_instant_n_cols pass */
773 dd_copy_table_columns(ha_alter_info, new_table, old_table, nullptr);
774 if (dd_table_is_upgraded_instant(old_table)) {
775 dd_copy_instant_n_cols(new_table, old_table);
776 }
777}
778
779/** Adjust TABLE_ID for partitioned table after ALTER TABLE ... PARTITION.
780This makes sure that the TABLE_ID stored in dd::Column::se_private_data
781is correct if the first partition got changed
782@param[in,out] new_table New dd::Table */
783void dd_part_adjust_table_id(dd::Table *new_table);
784
785using Columns = std::vector<Field *>;
786
787/** Drop column instantly. It actually updates dropped columns metadata.
788@param[in] old_dd_table Old dd::Table
789@param[in,out] new_dd_table New dd::Table
790@param[in,out] new_table New InnoDB table objecta
791@param[in] cols_to_drop list of columns to be dropped
792@param[in] cols_to_add list of columns to be added
793@param[in] ha_alter_info alter info
794@retval true Failure
795@retval false Success */
796bool dd_drop_instant_columns(const dd::Table *old_dd_table,
797 dd::Table *new_dd_table, dict_table_t *new_table,
798 const Columns &cols_to_drop
799 IF_DEBUG(, const Columns &cols_to_add,
800 Alter_inplace_info *ha_alter_info));
801
802/** Add column default values for new instantly added columns
803@param[in] old_dd_table Old dd::Table
804@param[in,out] new_dd_table New dd::Table
805@param[in,out] new_table New InnoDB table object
806@param[in] cols_to_add columns to be added INSTANTly
807@retval true Failure
808@retval false Success */
809bool dd_add_instant_columns(const dd::Table *old_dd_table,
810 dd::Table *new_dd_table, dict_table_t *new_table,
811 const Columns &cols_to_add);
812
813/** Clear the instant ADD COLUMN information of a table
814@param[in,out] dd_table dd::Table
815@param[in] clear_version true if version metadata is to be cleared
816@return DB_SUCCESS or error code */
817dberr_t dd_clear_instant_table(dd::Table &dd_table, bool clear_version);
818
819/** Clear the instant ADD COLUMN information of a partition, to make it
820as a normal partition
821@param[in,out] dd_part dd::Partition */
823
824/** Compare the default values between imported column and column defined
825in the server. Note that it's absolutely OK if there is no default value
826in the column defined in server, since it can be filled in later.
827@param[in] dd_col dd::Column
828@param[in] col InnoDB column object
829@return true The default values match
830@retval false Not match */
831bool dd_match_default_value(const dd::Column *dd_col, const dict_col_t *col);
832
833/** Write default value of a column to dd::Column
834@param[in] col default value of this column to write
835@param[in,out] dd_col where to store the default value */
836void dd_write_default_value(const dict_col_t *col, dd::Column *dd_col);
837
838/** Import all metadata which is related to instant ADD COLUMN of a table
839to dd::Table. This is used for IMPORT.
840@param[in] table InnoDB table object
841@param[in,out] dd_table dd::Table */
843 dd::Table *dd_table);
844
845/** Write metadata of a table to dd::Table
846@tparam Table dd::Table or dd::Partition
847@param[in] dd_space_id Tablespace id, which server allocates
848@param[in,out] dd_table dd::Table or dd::Partition
849@param[in] table InnoDB table object */
850template <typename Table>
851void dd_write_table(dd::Object_id dd_space_id, Table *dd_table,
852 const dict_table_t *table);
853
854/** Set options of dd::Table according to InnoDB table object
855@tparam Table dd::Table or dd::Partition
856@param[in,out] dd_table dd::Table or dd::Partition
857@param[in] table InnoDB table object */
858template <typename Table>
859void dd_set_table_options(Table *dd_table, const dict_table_t *table);
860
861/** Update virtual columns with new se_private_data, currently, only
862table_id is set
863@param[in,out] dd_table dd::Table
864@param[in] id InnoDB table ID to set */
865void dd_update_v_cols(dd::Table *dd_table, table_id_t id);
866
867/** Write metadata of a tablespace to dd::Tablespace
868@param[in,out] dd_space dd::Tablespace
869@param[in] space_id InnoDB tablespace ID
870@param[in] fsp_flags InnoDB tablespace flags
871@param[in] state InnoDB tablespace state */
872void dd_write_tablespace(dd::Tablespace *dd_space, space_id_t space_id,
873 uint32_t fsp_flags, dd_space_states state);
874
875/** Add fts doc id column and index to new table
876when old table has hidden fts doc id without fulltext index
877@param[in,out] new_table New dd table
878@param[in] old_table Old dd table */
879void dd_add_fts_doc_id_index(dd::Table &new_table, const dd::Table &old_table);
880
883/** Find the specified dd::Index or dd::Partition_index in an InnoDB table
884@tparam Index dd::Index or dd::Partition_index
885@param[in] table InnoDB table object
886@param[in] dd_index Index to search
887@return the dict_index_t object related to the index */
888template <typename Index>
889const dict_index_t *dd_find_index(const dict_table_t *table, Index *dd_index);
891
892/** Acquire a shared metadata lock.
893@param[in,out] thd current thread
894@param[out] mdl metadata lock
895@param[in] db schema name
896@param[in] table table name
897@retval false if acquired, or trylock timed out
898@retval true if failed (my_error() will have been called) */
899[[nodiscard]] static inline bool dd_mdl_acquire(THD *thd, MDL_ticket **mdl,
900 const char *db,
901 const char *table);
902
903/** Release a metadata lock.
904@param[in,out] thd current thread
905@param[in,out] mdl metadata lock */
906void dd_mdl_release(THD *thd, MDL_ticket **mdl);
907
908/** Returns thd associated with the trx or current_thd
909@param[in] trx transaction
910@return trx->mysql_thd or current_thd */
911THD *dd_thd_for_undo(const trx_t *trx);
912
913/** Check if current undo needs a MDL or not
914@param[in] trx transaction
915@return true if MDL is necessary, otherwise false */
916bool dd_mdl_for_undo(const trx_t *trx);
917
918/** Load foreign key constraint info for the dd::Table object.
919@param[out] m_table InnoDB table handle
920@param[in] dd_table Global DD table
921@param[in] col_names column names, or NULL
922@param[in] ignore_err DICT_ERR_IGNORE_FK_NOKEY or DICT_ERR_IGNORE_NONE
923@param[in] dict_locked True if dict_sys->mutex is already held,
924 otherwise false
925@return DB_SUCCESS if successfully load FK constraint */
927 const dd::Table *dd_table,
928 const char **col_names,
929 dict_err_ignore_t ignore_err,
930 bool dict_locked);
931
932/** Set the AUTO_INCREMENT attribute.
933@param[in,out] se_private_data dd::Table::se_private_data
934@param[in] autoinc the auto-increment value */
935void dd_set_autoinc(dd::Properties &se_private_data, uint64_t autoinc);
936
937/** Scan a new dd system table, like mysql.tables...
938@param[in] thd THD
939@param[in,out] mdl MDL lock
940@param[in,out] pcur Persistent cursor
941@param[in,out] mtr Mini-transaction
942@param[in] system_table_name Which dd system table to open
943@param[in,out] table dict_table_t obj of dd system table
944@retval the first rec of the dd system table */
945const rec_t *dd_startscan_system(THD *thd, MDL_ticket **mdl, btr_pcur_t *pcur,
946 mtr_t *mtr, const char *system_table_name,
947 dict_table_t **table);
948
949/** Process one mysql.tables record and get the dict_table_t
950@param[in] heap Temp memory heap
951@param[in,out] rec mysql.tables record
952@param[in,out] table dict_table_t to fill
953@param[in] dd_tables dict_table_t obj of dd system table
954@param[in] mdl MDL on the table
955@param[in] mtr Mini-transaction
956@retval error message, or NULL on success */
958 mem_heap_t *heap, const rec_t *rec, dict_table_t **table,
959 dict_table_t *dd_tables, MDL_ticket **mdl, mtr_t *mtr);
960/** Process one mysql.table_partitions record and get the dict_table_t
961@param[in] heap Temp memory heap
962@param[in,out] rec mysql.table_partitions record
963@param[in,out] table dict_table_t to fill
964@param[in] dd_tables dict_table_t obj of dd partition table
965@param[in] mdl MDL on the table
966@param[in] mtr Mini-transaction
967@retval error message, or NULL on success */
969 mem_heap_t *heap, const rec_t *rec, dict_table_t **table,
970 dict_table_t *dd_tables, MDL_ticket **mdl, mtr_t *mtr);
971
972/** Process one mysql.columns record and get info to dict_col_t
973@param[in,out] heap Temp memory heap
974@param[in] rec mysql.columns record
975@param[in,out] col dict_col_t to fill
976@param[in,out] table_id Table id
977@param[in,out] col_name Column name
978@param[in,out] nth_v_col Nth v column
979@param[in] dd_columns dict_table_t obj of mysql.columns
980@param[in,out] mtr Mini-transaction
981@retval true if column is filled */
982bool dd_process_dd_columns_rec(mem_heap_t *heap, const rec_t *rec,
983 dict_col_t *col, table_id_t *table_id,
984 char **col_name, ulint *nth_v_col,
985 const dict_table_t *dd_columns, mtr_t *mtr);
986
987/** Process one mysql.columns record for virtual columns
988@param[in] heap temp memory heap
989@param[in,out] rec mysql.columns record
990@param[in,out] table_id Table id
991@param[in,out] pos Position
992@param[in,out] base_pos Base column position
993@param[in,out] n_row Number of rows
994@param[in] dd_columns dict_table_t obj of mysql.columns
995@param[in] mtr Mini-transaction
996@retval true if virtual info is filled */
998 table_id_t *table_id, ulint **pos,
999 ulint **base_pos, ulint *n_row,
1000 dict_table_t *dd_columns, mtr_t *mtr);
1001
1002/** Get next record of new DD system tables
1003@param[in,out] pcur Persistent cursor
1004@param[in] mtr Mini-transaction
1005@retval next record */
1006const rec_t *dd_getnext_system_rec(btr_pcur_t *pcur, mtr_t *mtr);
1007
1008/** Process one mysql.indexes record and get the dict_index_t
1009@param[in] heap Temp memory heap
1010@param[in,out] rec mysql.indexes record
1011@param[in,out] index dict_index_t to fill
1012@param[in] mdl MDL on index->table
1013@param[in,out] parent Parent table if it's fts aux table.
1014@param[in,out] parent_mdl MDL on parent if it's fts aux table.
1015@param[in] dd_indexes dict_table_t obj of mysql.indexes
1016@param[in] mtr Mini-transaction
1017@retval true if index is filled */
1018bool dd_process_dd_indexes_rec(mem_heap_t *heap, const rec_t *rec,
1019 const dict_index_t **index, MDL_ticket **mdl,
1020 dict_table_t **parent, MDL_ticket **parent_mdl,
1021 dict_table_t *dd_indexes, mtr_t *mtr);
1022
1023/** Process one mysql.indexes record and get brief info to dict_index_t
1024@param[in] heap temp memory heap
1025@param[in,out] rec mysql.indexes record
1026@param[in,out] index_id index id
1027@param[in,out] space_id space id
1028@param[in] dd_indexes dict_table_t obj of mysql.indexes
1029@retval true if index is filled */
1031 space_index_t *index_id,
1032 space_id_t *space_id,
1033 dict_table_t *dd_indexes);
1034
1035/** Process one mysql.tablespaces record and get info
1036@param[in] heap temp memory heap
1037@param[in] rec mysql.tablespaces record
1038@param[out] space_id space id
1039@param[out] name space name
1040@param[out] flags space flags
1041@param[out] server_version server version
1042@param[out] space_version space version
1043@param[out] is_encrypted true if tablespace is encrypted
1044@param[out] autoextend_size autoextend_size attribute value
1045@param[out] state space state
1046@param[in] dd_spaces dict_table_t obj of mysql.tablespaces
1047@return true if data is retrieved */
1048bool dd_process_dd_tablespaces_rec(mem_heap_t *heap, const rec_t *rec,
1049 space_id_t *space_id, char **name,
1050 uint32_t *flags, uint32_t *server_version,
1051 uint32_t *space_version, bool *is_encrypted,
1052 uint64_t *autoextend_size,
1053 dd::String_type *state,
1054 dict_table_t *dd_spaces);
1055
1056/** Make sure the data_dir_path is saved in dict_table_t if DATA DIRECTORY
1057was used. Try to read it from the fil_system first, then from new dd.
1058@tparam Table dd::Table or dd::Partition
1059@param[in,out] table Table object
1060@param[in] dd_table DD table object
1061@param[in] dict_mutex_own true if dict_sys->mutex is owned already */
1062template <typename Table>
1063void dd_get_and_save_data_dir_path(dict_table_t *table, const Table *dd_table,
1064 bool dict_mutex_own);
1065
1066/** Make sure the tablespace name is saved in dict_table_t if the table
1067uses a general tablespace.
1068Try to read it from the fil_system_t first, then from DD.
1069@param[in] table Table object
1070@param[in] dd_table Global DD table or partition object
1071@param[in] dict_mutex_own true if dict_sys->mutex is owned already */
1072template <typename Table>
1073void dd_get_and_save_space_name(dict_table_t *table, const Table *dd_table,
1074 bool dict_mutex_own);
1075
1076/** Get the meta-data filename from the table name for a
1077single-table tablespace.
1078@param[in,out] table table object
1079@param[in] dd_table DD table object
1080@param[out] filename filename
1081@param[in] max_len filename max length */
1082void dd_get_meta_data_filename(dict_table_t *table, dd::Table *dd_table,
1083 char *filename, ulint max_len);
1084
1085/** Load foreign key constraint for the table. Note, it could also open
1086the foreign table, if this table is referenced by the foreign table
1087@param[in,out] client data dictionary client
1088@param[in] tbl_name Table Name
1089@param[in] col_names column names, or NULL
1090@param[out] m_table InnoDB table handle
1091@param[in] dd_table Global DD table
1092@param[in] thd thread THD
1093@param[in] dict_locked True if dict_sys->mutex is already held,
1094 otherwise false
1095@param[in] check_charsets whether to check charset compatibility
1096@param[in,out] fk_tables name list for tables that refer to this table
1097@return DB_SUCCESS if successfully load FK constraint */
1098dberr_t dd_table_load_fk(dd::cache::Dictionary_client *client,
1099 const char *tbl_name, const char **col_names,
1100 dict_table_t *m_table, const dd::Table *dd_table,
1101 THD *thd, bool dict_locked, bool check_charsets,
1102 dict_names_t *fk_tables);
1103
1104/** Load foreign key constraint for the table. Note, it could also open
1105the foreign table, if this table is referenced by the foreign table
1106@param[in,out] client data dictionary client
1107@param[in] tbl_name Table Name
1108@param[in] col_names column names, or NULL
1109@param[out] m_table InnoDB table handle
1110@param[in] check_charsets whether to check charset compatibility
1111@param[in] ignore_err DICT_ERR_IGNORE_FK_NOKEY or DICT_ERR_IGNORE_NONE
1112@param[in,out] fk_tables name list for tables that refer to this table
1113@return DB_SUCCESS if successfully load FK constraint */
1114dberr_t dd_table_check_for_child(dd::cache::Dictionary_client *client,
1115 const char *tbl_name, const char **col_names,
1116 dict_table_t *m_table, bool check_charsets,
1117 dict_err_ignore_t ignore_err,
1118 dict_names_t *fk_tables);
1119
1120/** Open uncached table definition based on a Global DD object.
1121@param[in] thd thread THD
1122@param[in] client data dictionary client
1123@param[in] dd_table Global DD table object
1124@param[in] name Table Name
1125@param[out] ts MySQL table share
1126@param[out] td MySQL table definition
1127@retval error number on error
1128@retval 0 on success */
1129
1130int acquire_uncached_table(THD *thd, dd::cache::Dictionary_client *client,
1131 const dd::Table *dd_table, const char *name,
1132 TABLE_SHARE *ts, TABLE *td);
1133
1134/** free uncached table definition.
1135@param[in] ts MySQL table share
1136@param[in] td MySQL table definition */
1137
1139
1140/** Instantiate an InnoDB in-memory table metadata (dict_table_t)
1141based on a Global DD object or MYSQL table definition.
1142@param[in] thd thread THD
1143@param[in,out] client data dictionary client
1144@param[in] dd_table Global DD table object
1145@param[in] dd_part Global DD partition or subpartition, or NULL
1146@param[in] tbl_name table name, or NULL if not known
1147@param[out] table InnoDB table (NULL if not found or loadable)
1148@param[in] td MYSQL table definition
1149@return error code
1150@retval 0 on success */
1151int dd_table_open_on_dd_obj(THD *thd, dd::cache::Dictionary_client *client,
1152 const dd::Table &dd_table,
1153 const dd::Partition *dd_part, const char *tbl_name,
1154 dict_table_t *&table, const TABLE *td);
1155
1156#endif /* !UNIV_HOTBACKUP */
1157
1158/** Open a persistent InnoDB table based on InnoDB table id, and
1159hold Shared MDL lock on it.
1160@param[in] table_id table identifier
1161@param[in,out] thd current MySQL connection (for mdl)
1162@param[in,out] mdl metadata lock (*mdl set if
1163table_id was found) mdl=NULL if we are resurrecting table IX locks in recovery
1164@param[in] dict_locked dict_sys mutex is held
1165@param[in] check_corruption check if the table is corrupted or not.
1166@return table
1167@retval NULL if the table does not exist or cannot be opened */
1169 MDL_ticket **mdl, bool dict_locked,
1170 bool check_corruption);
1171
1172/** Close an internal InnoDB table handle.
1173@param[in,out] table InnoDB table handle
1174@param[in,out] thd current MySQL connection (for mdl)
1175@param[in,out] mdl metadata lock (will be set NULL)
1176@param[in] dict_locked whether we hold dict_sys mutex */
1177void dd_table_close(dict_table_t *table, THD *thd, MDL_ticket **mdl,
1178 bool dict_locked);
1179
1180#ifndef UNIV_HOTBACKUP
1181/** Set the discard flag for a non-partitioned dd table.
1182@param[in,out] thd current thread
1183@param[in] table InnoDB table
1184@param[in,out] table_def MySQL dd::Table to update
1185@param[in] discard discard flag
1186@return true if success
1187@retval false if fail. */
1188bool dd_table_discard_tablespace(THD *thd, const dict_table_t *table,
1189 dd::Table *table_def, bool discard);
1190
1191/** Open an internal handle to a persistent InnoDB table by name.
1192@param[in,out] thd current thread
1193@param[out] mdl metadata lock
1194@param[in] name InnoDB table name
1195@param[in] dict_locked has dict_sys mutex locked
1196@param[in] ignore_err whether to ignore err
1197@param[out] error pointer to error
1198@return handle to non-partitioned table
1199@retval NULL if the table does not exist */
1201 const char *name, bool dict_locked,
1202 ulint ignore_err, int *error = nullptr);
1203
1204/** Returns a cached table object based on table id.
1205@param[in] table_id table id
1206@param[in] dict_locked true=data dictionary locked
1207@return table, NULL if does not exist */
1208static inline dict_table_t *dd_table_open_on_id_in_mem(table_id_t table_id,
1209 bool dict_locked);
1210
1211/** Returns a cached table object based on table name.
1212@param[in] name table name
1213@param[in] dict_locked true=data dictionary locked
1214@return table, NULL if does not exist */
1215static inline dict_table_t *dd_table_open_on_name_in_mem(const char *name,
1216 bool dict_locked);
1217
1220/** Open or load a table definition based on a Global DD object.
1221@tparam Table dd::Table or dd::Partition
1222@param[in,out] client data dictionary client
1223@param[in] table MySQL table definition
1224@param[in] norm_name Table Name
1225@param[in] dd_table Global DD table or partition object
1226@param[in] thd thread THD
1227@return ptr to dict_table_t filled, otherwise, nullptr */
1228template <typename Table>
1229dict_table_t *dd_open_table(dd::cache::Dictionary_client *client,
1230 const TABLE *table, const char *norm_name,
1231 const Table *dd_table, THD *thd);
1233
1234/** Open foreign tables reference a table.
1235@param[in] fk_list foreign key name list
1236@param[in] dict_locked dict_sys mutex is locked or not
1237@param[in] thd thread THD */
1238void dd_open_fk_tables(dict_names_t &fk_list, bool dict_locked, THD *thd);
1239
1240/** Update the tablespace name and file name for rename
1241operation.
1242@param[in] dd_space_id dd tablespace id
1243@param[in] is_system_cs true, if space name is in system characters set.
1244 While renaming during bootstrap we have it
1245 in system cs. Otherwise, in file system cs.
1246@param[in] new_space_name dd_tablespace name
1247@param[in] new_path new data file path
1248@retval DB_SUCCESS on success. */
1249dberr_t dd_tablespace_rename(dd::Object_id dd_space_id, bool is_system_cs,
1250 const char *new_space_name, const char *new_path);
1251
1252/** Update the data directory flag in dd::Table key strings
1253@param[in] object_id dd tablespace object id
1254@param[in] path path where the ibd file is located currently
1255@retval DB_SUCCESS on success. */
1257 std::string path);
1258
1259/** Create metadata for specified tablespace, acquiring exclusive MDL first
1260@param[in,out] dd_client data dictionary client
1261@param[in,out] dd_space_name dd tablespace name
1262@param[in] space_id InnoDB tablespace ID
1263@param[in] flags InnoDB tablespace flags
1264@param[in] filename filename of this tablespace
1265@param[in] discarded true if this tablespace was discarded
1266@param[in,out] dd_space_id dd_space_id
1267@retval false on success
1268@retval true on failure */
1269bool dd_create_tablespace(dd::cache::Dictionary_client *dd_client,
1270 const char *dd_space_name, space_id_t space_id,
1271 uint32_t flags, const char *filename, bool discarded,
1272 dd::Object_id &dd_space_id);
1273
1274/** Create metadata for implicit tablespace
1275@param[in,out] dd_client data dictionary client
1276@param[in] space_id InnoDB tablespace ID
1277@param[in] space_name tablespace name to be set for the
1278 newly created tablespace
1279@param[in] filename tablespace filename
1280@param[in] discarded true if this tablespace was discarded
1281@param[in,out] dd_space_id dd tablespace id
1282@retval false on success
1283@retval true on failure */
1284bool dd_create_implicit_tablespace(dd::cache::Dictionary_client *dd_client,
1285 space_id_t space_id, const char *space_name,
1286 const char *filename, bool discarded,
1287 dd::Object_id &dd_space_id);
1288
1289/** Get the autoextend_size attribute for a tablespace.
1290@param[in] dd_client Data dictionary client
1291@param[in] dd_space_id Tablespace ID
1292@param[out] autoextend_size Value of autoextend_size attribute
1293@retval false On success
1294@retval true On failure */
1295bool dd_get_tablespace_size_option(dd::cache::Dictionary_client *dd_client,
1296 const dd::Object_id dd_space_id,
1297 uint64_t *autoextend_size);
1298
1299/** Drop a tablespace
1300@param[in,out] dd_client data dictionary client
1301@param[in] dd_space_id dd tablespace id
1302@retval false On success
1303@retval true On failure */
1304bool dd_drop_tablespace(dd::cache::Dictionary_client *dd_client,
1305 dd::Object_id dd_space_id);
1306
1307/** Obtain the private handler of InnoDB session specific data.
1308@param[in,out] thd MySQL thread handler.
1309@return reference to private handler */
1310
1311[[nodiscard]] innodb_session_t *&thd_to_innodb_session(THD *thd);
1312
1313/** Look up a column in a table using the system_charset_info collation.
1314@param[in] dd_table data dictionary table
1315@param[in] name column name
1316@return the column
1317@retval nullptr if not found */
1318static inline const dd::Column *dd_find_column(const dd::Table *dd_table,
1319 const char *name);
1320
1321/** Add a hidden column when creating a table.
1322@param[in,out] dd_table table containing user columns and indexes
1323@param[in] name hidden column name
1324@param[in] length length of the column, in bytes
1325@param[in] type column type
1326@return the added column, or NULL if there already was a column by that name */
1327static inline dd::Column *dd_add_hidden_column(dd::Table *dd_table,
1328 const char *name, uint length,
1330
1331/** Add a hidden index element at the end.
1332@param[in,out] index created index metadata
1333@param[in] column column of the index */
1334static inline void dd_add_hidden_element(dd::Index *index,
1335 const dd::Column *column);
1336
1337/** Initialize a hidden unique B-tree index.
1338@param[in,out] index created index metadata
1339@param[in] name name of the index
1340@param[in] column column of the index
1341@return the initialized index */
1342static inline dd::Index *dd_set_hidden_unique_index(dd::Index *index,
1343 const char *name,
1344 const dd::Column *column);
1345
1346/** Check whether there exist a column named as "FTS_DOC_ID", which is
1347reserved for InnoDB FTS Doc ID
1348@param[in] thd MySQL thread handle
1349@param[in] form information on table
1350 columns and indexes
1351@param[out] doc_id_col Doc ID column number if
1352 there exist a FTS_DOC_ID column,
1353 ULINT_UNDEFINED if column is of the
1354 wrong type/name/size
1355@return true if there exist a "FTS_DOC_ID" column */
1356static inline bool create_table_check_doc_id_col(THD *thd, const TABLE *form,
1357 ulint *doc_id_col);
1358
1359/** Return a display name for the row format
1360@param[in] row_format Row Format
1361@return row format name */
1362static inline const char *get_row_format_name(enum row_type row_format);
1363
1364/** Get the file name of a tablespace.
1365@param[in] dd_space Tablespace metadata
1366@return file name */
1367static inline const char *dd_tablespace_get_filename(
1368 const dd::Tablespace *dd_space) {
1369 ut_ad(dd_space->id() != dd::INVALID_OBJECT_ID);
1370 ut_ad(dd_space->files().size() == 1);
1371 return ((*dd_space->files().begin())->filename().c_str());
1372}
1373
1374/** Check if the InnoDB table is consistent with dd::Table
1375@tparam Table dd::Table or dd::Partition
1376@param[in] table InnoDB table
1377@param[in] dd_table dd::Table or dd::Partition
1378@return true if match
1379@retval false if not match */
1380template <typename Table>
1381bool dd_table_match(const dict_table_t *table, const Table *dd_table);
1382
1383/** Create dd table for fts aux index table
1384@param[in] parent_table parent table of fts table
1385@param[in,out] table fts table
1386@param[in] charset fts index charset
1387@return true on success, false on failure */
1388bool dd_create_fts_index_table(const dict_table_t *parent_table,
1389 dict_table_t *table,
1390 const CHARSET_INFO *charset);
1391
1392/** Create dd table for fts aux common table
1393@param[in] parent_table parent table of fts table
1394@param[in,out] table fts table
1395@param[in] is_config flag whether it's fts aux configure table
1396@return true on success, false on failure */
1397bool dd_create_fts_common_table(const dict_table_t *parent_table,
1398 dict_table_t *table, bool is_config);
1399
1400/** Drop dd table & tablespace for fts aux table
1401@param[in] name table name
1402@param[in] file_per_table flag whether use file per table
1403@return true on success, false on failure. */
1404bool dd_drop_fts_table(const char *name, bool file_per_table);
1405
1406/** Rename dd table & tablespace files for fts aux table
1407@param[in] table dict table
1408@param[in] old_name old innodb table name
1409@return true on success, false on failure. */
1410bool dd_rename_fts_table(const dict_table_t *table, const char *old_name);
1411
1412/** Open a table from its database and table name, this is currently used by
1413foreign constraint parser to get the referenced table.
1414@param[in] name foreign key table name
1415@param[in] database_name table db name
1416@param[in] database_name_len db name length
1417@param[in] table_name table db name
1418@param[in] table_name_len table name length
1419@param[in,out] table table object or NULL
1420@param[in,out] mdl mdl on table
1421@param[in,out] heap heap memory
1422@return complete table name with database and table name, allocated from
1423heap memory passed in */
1424char *dd_get_referenced_table(const char *name, const char *database_name,
1425 ulint database_name_len, const char *table_name,
1426 ulint table_name_len, dict_table_t **table,
1427 MDL_ticket **mdl, mem_heap_t *heap);
1428
1429/** Set the 'state' value in dd:tablespace::se_private_data starting with
1430an object id and the space name. Update the transaction when complete.
1431@param[in] thd current thread
1432@param[in] dd_space_id dd::Tablespace
1433@param[in] space_name tablespace name
1434@param[in] state value to set for key 'state'. */
1435void dd_tablespace_set_state(THD *thd, dd::Object_id dd_space_id,
1436 std::string space_name, dd_space_states state);
1437
1438/** Set the 'state' value in dd:tablespace::se_private_data.
1439The caller will update the transaction.
1440@param[in,out] dd_space dd::Tablespace object
1441@param[in] state value to set for key 'state' */
1443
1444/** Set Space ID and state attribute in se_private_data of mysql.tablespaces
1445for the named tablespace.
1446@param[in] space_name tablespace name
1447@param[in] space_id tablespace id
1448@param[in] state value to set for key 'state'
1449@return DB_SUCCESS or DD_FAILURE. */
1450bool dd_tablespace_set_id_and_state(const char *space_name, space_id_t space_id,
1451 dd_space_states state);
1452
1453/** Get state attribute value in dd::Tablespace::se_private_data
1454@param[in] dd_space dd::Tablespace object
1455@param[in,out] state tablespace state attribute
1456@param[in] space_id tablespace ID */
1457void dd_tablespace_get_state(const dd::Tablespace *dd_space,
1458 dd::String_type *state,
1459 space_id_t space_id = SPACE_UNKNOWN);
1460
1461/** Get state attribute value in dd::Tablespace::se_private_data
1462@param[in] p dd::Properties for dd::Tablespace::se_private_data
1463@param[in,out] state tablespace state attribute
1464@param[in] space_id tablespace ID */
1466 space_id_t space_id = SPACE_UNKNOWN);
1467
1468/** Get the enum for the state of the undo tablespace
1469from either dd::Tablespace::se_private_data or undo::Tablespace
1470@param[in] dd_space dd::Tablespace object
1471@param[in] space_id tablespace ID
1472@return enumerated value associated with the key 'state' */
1474 const dd::Tablespace *dd_space, space_id_t space_id = SPACE_UNKNOWN);
1475
1476/** Get the enum for the state of a tablespace
1477from either dd::Tablespace::se_private_data or undo::Tablespace
1478@param[in] p dd::Properties for dd::Tablespace::se_private_data
1479@param[in] space_id tablespace ID
1480@return enumerated value associated with the key 'state' */
1482 const dd::Properties *p, space_id_t space_id = SPACE_UNKNOWN);
1483
1484/** Get the enum for the state of a tablespace. Try the old 'discarded'
1485key value for IBD spaces or undo::Tablespace.
1486@param[in] p dd::Properties for dd::Tablespace::se_private_data
1487@param[in] space_id tablespace ID
1488@return enumerated value associated with the key 'state' */
1490 const dd::Properties *p, space_id_t space_id = SPACE_UNKNOWN);
1491
1492/** Get the discarded state from se_private_data of tablespace
1493@param[in] dd_space dd::Tablespace object */
1494bool dd_tablespace_is_discarded(const dd::Tablespace *dd_space);
1495
1496/** Set the autoextend_size attribute for an implicit tablespace
1497@param[in,out] dd_client Data dictionary client
1498@param[in] dd_space_id DD tablespace id
1499@param[in] create_info HA_CREATE_INFO object
1500@return false On success
1501@return true On failure */
1503 dd::Object_id dd_space_id,
1504 HA_CREATE_INFO *create_info);
1505
1506/** Get the MDL for the named tablespace. The mdl_ticket pointer can
1507be provided if it is needed by the caller. If foreground is set to false,
1508then the caller must explicitly release that ticket with dd_release_mdl().
1509Otherwise, it will ne released with the transaction.
1510@param[in] space_name tablespace name
1511@param[in] mdl_ticket tablespace MDL ticket, default to nullptr
1512@param[in] foreground true, if the caller is foreground thread. Default
1513 is true. For foreground, the lock duration is
1514 MDL_TRANSACTION. Otherwise, it is MDL_EXPLICIT.
1515@return DD_SUCCESS or DD_FAILURE. */
1516bool dd_tablespace_get_mdl(const char *space_name,
1517 MDL_ticket **mdl_ticket = nullptr,
1518 bool foreground = true);
1519/** Set discard attribute value in se_private_dat of tablespace
1520@param[in] dd_space dd::Tablespace object
1521@param[in] discard true if discarded, else false */
1522void dd_tablespace_set_discard(dd::Tablespace *dd_space, bool discard);
1523
1524/** Get discard attribute value stored in se_private_dat of tablespace
1525@param[in] dd_space dd::Tablespace object
1526@retval true if Tablespace is discarded
1527@retval false if attribute doesn't exist or if the
1528 tablespace is not discarded */
1530
1531/** Release the MDL held by the given ticket.
1532@param[in] mdl_ticket tablespace MDL ticket */
1533void dd_release_mdl(MDL_ticket *mdl_ticket);
1534
1535/** Copy metadata of already dropped columns from old table def to new
1536table def.
1537param[in] old_dd_table old table definition
1538param[in,out] new_dd_table new table definition
1539@retval true Failure
1540@retval false Success */
1541bool copy_dropped_columns(const dd::Table *old_dd_table,
1542 dd::Table *new_dd_table,
1543 uint32_t current_row_version);
1544
1545/** Set Innodb tablespace compression option from DD.
1546@param[in,out] client dictionary client
1547@param[in] algorithm compression algorithm
1548@param[in] dd_space_id DD tablespace ID.
1549@return true, if failed to set compression. */
1551 const char *algorithm,
1552 dd::Object_id dd_space_id);
1553
1554#endif /* !UNIV_HOTBACKUP */
1555
1556/** Update all InnoDB tablespace cache objects. This step is done post
1557dictionary trx rollback, binlog recovery and DDL_LOG apply. So DD is
1558consistent. Update the cached tablespace objects, if they differ from
1559the dictionary.
1560@param[in,out] thd thread handle
1561@retval true on error
1562@retval false on success */
1563
1564[[nodiscard]] bool dd_tablespace_update_cache(THD *thd);
1565
1566/* Check if the table belongs to an encrypted tablespace.
1567@return true if it does. */
1569
1570/** Parse the default value from dd::Column::se_private to dict_col_t
1571@param[in] se_private_data dd::Column::se_private
1572@param[in,out] col InnoDB column object
1573@param[in,out] heap Heap to store the default value */
1574void dd_parse_default_value(const dd::Properties &se_private_data,
1575 dict_col_t *col, mem_heap_t *heap);
1576
1577#ifndef UNIV_HOTBACKUP
1578/** Add definition of INSTANT dropped column in table cache.
1579@param[in] dd_table Table definition
1580@param[in,out] dict_table Table cache
1581@param[out] current_row_version row_version
1582@param[in] heap heap */
1583void fill_dict_dropped_columns(const dd::Table *dd_table,
1584 dict_table_t *dict_table
1585 IF_DEBUG(, uint32_t &current_row_version),
1586 mem_heap_t *heap);
1587
1588/** Check if given column is renamed during ALTER.
1589@param[in] ha_alter_info alter info
1590@param[in] old_name column old name
1591@param[out] new_name column new name
1592@return true if column is renamed, false otherwise. */
1593bool is_renamed(const Alter_inplace_info *ha_alter_info, const char *old_name,
1594 std::string &new_name);
1595
1596/** Check if given column is dropped during ALTER.
1597@param[in] ha_alter_info alter info
1598@param[in] column_name Column name
1599@return true if column is dropped, false otherwise. */
1600bool is_dropped(const Alter_inplace_info *ha_alter_info,
1601 const char *column_name);
1602
1603/** Get the mtype, prtype and len for a field.
1604@param[in] dd_tab dd table definition
1605@param[in] m_table innodb table cache
1606@param[in] field MySQL field
1607@param[out] col_len length
1608@param[out] mtype mtype
1609@param[out] prtype prtype */
1610void get_field_types(const dd::Table *dd_tab, const dict_table_t *m_table,
1611 const Field *field, unsigned &col_len, ulint &mtype,
1612 ulint &prtype);
1613#endif
1614
1615#include "dict0dd.ic"
1616#endif
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:51
Class describing changes to be done by ALTER TABLE.
Definition: handler.h:3196
Class to decode or encode a stream of default value for instant table.
Definition: dict0dd.h:350
const byte * decode(const char *stream, size_t in_len, size_t *out_len)
Decode the specified stream, which is encoded by encode()
Definition: dict0dd.cc:102
const char * encode(const byte *stream, size_t in_len, size_t *out_len)
Encode the specified stream in format of bytes into chars.
Definition: dict0dd.cc:81
DD_instant_col_val_coder()
Constructor.
Definition: dict0dd.h:353
~DD_instant_col_val_coder()
Destructor.
Definition: dict0dd.h:356
void cleanup()
Clean-up last result.
Definition: dict0dd.h:376
byte * m_result
The encoded or decoded stream.
Definition: dict0dd.h:380
Definition: field.h:575
Definition: key.h:113
A granted metadata lock.
Definition: mdl.h:984
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:34
Data structure that contains the information about shared tablespaces.
Definition: fsp0space.h:47
virtual const Column_collection & columns() const =0
Definition: column.h:87
Definition: index.h:51
Definition: partition_index.h:47
Definition: partition.h:51
virtual const Table & table() const =0
virtual const Properties & se_private_data() const =0
virtual const Partition * parent() const =0
The Properties class defines an interface for storing key=value pairs, where both key and value may b...
Definition: properties.h:74
virtual bool exists(const String_type &key) const =0
Check for the existence of a key=value pair given the key.
virtual bool get(const String_type &key, String_type *value) const =0
Get the string value for a given key.
Definition: table.h:47
virtual const Partition_leaf_vector & leaf_partitions() const =0
virtual bool is_temporary() const =0
virtual enum_partition_type partition_type() const =0
virtual Object_id tablespace_id() const =0
virtual const Properties & se_private_data() const =0
virtual enum_subpartition_type subpartition_type() const =0
@ PT_NONE
Definition: table.h:91
@ ST_NONE
Definition: table.h:107
Definition: tablespace.h:55
Definition: dictionary_client.h:149
Definition: sess0sess.h:71
A table definition from the master.
Definition: rpl_utility.h:248
const char * p
Definition: ctype-mb.cc:1237
dberr_t
Definition: db0err.h:39
void dd_clear_instant_part(dd::Partition &dd_part)
Clear the instant ADD COLUMN information of a partition, to make it as a normal partition.
Definition: dict0dd.cc:1915
bool dd_table_discard_tablespace(THD *thd, const dict_table_t *table, dd::Table *table_def, bool discard)
Set the discard flag for a non-partitioned dd table.
Definition: dict0dd.cc:868
void dd_set_table_options(Table *dd_table, const dict_table_t *table)
Set options of dd::Table according to InnoDB table object.
Definition: dict0dd.cc:2742
const char *const dd_table_key_strings[DD_TABLE__LAST]
InnoDB private key strings for dd::Table.
Definition: dict0dd.h:234
bool dd_create_implicit_tablespace(dd::cache::Dictionary_client *dd_client, space_id_t space_id, const char *space_name, const char *filename, bool discarded, dd::Object_id &dd_space_id)
Create metadata for implicit tablespace.
Definition: dict0dd.cc:4101
void dd_write_table(dd::Object_id dd_space_id, Table *dd_table, const dict_table_t *table)
Write metadata of a table to dd::Table.
Definition: dict0dd.cc:2642
void dd_tablespace_get_state(const dd::Tablespace *dd_space, dd::String_type *state, space_id_t space_id=SPACE_UNKNOWN)
Get state attribute value in dd::Tablespace::se_private_data.
Definition: dict0dd.cc:6927
dict_table_t * dd_open_table(dd::cache::Dictionary_client *client, const TABLE *table, const char *norm_name, const Table *dd_table, THD *thd)
Open or load a table definition based on a Global DD object.
Definition: dict0dd.cc:5423
bool dd_add_instant_columns(const dd::Table *old_dd_table, dd::Table *new_dd_table, dict_table_t *new_table, const Columns &cols_to_add)
Add column default values for new instantly added columns.
Definition: dict0dd.cc:2243
const char *const dd_space_state_values[DD_SPACE_STATE__LAST+1]
InnoDB private value strings for key string "state" in dd::Tablespace.
Definition: dict0dd.h:223
bool dd_column_is_added(const dd::Column *dd_col)
Determine if column is INSTANT ADD.
Definition: dict0dd.cc:133
bool dd_process_dd_indexes_rec_simple(mem_heap_t *heap, const rec_t *rec, space_index_t *index_id, space_id_t *space_id, dict_table_t *dd_indexes)
Process one mysql.indexes record and get brief info to dict_index_t.
Definition: dict0dd.cc:6106
bool dd_is_table_in_encrypted_tablespace(const dict_table_t *table)
Definition: dict0dd.cc:7283
bool dd_part_is_stored(const dd::Partition *part)
Determine if a partition is materialized.
Definition: dict0dd.h:701
bool dd_table_match(const dict_table_t *table, const Table *dd_table)
Check if the InnoDB table is consistent with dd::Table.
Definition: dict0dd.cc:250
static const char innobase_hton_name[]
Definition: dict0dd.h:76
static const char * dd_tablespace_get_filename(const dd::Tablespace *dd_space)
Get the file name of a tablespace.
Definition: dict0dd.h:1367
dberr_t dd_table_load_fk(dd::cache::Dictionary_client *client, const char *tbl_name, const char **col_names, dict_table_t *m_table, const dd::Table *dd_table, THD *thd, bool dict_locked, bool check_charsets, dict_names_t *fk_tables)
Load foreign key constraint for the table.
Definition: dict0dd.cc:4472
static bool create_table_check_doc_id_col(THD *thd, const TABLE *form, ulint *doc_id_col)
Check whether there exist a column named as "FTS_DOC_ID", which is reserved for InnoDB FTS Doc ID.
Definition: dict0dd.ic:222
bool dd_match_default_value(const dd::Column *dd_col, const dict_col_t *col)
Compare the default values between imported column and column defined in the server.
Definition: dict0dd.cc:2389
void dd_tablespace_set_discard(dd::Tablespace *dd_space, bool discard)
Set discard attribute value in se_private_dat of tablespace.
static const dd::String_type dd_tables_name("mysql/tables")
Table names needed to process I_S queries.
bool dd_tablespace_is_discarded(const dd::Tablespace *dd_space)
Get the discarded state from se_private_data of tablespace.
Definition: dict0dd.cc:7024
static const dd::Column * dd_find_column(const dd::Table *dd_table, const char *name)
Look up a column in a table using the system_charset_info collation.
Definition: dict0dd.ic:74
dict_table_t * dd_table_open_on_id(table_id_t table_id, THD *thd, MDL_ticket **mdl, bool dict_locked, bool check_corruption)
Open a persistent InnoDB table based on InnoDB table id, and hold Shared MDL lock on it.
Definition: dict0dd.cc:693
void dd_add_fts_doc_id_index(dd::Table &new_table, const dd::Table &old_table)
Add fts doc id column and index to new table when old table has hidden fts doc id without fulltext in...
Definition: dict0dd.cc:2847
dd_table_keys
InnoDB private keys for dd::Table.
Definition: dict0dd.h:100
@ DD_TABLE_DISCARD
Discard flag.
Definition: dict0dd.h:112
@ DD_TABLE_VERSION
Dynamic metadata version.
Definition: dict0dd.h:106
@ DD_TABLE_AUTOINC
Auto-increment counter.
Definition: dict0dd.h:102
@ DD_TABLE_INSTANT_COLS
Columns before first instant ADD COLUMN, used only for V1.
Definition: dict0dd.h:114
@ DD_TABLE_DATA_DIRECTORY
DATA DIRECTORY (static metadata)
Definition: dict0dd.h:104
@ DD_TABLE__LAST
Sentinel.
Definition: dict0dd.h:116
void dd_write_tablespace(dd::Tablespace *dd_space, space_id_t space_id, uint32_t fsp_flags, dd_space_states state)
Write metadata of a tablespace to dd::Tablespace.
Definition: dict0dd.cc:2832
std::vector< Field * > Columns
Definition: dict0dd.h:785
dberr_t dd_table_load_fk_from_dd(dict_table_t *m_table, const dd::Table *dd_table, const char **col_names, dict_err_ignore_t ignore_err, bool dict_locked)
Load foreign key constraint info for the dd::Table object.
Definition: dict0dd.cc:4303
bool dd_process_dd_indexes_rec(mem_heap_t *heap, const rec_t *rec, const dict_index_t **index, MDL_ticket **mdl, dict_table_t **parent, MDL_ticket **parent_mdl, dict_table_t *dd_indexes, mtr_t *mtr)
Process one mysql.indexes record and get the dict_index_t.
Definition: dict0dd.cc:5951
static void dd_add_hidden_element(dd::Index *index, const dd::Column *column)
Add a hidden index element at the end.
Definition: dict0dd.ic:121
bool dd_drop_fts_table(const char *name, bool file_per_table)
Drop dd table & tablespace for fts aux table.
Definition: dict0dd.cc:6723
uint32_t dd_get_total_indexes_num()
Definition: dict0dd.cc:7075
static constexpr char handler_name[]
Handler name for InnoDB.
Definition: dict0dd.h:74
bool dd_part_has_instant_cols(const dd::Partition &part)
Determine if a dd::Partition has any instant column.
Definition: dict0dd.h:585
int acquire_uncached_table(THD *thd, dd::cache::Dictionary_client *client, const dd::Table *dd_table, const char *name, TABLE_SHARE *ts, TABLE *td)
Open uncached table definition based on a Global DD object.
Definition: dict0dd.cc:333
bool dd_is_discarded(const dd::Table &table)
Determine if dd::Table is discarded.
Definition: dict0dd.h:621
dict_table_t * dd_table_open_on_name(THD *thd, MDL_ticket **mdl, const char *name, bool dict_locked, ulint ignore_err, int *error=nullptr)
Open an internal handle to a persistent InnoDB table by name.
Definition: dict0dd.cc:938
static dict_table_t * dd_table_open_on_name_in_mem(const char *name, bool dict_locked)
Returns a cached table object based on table name.
Definition: dict0dd.ic:185
dd_index_keys
InnoDB private keys for dd::Index or dd::Partition_index.
Definition: dict0dd.h:247
@ DD_INDEX_ID
Index identifier.
Definition: dict0dd.h:249
@ DD_INDEX_TRX_ID
Creating transaction ID.
Definition: dict0dd.h:257
@ DD_INDEX_ROOT
Root page number.
Definition: dict0dd.h:255
@ DD_TABLE_ID
Table id.
Definition: dict0dd.h:253
@ DD_INDEX_SPACE_ID
Space id.
Definition: dict0dd.h:251
@ DD_INDEX__LAST
Sentinel.
Definition: dict0dd.h:259
THD * dd_thd_for_undo(const trx_t *trx)
Returns thd associated with the trx or current_thd.
Definition: dict0dd.cc:308
static constexpr char reserved_implicit_name[]
InnoDB implicit tablespace name or prefix, which should be same to dict_sys_t::s_file_per_table_name.
Definition: dict0dd.h:214
bool dd_set_tablespace_compression(dd::cache::Dictionary_client *client, const char *algorithm, dd::Object_id dd_space_id)
Set Innodb tablespace compression option from DD.
Definition: dict0dd.cc:4276
void dd_tablespace_set_state(THD *thd, dd::Object_id dd_space_id, std::string space_name, dd_space_states state)
Set the 'state' value in dd:tablespace::se_private_data starting with an object id and the space name...
Definition: dict0dd.cc:6849
const char * dd_process_dd_partitions_rec_and_mtr_commit(mem_heap_t *heap, const rec_t *rec, dict_table_t **table, dict_table_t *dd_tables, MDL_ticket **mdl, mtr_t *mtr)
Process one mysql.table_partitions record and get the dict_table_t.
Definition: dict0dd.cc:5598
bool dd_tablespace_get_discard(const dd::Tablespace *dd_space)
Get discard attribute value stored in se_private_dat of tablespace.
void dd_import_instant_add_columns(const dict_table_t *table, dd::Table *dd_table)
Import all metadata which is related to instant ADD COLUMN of a table to dd::Table.
Definition: dict0dd.cc:2505
bool dd_is_valid_row_version(uint32_t version)
Determine if give version is a valid row version.
Definition: dict0dd.cc:128
const dict_index_t * dd_find_index(const dict_table_t *table, Index *dd_index)
Find the specified dd::Index or dd::Partition_index in an InnoDB table.
Definition: dict0dd.cc:2877
dd_partition_keys
InnoDB private keys for dd::Partition.
Definition: dict0dd.h:153
@ DD_PARTITION_INSTANT_COLS
Columns before first instant ADD COLUMN.
Definition: dict0dd.h:161
@ DD_PARTITION__LAST
Sentinel.
Definition: dict0dd.h:169
@ DD_PARTITION_ROW_FORMAT
Row format for this partition.
Definition: dict0dd.h:155
@ DD_PARTITION_DISCARD
Discard flag.
Definition: dict0dd.h:167
bool dd_get_tablespace_size_option(dd::cache::Dictionary_client *dd_client, const dd::Object_id dd_space_id, uint64_t *autoextend_size)
Get the autoextend_size attribute for a tablespace.
Definition: dict0dd.cc:4172
const uint32_t DD_SPACE_CURRENT_SPACE_VERSION
The tablespace version that the tablespace created.
Definition: dict0dd.h:149
void dd_release_mdl(MDL_ticket *mdl_ticket)
Release the MDL held by the given ticket.
Definition: dict0dd.cc:7068
dd_space_states dd_tablespace_get_state_enum_legacy(const dd::Properties *p, space_id_t space_id=SPACE_UNKNOWN)
Get the enum for the state of a tablespace.
Definition: dict0dd.cc:6975
const innodb_dd_table_t innodb_dd_table[]
The hard-coded data dictionary tables.
Definition: dict0dd.h:294
bool dd_create_fts_index_table(const dict_table_t *parent_table, dict_table_t *table, const CHARSET_INFO *charset)
Create dd table for fts aux index table.
Definition: dict0dd.cc:6438
static const dd::String_type dd_partitions_name("mysql/table_partitions")
bool dd_mdl_for_undo(const trx_t *trx)
Check if current undo needs a MDL or not.
Definition: dict0dd.cc:315
constexpr uint32_t DICT_MAX_DD_TABLES
Maximum hardcoded data dictionary tables.
Definition: dict0dd.h:97
void dd_copy_table_columns(const Alter_inplace_info *ha_alter_info, dd::Table &new_table, const dd::Table &old_table, dict_table_t *dict_table)
Copy the engine-private parts of column definitions of a table.
Definition: dict0dd.cc:1787
static const dd::String_type index_file_name_key("index_file_name")
dd::Partition::options() key for INDEX DIRECTORY
const dd::Index * dd_first_index(const dd::Table *table)
Get the first index of a table.
Definition: dict0dd.h:684
static constexpr char autoextend_size_str[]
String constant for AUTOEXTEND_SIZE option string.
Definition: dict0dd.h:79
bool dd_process_dd_columns_rec(mem_heap_t *heap, const rec_t *rec, dict_col_t *col, table_id_t *table_id, char **col_name, ulint *nth_v_col, const dict_table_t *dd_columns, mtr_t *mtr)
Process one mysql.columns record and get info to dict_col_t.
Definition: dict0dd.cc:5672
innodb_session_t *& thd_to_innodb_session(THD *thd)
Obtain the private handler of InnoDB session specific data.
Definition: ha_innodb.cc:2019
constexpr bool DD_FAILURE
Definition: dict0dd.h:71
void dd_copy_instant_n_cols(dd::Table &new_table, const dd::Table &old_table)
Copy the metadata of a table definition if there was an instant ADD COLUMN happened.
Definition: dict0dd.cc:1675
bool is_dropped(const Alter_inplace_info *ha_alter_info, const char *column_name)
Check if given column is dropped during ALTER.
Definition: dict0dd.cc:1774
bool dd_implicit_alter_tablespace(dd::cache::Dictionary_client *dd_client, dd::Object_id dd_space_id, HA_CREATE_INFO *create_info)
Set the autoextend_size attribute for an implicit tablespace.
Definition: dict0dd.cc:4200
const char *const dd_space_key_strings[DD_SPACE__LAST]
InnoDB private key strings for dd::Tablespace.
Definition: dict0dd.h:218
void dd_set_autoinc(dd::Properties &se_private_data, uint64_t autoinc)
Set the AUTO_INCREMENT attribute.
Definition: dict0dd.cc:1616
static constexpr size_t innodb_dd_table_size
Number of hard-coded data dictionary tables.
Definition: dict0dd.h:333
dd_space_keys
InnoDB private keys for dd::Tablespace.
Definition: dict0dd.h:173
@ DD_SPACE_STATE
Current state attribute.
Definition: dict0dd.h:185
@ DD_SPACE_DISCARD
Discard attribute.
Definition: dict0dd.h:179
@ DD_SPACE_SERVER_VERSION
Server version.
Definition: dict0dd.h:181
@ DD_SPACE__LAST
Sentinel.
Definition: dict0dd.h:187
@ DD_SPACE_VERSION
TABLESPACE_VERSION.
Definition: dict0dd.h:183
@ DD_SPACE_FLAGS
Tablespace flags.
Definition: dict0dd.h:175
@ DD_SPACE_ID
Tablespace identifier.
Definition: dict0dd.h:177
char * dd_get_referenced_table(const char *name, const char *database_name, ulint database_name_len, const char *table_name, ulint table_name_len, dict_table_t **table, MDL_ticket **mdl, mem_heap_t *heap)
Open a table from its database and table name, this is currently used by foreign constraint parser to...
Definition: dict0dd.cc:7096
bool dd_tablespace_get_mdl(const char *space_name, MDL_ticket **mdl_ticket=nullptr, bool foreground=true)
Get the MDL for the named tablespace.
Definition: dict0dd.cc:7036
bool dd_table_has_instant_cols(const dd::Table &table)
Determine if a dd::Table has any INSTANTly ADDed/DROPped column.
Definition: dict0dd.h:565
bool dd_column_is_dropped(const dd::Column *dd_col)
Determine if column is INSTANT DROP.
Definition: dict0dd.cc:148
bool dd_table_has_row_versions(const dd::Table &table)
Determine if a dd::Table has row versions.
Definition: dict0dd.h:524
static dict_table_t * dd_table_open_on_id_in_mem(table_id_t table_id, bool dict_locked)
Returns a cached table object based on table id.
Definition: dict0dd.ic:147
bool dd_drop_instant_columns(const dd::Table *old_dd_table, dd::Table *new_dd_table, dict_table_t *new_table, const Columns &cols_to_drop, const Columns &cols_to_add, Alter_inplace_info *ha_alter_info)
Drop column instantly.
Definition: dict0dd.cc:2116
void dd_get_and_save_space_name(dict_table_t *table, const Table *dd_table, bool dict_mutex_own)
Make sure the tablespace name is saved in dict_table_t if the table uses a general tablespace.
Definition: dict0dd.cc:4982
void dd_copy_private(Table &new_table, const Table &old_table)
Copy the engine-private parts of a table or partition definition when the change does not affect Inno...
Definition: dict0dd.cc:1698
dberr_t dd_clear_instant_table(dd::Table &dd_table, bool clear_version)
Clear the instant ADD COLUMN information of a table.
Definition: dict0dd.cc:1857
dd_column_keys
InnoDB private keys for dd::Column.
Definition: dict0dd.h:128
@ DD_COLUMN__LAST
Sentinel.
Definition: dict0dd.h:140
@ DD_INSTANT_COLUMN_DEFAULT
Default value when it was added instantly.
Definition: dict0dd.h:130
@ DD_INSTANT_PHYSICAL_POS
Column physical position on row when it was created.
Definition: dict0dd.h:138
@ DD_INSTANT_VERSION_DROPPED
Row version when this column was dropped instantly.
Definition: dict0dd.h:136
@ DD_INSTANT_COLUMN_DEFAULT_NULL
Default value is null or not.
Definition: dict0dd.h:132
@ DD_INSTANT_VERSION_ADDED
Row version when this column was added instantly.
Definition: dict0dd.h:134
void dd_table_get_column_counters(const dd::Table &table, uint32_t &i_c, uint32_t &c_c, uint32_t &t_c, uint32_t &current_row_version)
Set different column counters.
Definition: dict0dd.h:477
dberr_t dd_update_table_and_partitions_after_dir_change(dd::Object_id object_id, std::string path)
Update the data directory flag in dd::Table key strings.
Definition: dict0dd.cc:1148
bool dd_table_is_partitioned(const dd::Table &table)
Determine if a dd::Table is partitioned table.
Definition: dict0dd.h:396
uint32_t dd_column_get_version_added(const dd::Column *dd_col)
Get the row version in which column is INSTANT ADD.
Definition: dict0dd.cc:163
const char *const dd_partition_key_strings[DD_PARTITION__LAST]
InnoDB private key strings for dd::Partition.
Definition: dict0dd.h:243
dd_space_states
Values for InnoDB private key "state" for dd::Tablespace.
Definition: dict0dd.h:191
@ DD_SPACE_STATE_DISCARDED
Discarded IBD tablespace.
Definition: dict0dd.h:195
@ DD_SPACE_STATE_ACTIVE
Active undo tablespace.
Definition: dict0dd.h:199
@ DD_SPACE_STATE_CORRUPTED
Corrupted IBD tablespace.
Definition: dict0dd.h:197
@ DD_SPACE_STATE_EMPTY
Inactive undo tablespace being truncated, selected explicitly by ALTER UNDO TABLESPACE SET INACTIVE.
Definition: dict0dd.h:207
@ DD_SPACE_STATE_NORMAL
Normal IBD tablespace.
Definition: dict0dd.h:193
@ DD_SPACE_STATE_INACTIVE
Inactive undo tablespace being truncated, selected explicitly by ALTER UNDO TABLESPACE SET INACTIVE.
Definition: dict0dd.h:204
@ DD_SPACE_STATE__LAST
Sentinel.
Definition: dict0dd.h:209
const char *const dd_index_key_strings[DD_INDEX__LAST]
InnoDB private key strings for dd::Index or dd::Partition_index.
Definition: dict0dd.h:264
constexpr bool DD_SUCCESS
DD functions return false for success and true for failure because that is the way the server functio...
Definition: dict0dd.h:70
dberr_t dd_tablespace_rename(dd::Object_id dd_space_id, bool is_system_cs, const char *new_space_name, const char *new_path)
Update the tablespace name and file name for rename operation.
Definition: dict0dd.cc:1264
static const dd::String_type dd_indexes_name("mysql/indexes")
bool dd_drop_tablespace(dd::cache::Dictionary_client *dd_client, dd::Object_id dd_space_id)
Drop a tablespace.
Definition: dict0dd.cc:4117
const uint32_t DD_SPACE_CURRENT_SRV_VERSION
Server version that the tablespace created.
Definition: dict0dd.h:146
void dd_copy_autoinc(const dd::Properties &src, dd::Properties &dest)
Copy the AUTO_INCREMENT and version attribute if exist.
Definition: dict0dd.cc:1650
bool dd_process_dd_virtual_columns_rec(mem_heap_t *heap, const rec_t *rec, table_id_t *table_id, ulint **pos, ulint **base_pos, ulint *n_row, dict_table_t *dd_columns, mtr_t *mtr)
Process one mysql.columns record for virtual columns.
Definition: dict0dd.cc:5829
const char *const dd_column_key_strings[DD_COLUMN__LAST]
InnoDB private key strings for dd::Column,.
Definition: dict0dd.h:238
bool dd_create_fts_common_table(const dict_table_t *parent_table, dict_table_t *table, bool is_config)
Create dd table for fts aux common table.
Definition: dict0dd.cc:6584
bool copy_dropped_columns(const dd::Table *old_dd_table, dd::Table *new_dd_table, uint32_t current_row_version)
Copy metadata of already dropped columns from old table def to new table def.
Definition: dict0dd.cc:2018
uint32_t dd_column_get_version_dropped(const dd::Column *dd_col)
Get the row version in which column is INSTANT DROP.
Definition: dict0dd.cc:175
bool dd_table_has_instant_add_cols(const dd::Table &table)
Determine if dd::Table has INSTANT ADD columns.
Definition: dict0dd.h:433
void dd_get_and_save_data_dir_path(dict_table_t *table, const Table *dd_table, bool dict_mutex_own)
Make sure the data_dir_path is saved in dict_table_t if DATA DIRECTORY was used.
Definition: dict0dd.cc:4709
void dd_open_fk_tables(dict_names_t &fk_list, bool dict_locked, THD *thd)
Open foreign tables reference a table.
Definition: dict0dd.cc:5394
void dd_visit_keys_with_too_long_parts(const TABLE *table, const size_t max_part_len, std::function< void(const KEY &)> visitor)
Scan through all the keys to identify the key parts which are greater than the maximum size supported...
Definition: dict0dd.cc:1991
bool dd_table_is_upgraded_instant(const dd::Table &table)
Determine if a dd::Table has any INSTANT ADD column(s) in V1.
Definition: dict0dd.h:421
void dd_set_discarded(dd::Table &table, bool discard)
Sets appropriate discard attribute of dd::Table Please note that this function must not be called on ...
Definition: dict0dd.cc:6904
bool dd_tablespace_set_id_and_state(const char *space_name, space_id_t space_id, dd_space_states state)
Set Space ID and state attribute in se_private_data of mysql.tablespaces for the named tablespace.
Definition: dict0dd.cc:6883
void dd_write_default_value(const dict_col_t *col, dd::Column *dd_col)
Write default value of a column to dd::Column.
Definition: dict0dd.cc:2420
bool is_renamed(const Alter_inplace_info *ha_alter_info, const char *old_name, std::string &new_name)
Check if given column is renamed during ALTER.
Definition: dict0dd.cc:1756
void dd_table_close(dict_table_t *table, THD *thd, MDL_ticket **mdl, bool dict_locked)
Close an internal InnoDB table handle.
Definition: dict0dd.cc:1087
void dd_update_v_cols(dd::Table *dd_table, table_id_t id)
Update virtual columns with new se_private_data, currently, only table_id is set.
Definition: dict0dd.cc:2803
const rec_t * dd_startscan_system(THD *thd, MDL_ticket **mdl, btr_pcur_t *pcur, mtr_t *mtr, const char *system_table_name, dict_table_t **table)
Scan a new dd system table, like mysql.tables...
Definition: dict0dd.cc:5494
const rec_t * dd_getnext_system_rec(btr_pcur_t *pcur, mtr_t *mtr)
Get next record of new DD system tables.
Definition: dict0dd.cc:5479
bool dd_table_has_instant_drop_cols(const dd::Table &table)
Determine if dd::Table has INSTANT DROPPED columns.
Definition: dict0dd.h:450
uint64_t dd_get_version(const dd::Table *dd_table)
Get the version attribute.
Definition: dict0dd.ic:341
dd_space_states dd_tablespace_get_state_enum(const dd::Tablespace *dd_space, space_id_t space_id=SPACE_UNKNOWN)
Get the enum for the state of the undo tablespace from either dd::Tablespace::se_private_data or undo...
Definition: dict0dd.cc:6947
bool dd_instant_columns_consistent(const dd::Table &dd_table)
Check if the instant columns are consistent with the se_private_data in dd::Table.
Definition: dict0dd.cc:1923
const Index * dd_first(const Table *table)
Get the first index of a table or partition.
Definition: dict0dd.h:676
bool dd_tablespace_update_cache(THD *thd)
Update all InnoDB tablespace cache objects.
Definition: dict0dd.cc:7161
void get_field_types(const dd::Table *dd_tab, const dict_table_t *m_table, const Field *field, unsigned &col_len, ulint &mtype, ulint &prtype)
Get the mtype, prtype and len for a field.
Definition: dict0dd.cc:3521
bool dd_part_is_first(const dd::Partition *dd_part)
Determine if a dd::Partition is the first leaf partition in the table.
Definition: dict0dd.h:388
static const dd::String_type dd_tablespaces_name("mysql/tablespaces")
static bool dd_mdl_acquire(THD *thd, MDL_ticket **mdl, const char *db, const char *table)
Acquire a shared metadata lock.
bool dd_rename_fts_table(const dict_table_t *table, const char *old_name)
Rename dd table & tablespace files for fts aux table.
Definition: dict0dd.cc:6776
bool dd_table_part_has_instant_cols(const dd::Table &table)
Determine if any partition of the table still has instant columns.
Definition: dict0dd.h:597
static const char * get_row_format_name(enum row_type row_format)
Return a display name for the row format.
Definition: dict0dd.ic:264
dberr_t dd_table_check_for_child(dd::cache::Dictionary_client *client, const char *tbl_name, const char **col_names, dict_table_t *m_table, bool check_charsets, dict_err_ignore_t ignore_err, dict_names_t *fk_tables)
Load foreign key constraint for the table.
Definition: dict0dd.cc:4512
bool dd_process_dd_tablespaces_rec(mem_heap_t *heap, const rec_t *rec, space_id_t *space_id, char **name, uint32_t *flags, uint32_t *server_version, uint32_t *space_version, bool *is_encrypted, uint64_t *autoextend_size, dd::String_type *state, dict_table_t *dd_spaces)
Process one mysql.tablespaces record and get info.
Definition: dict0dd.cc:6169
void release_uncached_table(TABLE_SHARE *ts, TABLE *td)
free uncached table definition.
Definition: dict0dd.cc:370
const char * dd_process_dd_tables_rec_and_mtr_commit(mem_heap_t *heap, const rec_t *rec, dict_table_t **table, dict_table_t *dd_tables, MDL_ticket **mdl, mtr_t *mtr)
Process one mysql.tables record and get the dict_table_t.
Definition: dict0dd.cc:5528
void fill_dict_dropped_columns(const dd::Table *dd_table, dict_table_t *dict_table, uint32_t &current_row_version, mem_heap_t *heap)
Add definition of INSTANT dropped column in table cache.
Definition: dict0dd.cc:3678
int dd_table_open_on_dd_obj(THD *thd, dd::cache::Dictionary_client *client, const dd::Table &dd_table, const dd::Partition *dd_part, const char *tbl_name, dict_table_t *&table, const TABLE *td)
Instantiate an InnoDB in-memory table metadata (dict_table_t) based on a Global DD object or MYSQL ta...
Definition: dict0dd.cc:375
void dd_parse_default_value(const dd::Properties &se_private_data, dict_col_t *col, mem_heap_t *heap)
Parse the default value from dd::Column::se_private to dict_col_t.
Definition: dict0dd.cc:2441
void dd_get_meta_data_filename(dict_table_t *table, dd::Table *dd_table, char *filename, ulint max_len)
Get the meta-data filename from the table name for a single-table tablespace.
Definition: dict0dd.cc:4761
void dd_mdl_release(THD *thd, MDL_ticket **mdl)
Release a metadata lock.
Definition: dict0dd.cc:299
void dd_copy_table(const Alter_inplace_info *ha_alter_info, dd::Table &new_table, const dd::Table &old_table)
Copy the metadata of a table definition, including the INSTANT ADD COLUMN information.
Definition: dict0dd.h:770
static dd::Column * dd_add_hidden_column(dd::Table *dd_table, const char *name, uint length, dd::enum_column_types type)
Add a hidden column when creating a table.
Definition: dict0dd.ic:90
static const dd::String_type dd_columns_name("mysql/columns")
bool dd_create_tablespace(dd::cache::Dictionary_client *dd_client, const char *dd_space_name, space_id_t space_id, uint32_t flags, const char *filename, bool discarded, dd::Object_id &dd_space_id)
Create metadata for specified tablespace, acquiring exclusive MDL first.
Definition: dict0dd.cc:4043
dd::Object_id dd_get_space_id(const dd::Table &table)
Get the explicit dd::Tablespace::id of a table.
Definition: dict0dd.h:711
void dd_part_adjust_table_id(dd::Table *new_table)
Adjust TABLE_ID for partitioned table after ALTER TABLE ... PARTITION.
Definition: dict0dd.cc:1841
static bool is_system_column(const char *col_name)
Definition: dict0dd.h:464
static dd::Index * dd_set_hidden_unique_index(dd::Index *index, const char *name, const dd::Column *column)
Initialize a hidden unique B-tree index.
Definition: dict0dd.ic:132
static const dd::String_type data_file_name_key("data_file_name")
dd::Partition::options() key for DATA DIRECTORY
Data dictionary access.
Data dictionary system.
std::deque< const char *, ut::allocator< const char * > > dict_names_t
A stack of table names related through foreign key constraints.
Definition: dict0load.h:50
Data dictionary memory object creation.
Data dictionary global types.
ib_id_t space_index_t
Index identifier (unique within a tablespace).
Definition: dict0types.h:234
dict_err_ignore_t
Error to ignore when we load table dictionary into memory.
Definition: dict0types.h:294
ib_id_t table_id_t
Table or partition identifier (unique within an InnoDB instance).
Definition: dict0types.h:232
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:222
constexpr space_id_t SPACE_UNKNOWN
Unknown space id.
Definition: fil0fil.h:1137
static int flags[50]
Definition: hp_test1.cc:40
Header for compiler-dependent features.
#define MY_COMPILER_DIAGNOSTIC_PUSH()
save the compiler's diagnostic (enabled warnings, errors, ...) state
Definition: my_compiler.h:296
#define MY_COMPILER_DIAGNOSTIC_POP()
restore the compiler's diagnostic (enabled warnings, errors, ...) state
Definition: my_compiler.h:297
#define MY_COMPILER_CLANG_WORKAROUND_TPARAM_DOCBUG()
ignore -Wdocumentation compiler warnings for @tparam.
Definition: my_compiler.h:319
static char * server_version
Definition: mysql.cc:109
Common definition between mysql server & client.
Log error(cerr, "ERROR")
#define MYSQL_VERSION_ID
Definition: mysql_version.h:15
static char * path
Definition: mysqldump.cc:137
std::string HARNESS_EXPORT foreground(Color c)
get 'change foreground color' ESC sequence.
Definition: vt100.cc:133
const std::string charset("charset")
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
unsigned long long Object_id
Definition: object_id.h:31
const Object_id INVALID_OBJECT_ID
The default object ID which represents that the DD object is new and not persistent in dictionary tab...
Definition: object_id.h:37
enum_column_types
Definition: column.h:53
bool is_encrypted(const String_type &type)
Definition: dd_table.h:421
Char_string_template< String_type_allocator > String_type
Definition: string_type.h:51
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
const char * table_name
Definition: rules_table_service.cc:56
Definition: gcs_xcom_synode.h:64
void delete_arr(T *ptr) noexcept
Releases storage which has been dynamically allocated through any of the ut::new_arr*() variants.
Definition: ut0new.h:1109
const char * filename
Definition: pfs_example_component_population.cc:67
byte rec_t
Definition: rem0types.h:41
required uint64 version
Definition: replication_group_member_actions.proto:41
required string type
Definition: replication_group_member_actions.proto:34
InnoDB session state tracker.
row_type
Definition: handler.h:676
case opt name
Definition: sslopt-case.h:33
Definition: m_ctype.h:385
Struct to hold information about the table that should be created.
Definition: handler.h:3045
This structure is shared between different table objects.
Definition: table.h:690
Definition: table.h:1399
Definition: btr0pcur.h:99
Data structure for a column in a table.
Definition: dict0mem.h:489
Data structure for an index.
Definition: dict0mem.h:1046
Data structure for a database table.
Definition: dict0mem.h:1909
Hard-coded data dictionary information.
Definition: dict0dd.h:286
const char * name
Data dictionary table name.
Definition: dict0dd.h:288
const uint n_indexes
Number of indexes.
Definition: dict0dd.h:290
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:177
Definition: trx0trx.h:684
unsigned int uint
Definition: uca9-dump.cc:75
Version control for database, common definitions, and include files.
#define IF_DEBUG(...)
Definition: univ.i:674
unsigned long int ulint
Definition: univ.i:406
#define INNODB_DD_TABLE(name, n_indexes)
Hard-coded data dictionary entry.
Definition: univ.i:646
#define UT_ARR_SIZE(a)
Definition: univ.i:524
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:69
static int is_config(cargo_type x)
Definition: xcom_base.cc:2158