MySQL 9.7.0
Source Code Documentation
table.h
Go to the documentation of this file.
1#ifndef TABLE_INCLUDED
2#define TABLE_INCLUDED
3
4/* Copyright (c) 2000, 2026, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27#include <assert.h>
28#include <string.h>
29#include <sys/types.h>
30#include <string>
31
32#include "field_types.h"
33#include "lex_string.h"
34#include "map_helpers.h"
35#include "mem_root_deque.h"
36#include "my_alloc.h"
37#include "my_base.h"
38#include "my_bitmap.h"
39#include "my_compiler.h"
40#include "mysql/binlog/event/table_id.h" // Table_id
41
42#include "my_inttypes.h"
43#include "my_sys.h"
44#include "my_table_map.h"
48#include "sql/auth/auth_acls.h" // Access_bitmask
49#include "sql/dd/types/foreign_key.h" // dd::Foreign_key::enum_rule
50#include "sql/enum_query_type.h" // enum_query_type
52#include "sql/key.h"
53#include "sql/key_spec.h"
54#include "sql/mdl.h" // MDL_wait_for_subgraph
55#include "sql/mem_root_array.h"
56#include "sql/mysqld_cs.h"
57#include "sql/opt_costmodel.h" // Cost_model_table
58#include "sql/partition_info.h"
59#include "sql/record_buffer.h" // Record_buffer
60#include "sql/sql_bitmap.h" // Bitmap
61#include "sql/sql_const.h"
62#include "sql/sql_list.h"
63#include "sql/sql_plist.h"
64#include "sql/sql_plugin_ref.h"
65#include "sql/sql_sort.h" // Sort_result
66#include "sql/tablesample.h"
67#include "thr_lock.h"
68#include "typelib.h"
69
70class Field;
71class Field_longlong;
72
73namespace histograms {
74class Histogram;
75} // namespace histograms
76
79class Field_json;
80/* Structs that defines the TABLE */
81class File_parser;
82class Value_generator;
83class GRANT_TABLE;
84class Handler_share;
85class Index_hint;
86class Item;
87class Item_ident;
88class Item_field;
91class Json_wrapper;
93class Name_string;
94class Opt_hints_qb;
95class Opt_hints_table;
97class Query_block;
100class SortingIterator;
101class String;
102class THD;
104class Table_histograms;
106class Table_ref;
108class Temp_table_param;
109class Trigger;
110class handler;
111class partition_info;
112enum enum_stats_auto_recalc : int;
113enum Value_generator_source : short;
114enum row_type : int;
115struct AccessPath;
116struct BytesPerTableRow;
117struct COND_EQUAL;
118struct HA_CREATE_INFO;
119struct LEX;
120struct NESTED_JOIN;
122struct TABLE;
123struct TABLE_SHARE;
124struct handlerton;
126using plan_idx = int;
127
128namespace dd {
129class Table;
130class View;
131
132enum class enum_table_type;
133} // namespace dd
135
139
143
144namespace jdv {
145class Content_tree_node;
146} // namespace jdv
147
149
151
152enum class enum_json_diff_operation;
153
155
157
159
160[[nodiscard]] const Table_ref *jdv_root_base_table(const Table_ref *);
161
162#define store_record(A, B) \
163 memcpy((A)->B, (A)->record[0], (size_t)(A)->s->reclength)
164#define restore_record(A, B) \
165 memcpy((A)->record[0], (A)->B, (size_t)(A)->s->reclength)
166#define cmp_record(A, B) \
167 memcmp((A)->record[0], (A)->B, (size_t)(A)->s->reclength)
168
169#define tmp_file_prefix "#sql" /**< Prefix for tmp tables */
170#define tmp_file_prefix_length 4
171#define TMP_TABLE_KEY_EXTRA 8
172#define PLACEHOLDER_TABLE_ROW_ESTIMATE 2
173
174/**
175 Enumerate possible types of a table from re-execution
176 standpoint.
177 Table_ref class has a member of this type.
178 At prepared statement prepare, this member is assigned a value
179 as of the current state of the database. Before (re-)execution
180 of a prepared statement, we check that the value recorded at
181 prepare matches the type of the object we obtained from the
182 table definition cache.
183
184 @sa check_and_update_table_version()
185 @sa Execute_observer
186 @sa Prepared_statement::reprepare()
187*/
188
190 /** Initial value set by the parser */
197
198/**
199 Enumerate possible status of a identifier name while determining
200 its validity
201*/
203
204/*************************************************************************/
205
206/**
207 Object_creation_ctx -- interface for creation context of database objects
208 (views, stored routines, events, triggers). Creation context -- is a set
209 of attributes, that should be fixed at the creation time and then be used
210 each time the object is parsed or executed.
211*/
212
214 public:
216
217 void restore_env(THD *thd, Object_creation_ctx *backup_ctx);
218
219 protected:
221 virtual Object_creation_ctx *create_backup_ctx(THD *thd) const = 0;
222 virtual void delete_backup_ctx() = 0;
223
224 virtual void change_env(THD *thd) const = 0;
225
226 public:
227 virtual ~Object_creation_ctx() = default;
228};
229
230/*************************************************************************/
231
232/**
233 Default_object_creation_ctx -- default implementation of
234 Object_creation_ctx.
235*/
236
238 public:
240
242
243 protected:
245
247 const CHARSET_INFO *connection_cl);
248
249 protected:
250 Object_creation_ctx *create_backup_ctx(THD *thd) const override;
251 void delete_backup_ctx() override;
252
253 void change_env(THD *thd) const override;
254
255 protected:
256 /**
257 client_cs stores the value of character_set_client session variable.
258 The only character set attribute is used.
259
260 Client character set is included into query context, because we save
261 query in the original character set, which is client character set. So,
262 in order to parse the query properly we have to switch client character
263 set on parsing.
264 */
266
267 /**
268 connection_cl stores the value of collation_connection session
269 variable. Both character set and collation attributes are used.
270
271 Connection collation is included into query context, because it defines
272 the character set and collation of text literals in internal
273 representation of query (item-objects).
274 */
276};
277
278/**
279 View_creation_ctx -- creation context of view objects.
280*/
281
283 public:
284 static View_creation_ctx *create(THD *thd);
285
286 static View_creation_ctx *create(THD *thd, Table_ref *view);
287
288 private:
290};
291
292/*************************************************************************/
293
294/** Order clause list element */
295
297
298struct ORDER {
299 ORDER() {}
300 explicit ORDER(Item *grouped_expr) : item_initial(grouped_expr) {}
301
302 /// @returns true if item pointer is same as original
303 bool is_item_original() const { return item[0] == item_initial; }
304
305 ORDER *next{nullptr};
306
307 /**
308 If the query block includes non-primitive grouping, then these modifiers are
309 represented as grouping sets. The variable 'grouping_set_info' functions as
310 a bitvector, containing the grouping set details. If the 'ith' bit of the
311 variable is set, then the corresponding element is included in the 'ith'
312 grouping set. */
314 /**
315 The initial ordering expression. Usually substituted during resolving
316 and must not be used during optimization and execution.
317 */
318 Item *item_initial{nullptr}; /* Storage for initial item */
319
320 public:
321 /**
322 Points at the item in the select fields. Note that this means that
323 after resolving, it points into a slice (see JOIN::ref_items),
324 even though the item is not of type Item_ref!
325 */
327
329
331 ORDER_NOT_RELEVANT}; /* Requested direction of ordering */
332 bool in_field_list{false}; /* true if in select field list */
333 /**
334 Tells whether this ORDER element was referenced with an alias or with an
335 expression in the query, and what the alias was:
336 SELECT a AS foo GROUP BY foo: "foo".
337 SELECT a AS foo GROUP BY a: nullptr.
338 */
339 const char *used_alias{nullptr};
340 /**
341 When GROUP BY is implemented with a temporary table (i.e. the table takes
342 care to store only unique group rows, table->group != nullptr), each GROUP
343 BY expression is stored in a column of the table, which is
344 'field_in_tmp_table'.
345 Such field may point into table->record[0] (if we only use it to get its
346 value from a tmp table's row), or into 'buff' (if we use it to do index
347 lookup into the tmp table).
348 */
350 char *buff{nullptr}; /* If tmp-table group */
352 bool is_explicit{false}; /* Whether ASC/DESC is explicitly specified */
353};
354
355/**
356 State information for internal tables grants.
357 This structure is part of the Table_ref, and is updated
358 during the ACL check process.
359 @sa GRANT_INFO
360*/
362 /** True if the internal lookup by schema name was done. */
364 /** Cached internal schema access. */
366 /** True if the internal lookup by table name was done. */
368 /** Cached internal table access. */
370};
371
372/**
373 @brief The current state of the privilege checking process for the current
374 user, SQL statement and SQL object.
375
376 @details The privilege checking process is divided into phases depending on
377 the level of the privilege to be checked and the type of object to be
378 accessed. Due to the mentioned scattering of privilege checking
379 functionality, it is necessary to keep track of the state of the process.
380
381 A GRANT_INFO also serves as a cache of the privilege hash tables. Relevant
382 members are grant_table and version.
383 */
385 GRANT_INFO();
386 /**
387 @brief A copy of the privilege information regarding the current host,
388 database, object and user.
389
390 @details The version of this copy is found in GRANT_INFO::version.
391 */
393 /**
394 @brief Used for cache invalidation when caching privilege information.
395
396 @details The privilege information is stored on disk, with dedicated
397 caches residing in memory: table-level and column-level privileges,
398 respectively, have their own dedicated caches.
399
400 The GRANT_INFO works as a level 1 cache with this member updated to the
401 current value of the global variable @c grant_version (@c static variable
402 in sql_acl.cc). It is updated Whenever the GRANT_INFO is refreshed from
403 the level 2 cache. The level 2 cache is the @c column_priv_hash structure
404 (@c static variable in sql_acl.cc)
405
406 @see grant_version
407 */
408 uint version{0};
409 /**
410 @brief The set of privileges that the current user has fulfilled for a
411 certain host, database, and object.
412
413 @details This field is continually updated throughout the access checking
414 process. In each step the "wanted privilege" is checked against the
415 fulfilled privileges. When/if the intersection of these sets is empty,
416 access is granted.
417
418 The set is implemented as a bitmap, with the bits defined in sql_acl.h.
419 */
421 /** The grant state for internal tables. */
423};
424
432
433/**
434 Category of table found in the table share.
435*/
437 /**
438 Unknown value.
439 */
441
442 /**
443 Temporary table.
444 The table is visible only in the session.
445 Therefore,
446 - FLUSH TABLES WITH READ LOCK
447 - SET GLOBAL READ_ONLY = ON
448 do not apply to this table.
449 Note that LOCK TABLE t FOR READ/WRITE
450 can be used on temporary tables.
451 Temporary tables are not part of the table cache.
452
453 2016-06-14 Contrary to what's written in these comments, the truth is:
454 - tables created by CREATE TEMPORARY TABLE have TABLE_CATEGORY_USER
455 - tables created by create_tmp_table() (internal ones) have
456 TABLE_CATEGORY_TEMPORARY.
457 ha_innodb.cc relies on this observation (so: grep it). If you clean this
458 up, you may also want to look at 'no_tmp_table'; its enum values' meanings
459 have degraded over time: INTERNAL_TMP_TABLE is not used for some internal
460 tmp tables (derived tables). Unification of both enums would be
461 great. Whatever the result, we need to be able to distinguish the two
462 types of temporary tables above, as usage patterns are more restricted for
463 the second type, and allow more optimizations.
464 */
466
467 /**
468 User table.
469 These tables do honor:
470 - LOCK TABLE t FOR READ/WRITE
471 - FLUSH TABLES WITH READ LOCK
472 - SET GLOBAL READ_ONLY = ON
473 User tables are cached in the table cache.
474 */
476
477 /**
478 System table, maintained by the server.
479 These tables do honor:
480 - LOCK TABLE t FOR READ/WRITE
481 - FLUSH TABLES WITH READ LOCK
482 - SET GLOBAL READ_ONLY = ON
483 Typically, writes to system tables are performed by
484 the server implementation, not explicitly be a user.
485 System tables are cached in the table cache.
486 */
488
489 /**
490 Information schema tables.
491 These tables are an interface provided by the system
492 to inspect the system metadata.
493 These tables do *not* honor:
494 - LOCK TABLE t FOR READ/WRITE
495 - FLUSH TABLES WITH READ LOCK
496 - SET GLOBAL READ_ONLY = ON
497 as there is no point in locking explicitly
498 an INFORMATION_SCHEMA table.
499 Nothing is directly written to information schema tables.
500 Note that this value is not used currently,
501 since information schema tables are not shared,
502 but implemented as session specific temporary tables.
503 */
504 /*
505 TODO: Fixing the performance issues of I_S will lead
506 to I_S tables in the table cache, which should use
507 this table type.
508 */
510
511 /**
512 Log tables.
513 These tables are an interface provided by the system
514 to inspect the system logs.
515 These tables do *not* honor:
516 - LOCK TABLE t FOR READ/WRITE
517 - FLUSH TABLES WITH READ LOCK
518 - SET GLOBAL READ_ONLY = ON
519 as there is no point in locking explicitly
520 a LOG table.
521 An example of LOG tables are:
522 - mysql.slow_log
523 - mysql.general_log,
524 which *are* updated even when there is either
525 a GLOBAL READ LOCK or a GLOBAL READ_ONLY in effect.
526 User queries do not write directly to these tables
527 (there are exceptions for log tables).
528 The server implementation perform writes.
529 Log tables are cached in the table cache.
530 */
532
533 /**
534 Performance schema tables.
535 These tables are an interface provided by the system
536 to inspect the system performance data.
537 These tables do *not* honor:
538 - LOCK TABLE t FOR READ/WRITE
539 - FLUSH TABLES WITH READ LOCK
540 - SET GLOBAL READ_ONLY = ON
541 as there is no point in locking explicitly
542 a PERFORMANCE_SCHEMA table.
543 An example of PERFORMANCE_SCHEMA tables are:
544 - performance_schema.*
545 which *are* updated (but not using the handler interface)
546 even when there is either
547 a GLOBAL READ LOCK or a GLOBAL READ_ONLY in effect.
548 User queries do not write directly to these tables
549 (there are exceptions for SETUP_* tables).
550 The server implementation perform writes.
551 Performance tables are cached in the table cache.
552 */
554
555 /**
556 Replication Information Tables.
557 These tables are used to store replication information.
558 These tables do *not* honor:
559 - LOCK TABLE t FOR READ/WRITE
560 - FLUSH TABLES WITH READ LOCK
561 - SET GLOBAL READ_ONLY = ON
562 as there is no point in locking explicitly
563 a Replication Information table.
564 An example of replication tables are:
565 - mysql.slave_master_info
566 - mysql.slave_relay_log_info,
567 which *are* updated even when there is either
568 a GLOBAL READ LOCK or a GLOBAL READ_ONLY in effect.
569 User queries do not write directly to these tables.
570 Replication tables are cached in the table cache.
571 */
573
574 /**
575 Gtid Table.
576 The table is used to store gtids.
577 The table does *not* honor:
578 - LOCK TABLE t FOR READ/WRITE
579 - FLUSH TABLES WITH READ LOCK
580 - SET GLOBAL READ_ONLY = ON
581 as there is no point in locking explicitly
582 a Gtid table.
583 An example of gtid_executed table is:
584 - mysql.gtid_executed,
585 which is updated even when there is either
586 a GLOBAL READ LOCK or a GLOBAL READ_ONLY in effect.
587 Gtid table is cached in the table cache.
588 */
590
591 /**
592 A data dictionary table.
593 Table's with this category will skip checking the
594 TABLE_SHARE versions because these table structures
595 are fixed upon server bootstrap.
596 */
598
599 /**
600 A ACL metadata table.
601 For table in this category we will skip row locks when SQL statement
602 reads them.
603 */
607
608extern ulong refresh_version;
609
614};
615
617 uint count;
619};
620
622 protected:
624 virtual void report_error(uint code, const char *fmt, ...) = 0;
625
626 public:
628 virtual ~Table_check_intact() = default;
629
630 /**
631 Checks whether a table is intact. Should be done *just* after the table has
632 been opened.
633
634 @param[in] thd Thread handle
635 @param[in] table The table to check
636 @param[in] table_def Expected structure of the table (column name
637 and type)
638
639 @retval false OK
640 @retval true There was an error.
641 */
642 bool check(THD *thd, TABLE *table, const TABLE_FIELD_DEF *table_def);
643};
644
645/**
646 Class representing the fact that some thread waits for table
647 share to be flushed. Is used to represent information about
648 such waits in MDL deadlock detector.
649*/
650
655
656 public:
658 uint deadlock_weight_arg)
659 : m_ctx(ctx_arg),
660 m_share(share_arg),
661 m_deadlock_weight(deadlock_weight_arg) {}
662
663 MDL_context *get_ctx() const { return m_ctx; }
664
665 bool accept_visitor(MDL_wait_for_graph_visitor *dvisitor) override;
666
667 uint get_deadlock_weight() const override;
668
669 /**
670 Pointers for participating in the list of waiters for table share.
671 */
674};
675
676typedef I_P_List<
681
686 /**
687 Name of unique key matching FK in parent table, "" if there is no
688 unique key.
689 */
693
694 /**
695 Array with names of referencing columns of the FK.
696 */
698
699 /**
700 Array with names of referenced columns of the FK.
701 */
704
706 /**
707 Since referenced_column_names and referencing_column_names are already
708 stored in TABLE_SHARE_FOREIGN_KEY_INFO, we avoid duplicating them here and
709 only add fk_name, allowing check_all_child_fk_ref() to use fk_name to
710 retrieve the column details from the child table share
711 */
715
718
719/**
720 Definition of name for generated keys, owned by TABLE_SHARE
721*/
722struct Key_name {
724};
725
726/**
727 This structure is shared between different table objects. There is one
728 instance of table share per one table in the database.
729*/
730
732 TABLE_SHARE() = default;
733
734 /**
735 Create a new TABLE_SHARE with the given version number.
736 @param version the version of the TABLE_SHARE
737 @param secondary set to true if the TABLE_SHARE represents a table
738 in a secondary storage engine
739 */
740 TABLE_SHARE(unsigned long version, bool secondary)
741 : m_version(version), m_secondary_engine(secondary) {}
742
743 /*
744 Managed collection of refererence-counted snapshots of histograms statistics
745 for the table. TABLE objects acquire/release pointers to histogram
746 statistics from this collection. A new statistics snapshot is inserted when
747 the share is initialized and when histograms are updated/dropped.
748
749 For temporary tables m_histograms should be nullptr since we do not support
750 histograms on temporary tables.
751 */
753
754 /** Category of this table. */
756
758 /**
759 Used to allocate new handler for internal temporary table when the
760 size limitation of the primary storage engine is exceeded.
761 */
763
764 TYPELIB keynames; /* Pointers to keynames */
765 TYPELIB *intervals{nullptr}; /* pointer to interval info */
766 mysql_mutex_t LOCK_ha_data; /* To protect access to ha_data */
767 TABLE_SHARE *next{nullptr}, **prev{nullptr}; /* Link to unused shares */
768 /**
769 Array of table_cache_instances pointers to elements of table caches
770 respresenting this table in each of Table_cache instances.
771 Allocated along with the share itself in alloc_table_share().
772 Each element of the array is protected by Table_cache::m_lock in the
773 corresponding Table_cache. False sharing should not be a problem in
774 this case as elements of this array are supposed to be updated rarely.
775 */
777
778 /* The following is copied to each TABLE on OPEN */
779 Field **field{nullptr};
781 KEY *key_info{nullptr}; /* data of keys defined for the table */
782 uint *blob_field{nullptr}; /* Index to blobs in Field array */
783
784 uchar *default_values{nullptr}; /* row with default values */
785 LEX_STRING comment{nullptr, 0}; /* Comment about table */
786 LEX_STRING compress{nullptr, 0}; /* Compression algorithm */
787 LEX_STRING encrypt_type{nullptr, 0}; /* encryption algorithm */
788
789 /** Secondary storage engine. */
791 /** Secondary engine load status */
792 bool secondary_load{false};
793
795 nullptr}; /* Default charset of string fields */
796
798 /*
799 Key which is used for looking-up table in table cache and in the list
800 of thread's temporary tables. Has the form of:
801 "database_name\0table_name\0" + optional part for temporary tables.
802
803 Note that all three 'table_cache_key', 'db' and 'table_name' members
804 must be set (and be non-zero) for tables in table cache. They also
805 should correspond to each other.
806 To ensure this one can use set_table_cache() methods.
807 */
809 LEX_CSTRING db{nullptr, 0}; /* Pointer to db */
810 LEX_CSTRING table_name{nullptr, 0}; /* Table name (for open) */
811 LEX_STRING path{nullptr, 0}; /* Path to .frm file (from datadir) */
812 LEX_CSTRING normalized_path{nullptr, 0}; /* unpack_filename(path) */
814
817
818 /**
819 The set of indexes that are not disabled for this table. I.e. it excludes
820 indexes disabled by `ALTER TABLE ... DISABLE KEYS`, however it does
821 include invisible indexes. The data dictionary populates this bitmap.
822 */
824
825 /// The set of visible and enabled indexes for this table.
828 ha_rows min_rows{0}, max_rows{0}; /* create information */
829 ulong avg_row_length{0}; /* create information */
830 ulong mysql_version{0}; /* 0 if .frm is created before 5.0 */
831 ulong reclength{0}; /* Recordlength */
832 ulong stored_rec_length{0}; /* Stored record length
833 (no generated-only generated fields) */
835
836 plugin_ref db_plugin{nullptr}; /* storage engine plugin */
837 inline handlerton *db_type() const /* table_type for handler */
838 {
839 // assert(db_plugin);
840 return db_plugin ? plugin_data<handlerton *>(db_plugin) : nullptr;
841 }
842 /**
843 Value of ROW_FORMAT option for the table as provided by user.
844 Can be different from the real row format used by the storage
845 engine. ROW_TYPE_DEFAULT value indicates that no explicit
846 ROW_FORMAT was specified for the table. @sa real_row_type.
847 */
848 enum row_type row_type = {}; // Zero-initialized to ROW_TYPE_DEFAULT
849 /** Real row format used for the table by the storage engine. */
850 enum row_type real_row_type = {}; // Zero-initialized to ROW_TYPE_DEFAULT
852
853 /**
854 Only for internal temporary tables.
855 Count of TABLEs (having this TABLE_SHARE) which have a "handler"
856 (table->file!=nullptr) which is open (ha_open() has been called).
857 */
859
860 /**
861 Only for internal temporary tables.
862 Count of TABLEs (having this TABLE_SHARE) which have opened this table.
863 */
865
866 // Can only be 1,2,4,8 or 16, but use uint32_t since that how it is
867 // represented in InnoDB
868 std::uint32_t key_block_size{0}; /* create key_block_size, if used */
869 uint stats_sample_pages{0}; /* number of pages to sample during
870 stats estimation, if used, otherwise 0. */
872 stats_auto_recalc{}; /* Automatic recalc of stats.
873 Zero-initialized to HA_STATS_AUTO_RECALC_DEFAULT
874 */
876 uint fields{0}; /* Number of fields */
877 uint rec_buff_length{0}; /* Size of table->record[] buffer */
878 uint keys{0}; /* Number of keys defined for the table*/
879 uint key_parts{0}; /* Number of key parts of all keys
880 defined for the table
881 */
882 uint max_key_length{0}; /* Length of the longest key */
883 uint max_unique_length{0}; /* Length of the longest unique key */
885 /**
886 Whether this is a temporary table that already has a UNIQUE index (removing
887 duplicate rows on insert), so that the optimizer does not need to run
888 DISTINCT itself. Also used for INTERSECT and EXCEPT as a fall-back if
889 hashing fails (secondary overflow of in-memory hash table, in which case
890 we revert to de-duplication using the unique key in the output table).
891 */
892 bool is_distinct{false};
893
894 uint null_fields{0}; /* number of null fields */
895 uint blob_fields{0}; /* number of blob fields */
896 uint varchar_fields{0}; /* number of varchar fields */
897 /**
898 For materialized derived tables; @see add_derived_key().
899 'first' means: having the lowest position in key_info.
900 */
902 /**
903 For materialized derived tables: allocated size of key_info array.
904 */
906 /**
907 For materialized derived tables: allocated size of base_key_parts array of
908 all TABLE objects. Used for generated keys.
909 */
911 /**
912 Array of names for generated keys, used for materialized derived tables.
913 Shared among all TABLE objects referring to this table share.
914 */
916 /**
917 Records per key array, used for materialized derived tables.
918 This is a contiguous array, with size given by max_tmp_key_parts.
919 The array is shared with all TABLE objects referring to this table share.
920 */
921 ulong *base_rec_per_key{nullptr};
922 /**
923 Records per key array, float rep., used for materialized derived tables.
924 This is a contiguous array, with size given by max_tmp_key_parts.
925 The array is shared with all TABLE objects referring to this table share.
926 */
928 /**
929 Bitmap with flags representing some of table options/attributes.
930
931 @sa HA_OPTION_PACK_RECORD, HA_OPTION_PACK_KEYS, ...
932
933 @note This is basically copy of HA_CREATE_INFO::table_options bitmap
934 at the time of table opening/usage.
935 */
937 /**
938 Bitmap with flags representing some of table options/attributes which
939 are in use by storage engine.
940
941 @note db_options_in_use is normally copy of db_create_options but can
942 be overridden by SE. E.g. MyISAM does this at handler::open() and
943 handler::info() time.
944 */
946 uint rowid_field_offset{0}; /* Field_nr +1 to rowid field */
947 // Primary key index number, used in TABLE::key_info[]. See
948 // is_missing_primary_key() for more details.
949 uint primary_key{0};
950 uint next_number_index{0}; /* autoincrement key number */
951 uint next_number_key_offset{0}; /* autoinc keypart offset in a key */
952 uint next_number_keypart{0}; /* autoinc keypart number in a key */
953 bool error{false}; /* error during open_table_def() */
955 /// Number of generated fields
956 uint vfields{0};
957 /// Number of fields having the default value generated
959 /// Number of fields having a masking policy.
961 bool system{false}; /* Set if system table (one record) */
962 bool db_low_byte_first{false}; /* Portable row format */
963 bool crashed{false};
964 bool is_view{false};
965 /// Materialized view, materialized directly by a storage engine
967 bool m_open_in_progress{false}; /* True: alloc'ed, false: def opened */
968 mysql::binlog::event::Table_id table_map_id; /* for row-based replication */
969
970 /*
971 Cache for row-based replication table share checks that does not
972 need to be repeated. Possible values are: -1 when cache value is
973 not calculated yet, 0 when table *shall not* be replicated, 1 when
974 table *may* be replicated.
975 */
977
978 /*
979 Storage media to use for this table (unless another storage
980 media has been specified on an individual column - in versions
981 where that is supported)
982 */
984
985 /* Name of the tablespace used for this table */
986 const char *tablespace{nullptr};
987
988 /**
989 Partition meta data. Allocated from TABLE_SHARE::mem_root,
990 created when reading from the dd tables,
991 used as template for each TABLE instance.
992 The reason for having it on the TABLE_SHARE is to be able to reuse the
993 partition_elements containing partition names, values etc. instead of
994 allocating them for each TABLE instance.
995 TODO: Currently it is filled in and then only used for generating
996 the partition_info_str. The plan is to clone/copy/reference each
997 TABLE::part_info instance from it.
998 What is missing before it can be completed:
999 1) The partition expression, currently created only during parsing which
1000 also needs the current TABLE instance as context for name resolution etc.
1001 2) The partition values, currently the DD stores them as text so it needs
1002 to be converted to field images (which is now done by first parsing the
1003 value text into an Item, then saving the Item result/value into a field
1004 and then finally copy the field image).
1005 */
1007 // TODO: Remove these four variables:
1008 /**
1009 Filled in when reading from frm.
1010 This can simply be removed when removing the .frm support,
1011 since it is already stored in the new DD.
1012 */
1013 bool auto_partitioned{false};
1014 /**
1015 Storing the full partitioning clause (PARTITION BY ...) which is used
1016 when creating new partition_info object for each new TABLE object by
1017 parsing this string.
1018 These two will be needed until the missing parts above is fixed.
1019 */
1020 char *partition_info_str{nullptr};
1022
1023 /**
1024 Cache the checked structure of this table.
1025
1026 The pointer data is used to describe the structure that
1027 a instance of the table must have. Each element of the
1028 array specifies a field that must exist on the table.
1029
1030 The pointer is cached in order to perform the check only
1031 once -- when the table is loaded from the disk.
1032 */
1034
1035 /** Main handler's share */
1037
1038 /** Instrumentation for this table share. */
1040
1041 /**
1042 List of tickets representing threads waiting for the share to be flushed.
1043 */
1045
1046 /**
1047 View object holding view definition read from DD. This object is not
1048 cached, and is owned by the table share. We are not able to read it
1049 on demand since we may then get a cache miss while holding LOCK_OPEN.
1050 */
1051 const dd::View *view_object{nullptr};
1052
1053 /**
1054 Data-dictionary object describing explicit temporary table represented
1055 by this share. NULL for other table types (non-temporary tables, internal
1056 temporary tables). This object is owned by TABLE_SHARE and should be
1057 deleted along with it.
1058 */
1060
1061 /// For materialized derived tables; @see add_derived_key().
1063
1064 /**
1065 Arrays with descriptions of foreign keys in which this table participates
1066 as child or parent. We only cache in them information from dd::Table object
1067 which is sufficient for use by prelocking algorithm/to check if table is
1068 referenced by a foreign key.
1069 */
1074
1075 // List of check constraint share instances.
1077
1078 /**
1079 List of trigger descriptions for the table loaded from the data-dictionary.
1080 Is nullptr if the table doesn't have triggers.
1081
1082 @note The purpose of the Trigger objects in this list is to serve as
1083 template for per-TABLE-object Trigger objects as well as to
1084 store static metadata that may be shared between Trigger instances.
1085 The triggers in this list can't be executed directly.
1086 */
1088
1089 /**
1090 Schema's read only mode - ON (true) or OFF (false). This is filled in
1091 when the share is initialized with meta data from DD. If the schema is
1092 altered, the tables and share are removed. This can be done since
1093 ALTER SCHEMA acquires exclusive meta data locks on the tables in the
1094 schema. We set this only for non-temporary tables. Otherwise, the value
1095 of the member below is 'NOT_SET'.
1096 */
1099
1100 /**
1101 Set share's table cache key and update its db and table name appropriately.
1102
1103 @param key_buff Buffer with already built table cache key to be
1104 referenced from share.
1105 @param key_length Key length.
1106
1107 @note
1108 Since 'key_buff' buffer will be referenced from share it should has same
1109 life-time as share itself.
1110 This method automatically ensures that TABLE_SHARE::table_name/db have
1111 appropriate values by using table cache key as their source.
1112 */
1113
1114 void set_table_cache_key(char *key_buff, size_t key_length) {
1115 table_cache_key.str = key_buff;
1116 table_cache_key.length = key_length;
1117 /*
1118 Let us use the fact that the key is "db/0/table_name/0" + optional
1119 part for temporary tables.
1120 */
1122 db.length = strlen(db.str);
1123 table_name.str = db.str + db.length + 1;
1124 table_name.length = strlen(table_name.str);
1125 }
1126
1127 /**
1128 Set share's table cache key and update its db and table name appropriately.
1129
1130 @param key_buff Buffer to be used as storage for table cache key
1131 (should be at least key_length bytes).
1132 @param key Value for table cache key.
1133 @param key_length Key length.
1134
1135 NOTE
1136 Since 'key_buff' buffer will be used as storage for table cache key
1137 it should has same life-time as share itself.
1138 */
1139
1140 void set_table_cache_key(char *key_buff, const char *key, size_t key_length) {
1141 memcpy(key_buff, key, key_length);
1142 set_table_cache_key(key_buff, key_length);
1143 }
1144
1146
1147 /** Returns the version of this TABLE_SHARE. */
1148 unsigned long version() const { return m_version; }
1149
1150 /**
1151 Set the version of this TABLE_SHARE to zero. This marks the
1152 TABLE_SHARE for automatic removal from the table definition cache
1153 once it is no longer referenced.
1154 */
1155 void clear_version();
1156
1157 /** Is this table share being expelled from the table definition cache? */
1158 bool has_old_version() const { return version() != refresh_version; }
1159
1160 /**
1161 Convert unrelated members of TABLE_SHARE to one enum
1162 representing its type.
1163
1164 @todo perhaps we need to have a member instead of a function.
1165 */
1167 if (is_view) return TABLE_REF_VIEW;
1168 switch (tmp_table) {
1169 case NO_TMP_TABLE:
1170 return TABLE_REF_BASE_TABLE;
1171 case SYSTEM_TMP_TABLE:
1172 return TABLE_REF_I_S_TABLE;
1173 default:
1174 return TABLE_REF_TMP_TABLE;
1175 }
1176 }
1177 /**
1178 Return a table metadata version.
1179 * for base tables and views, we return table_map_id.
1180 It is assigned from a global counter incremented for each
1181 new table loaded into the table definition cache (TDC).
1182 * for temporary tables it's table_map_id again. But for
1183 temporary tables table_map_id is assigned from
1184 thd->query_id. The latter is assigned from a thread local
1185 counter incremented for every new SQL statement. Since
1186 temporary tables are thread-local, each temporary table
1187 gets a unique id.
1188 * for everything else (e.g. information schema tables),
1189 the version id is zero.
1190
1191 This choice of version id is a large compromise
1192 to have a working prepared statement validation in 5.1. In
1193 future version ids will be persistent, as described in WL#4180.
1194
1195 Let's try to explain why and how this limited solution allows
1196 to validate prepared statements.
1197
1198 Firstly, sets (in mathematical sense) of version numbers
1199 never intersect for different table types. Therefore,
1200 version id of a temporary table is never compared with
1201 a version id of a view, and vice versa.
1202
1203 Secondly, for base tables and views, we know that each DDL flushes
1204 the respective share from the TDC. This ensures that whenever
1205 a table is altered or dropped and recreated, it gets a new
1206 version id.
1207 Unfortunately, since elements of the TDC are also flushed on
1208 LRU basis, this choice of version ids leads to false positives.
1209 E.g. when the TDC size is too small, we may have a SELECT
1210 * FROM INFORMATION_SCHEMA.TABLES flush all its elements, which
1211 in turn will lead to a validation error and a subsequent
1212 reprepare of all prepared statements. This is
1213 considered acceptable, since as long as prepared statements are
1214 automatically reprepared, spurious invalidation is only
1215 a performance hit. Besides, no better simple solution exists.
1216
1217 For temporary tables, using thd->query_id ensures that if
1218 a temporary table was altered or recreated, a new version id is
1219 assigned. This suits validation needs very well and will perhaps
1220 never change.
1221
1222 Metadata of information schema tables never changes.
1223 Thus we can safely assume 0 for a good enough version id.
1224
1225 Finally, by taking into account table type, we always
1226 track that a change has taken place when a view is replaced
1227 with a base table, a base table is replaced with a temporary
1228 table and so on.
1229
1230 @retval 0 For schema tables, DD tables and system views.
1231 non-0 For bases tables, views and temporary tables.
1232
1233 @sa Table_ref::is_table_ref_id_equal()
1234 */
1236
1237 /** Determine if the table is missing a PRIMARY KEY. */
1239 assert(primary_key <= MAX_KEY);
1240 return primary_key == MAX_KEY;
1241 }
1242
1244 return masking_policy_field_count != 0;
1245 }
1246
1247 uint find_first_unused_tmp_key(const Key_map &k);
1248
1249 bool visit_subgraph(Wait_for_flush *waiting_ticket,
1250 MDL_wait_for_graph_visitor *gvisitor);
1251
1252 bool wait_for_old_version(THD *thd, struct timespec *abstime,
1253 uint deadlock_weight);
1254
1255 /**
1256 The set of indexes that the optimizer may use when creating an execution
1257 plan.
1258 */
1259 Key_map usable_indexes(const THD *thd) const;
1260
1261 /** Release resources and free memory occupied by the table share. */
1262 void destroy();
1263
1264 /**
1265 How many TABLE objects use this TABLE_SHARE.
1266 @return the reference count
1267 */
1268 unsigned int ref_count() const {
1269 assert(assert_ref_count_is_locked(this));
1270 return m_ref_count;
1271 }
1272
1273 /**
1274 Increment the reference count by one.
1275 @return the new reference count
1276 */
1277 unsigned int increment_ref_count() {
1278 assert(assert_ref_count_is_locked(this));
1279 assert(!m_open_in_progress);
1280 return ++m_ref_count;
1281 }
1282
1283 /**
1284 Decrement the reference count by one.
1285 @return the new reference count
1286 */
1287 unsigned int decrement_ref_count() {
1288 assert(assert_ref_count_is_locked(this));
1289 assert(!m_open_in_progress);
1290 assert(m_ref_count > 0);
1291 return --m_ref_count;
1292 }
1293
1294 /// Does this TABLE_SHARE represent a table in a primary storage engine?
1295 bool is_primary_engine() const { return !m_secondary_engine; }
1296
1297 /// Does this TABLE_SHARE represent a table in a secondary storage engine?
1299
1300 /**
1301 Does this TABLE_SHARE represent a primary table that has a shadow
1302 copy in a secondary storage engine?
1303 */
1305 return is_primary_engine() && secondary_engine.str != nullptr;
1306 }
1307
1308 /** Returns whether this table is referenced by a foreign key. */
1310
1311 private:
1312 /// How many TABLE objects use this TABLE_SHARE.
1313 unsigned int m_ref_count{0};
1314
1315 /**
1316 TABLE_SHARE version, if changed the TABLE_SHARE must be reopened.
1317 NOTE: The TABLE_SHARE will not be reopened during LOCK TABLES in
1318 close_thread_tables!!!
1319 */
1320 unsigned long m_version{0};
1321
1322 protected: // To allow access from unit tests.
1323 /// Does this TABLE_SHARE represent a table in a secondary storage engine?
1325};
1326
1327/**
1328 Class is used as a BLOB field value storage for
1329 intermediate GROUP_CONCAT results. Used only for
1330 GROUP_CONCAT with DISTINCT or ORDER BY options.
1331 */
1332
1334 private:
1336 /**
1337 Sign that some values were cut
1338 during saving into the storage.
1339 */
1341
1342 public:
1345
1346 void reset() {
1348 truncated_value = false;
1349 }
1350 /**
1351 Function creates duplicate of 'from'
1352 string in 'storage' MEM_ROOT.
1353
1354 @param from string to copy
1355 @param length string length
1356
1357 @retval Pointer to the copied string.
1358 @retval 0 if an error occurred.
1359 */
1360 char *store(const char *from, size_t length) {
1361 return (char *)memdup_root(&storage, from, length);
1362 }
1365 }
1366 bool is_truncated_value() const { return truncated_value; }
1367};
1368
1369/**
1370 Class that represents a single change to a column value in partial
1371 update of a JSON column.
1372*/
1373class Binary_diff final {
1374 /// The offset of the start of the change.
1375 size_t m_offset;
1376
1377 /// The size of the portion that is to be replaced.
1378 size_t m_length;
1379
1380 public:
1381 /**
1382 Create a new Binary_diff object.
1383
1384 @param offset the offset of the beginning of the change
1385 @param length the length of the section that is to be replaced
1386 */
1387 Binary_diff(size_t offset, size_t length)
1389
1390 /// @return the offset of the changed data
1391 size_t offset() const { return m_offset; }
1392
1393 /// @return the length of the changed data
1394 size_t length() const { return m_length; }
1395
1396 /**
1397 Get a pointer to the start of the replacement data.
1398
1399 @param field the column that is updated
1400 @return a pointer to the start of the replacement data
1401 */
1402 const char *new_data(const Field *field) const;
1403
1404 /**
1405 Get a pointer to the start of the old data to be replaced.
1406
1407 @param field the column that is updated
1408 @return a pointer to the start of old data to be replaced.
1409 */
1410 const char *old_data(const Field *field) const;
1411};
1412
1413/**
1414 Vector of Binary_diff objects.
1415
1416 The Binary_diff objects in the vector should be ordered on offset, and none
1417 of the diffs should be overlapping or adjacent.
1418*/
1420
1421/**
1422 Flags for TABLE::m_status (maximum 8 bits).
1423 The flags define the state of the row buffer in TABLE::record[0].
1424*/
1425/**
1426 STATUS_NOT_STARTED is set when table is not accessed yet.
1427 Neither STATUS_NOT_FOUND nor STATUS_NULL_ROW can be set when this flag is set.
1428*/
1429#define STATUS_NOT_STARTED 1
1430/**
1431 Means we were searching for a row and didn't find it. This is used by
1432 storage engines (@see handler::index_read_map()) and the executor, both
1433 when doing an exact row lookup and advancing a scan (no more rows in range).
1434*/
1435#define STATUS_NOT_FOUND 2
1436/// Reserved for use by multi-table update. Means the row has been updated.
1437#define STATUS_UPDATED 16
1438/**
1439 Means that table->null_row is set. This is an artificial NULL-filled row
1440 (one example: in outer join, if no match has been found in inner table).
1441*/
1442#define STATUS_NULL_ROW 32
1443/// Reserved for use by multi-table delete. Means the row has been deleted.
1444#define STATUS_DELETED 64
1445
1446/* Information for one open table */
1448
1449/* Bitmap of table's fields */
1451
1452/*
1453 NOTE: Despite being a struct (for historical reasons), TABLE has
1454 a nontrivial destructor.
1455*/
1456struct TABLE {
1457 TABLE_SHARE *s{nullptr};
1458 handler *file{nullptr};
1459 TABLE *next{nullptr}, *prev{nullptr};
1460
1461 private:
1462 /**
1463 Links for the lists of used/unused TABLE objects for the particular
1464 table in the specific instance of Table_cache (in other words for
1465 specific Table_cache_element object).
1466 Declared as private to avoid direct manipulation with those objects.
1467 One should use methods of I_P_List template instead.
1468 */
1469 TABLE *cache_next{nullptr}, **cache_prev{nullptr};
1470
1471 /*
1472 Give Table_cache_element access to the above two members to allow
1473 using them for linking TABLE objects in a list.
1474 */
1476
1477 /**
1478 Links for the LRU list of unused TABLE objects with fully loaded triggers
1479 in the specific instance of Table_cache.
1480 */
1482
1483 /*
1484 Give Table_cache access to the above two members to allow using them
1485 for linking TABLE objects in a list.
1486 */
1487 friend class Table_cache;
1488
1489 public:
1490 // Pointer to the histograms available on the table.
1491 // Protected in the same way as the pointer to the share.
1493
1494 /**
1495 A bitmap marking the hidden generated columns that exists for functional
1496 indexes.
1497 */
1499 /**
1500 The current session using this table object.
1501 Should be NULL when object is not in use.
1502 For an internal temporary table, it is NULL when the table is closed.
1503 Used for two purposes:
1504 - Signal that the object is in use, and by which session.
1505 - Pass the thread handler to storage handlers.
1506 The field should NOT be used as a general THD reference, instead use
1507 a passed THD reference, or, if there is no such, current_thd.
1508 The reason for this is that we cannot guarantee the field is not NULL.
1509 */
1510 THD *in_use{nullptr};
1511 Field **field{nullptr}; /* Pointer to fields */
1512 /// Count of hidden fields, if internal temporary table; 0 otherwise.
1514
1515 uchar *record[2]{nullptr, nullptr}; /* Pointer to records */
1516 uchar *write_row_record{nullptr}; /* Used as optimisation in
1517 THD::write_row */
1518 uchar *insert_values{nullptr}; /* used by INSERT ... UPDATE */
1519
1520 /// Buffer for use in multi-row reads. Initially empty.
1522
1523 /*
1524 Map of keys that can be used to retrieve all data from this table needed by
1525 the query without reading the row.
1526
1527 Note that the primary clustered key is treated as any other key, so for a
1528 table t with a primary key column p and a second column c, the primary key
1529 will be marked as covering for the query "SELECT p FROM t", but will not be
1530 marked as covering for the query "SELECT p, c FROM t" (even though we can in
1531 some sense retrieve the data from the index).
1532 */
1535
1536 /* Merge keys are all keys that had a column referred to in the query */
1538
1539 /*
1540 possible_quick_keys is a superset of quick_keys to use with EXPLAIN of
1541 JOIN-less commands (single-table UPDATE and DELETE).
1542
1543 When explaining regular JOINs, we use JOIN_TAB::keys to output the
1544 "possible_keys" column value. However, it is not available for
1545 single-table UPDATE and DELETE commands, since they don't use JOIN
1546 optimizer at the top level. OTOH they directly use the range optimizer,
1547 that collects all keys usable for range access here.
1548 */
1550
1551 /*
1552 A set of keys that can be used in the query that references this
1553 table.
1554
1555 All indexes disabled on the table's TABLE_SHARE (see TABLE::s) will be
1556 subtracted from this set upon instantiation. Thus for any TABLE t it holds
1557 that t.keys_in_use_for_query is a subset of t.s.keys_in_use. Generally we
1558 must not introduce any new keys here (see setup_tables).
1559
1560 The set is implemented as a bitmap.
1561 */
1563 /* Map of keys that can be used to calculate GROUP BY without sorting */
1565 /* Map of keys that can be used to calculate ORDER BY without sorting */
1567 KEY *key_info{nullptr}; /* data of keys defined for the table */
1568 /**
1569 Key part array for generated keys, used for materialized derived tables.
1570 This is a contiguous array, with size given by s->max_tmp_key_parts.
1571 */
1573
1574 Field *next_number_field{nullptr}; /* Set if next_number is activated */
1575 Field *found_next_number_field{nullptr}; /* Set on open */
1576 /// Pointer to generated columns
1577 Field **vfield{nullptr};
1578 /// Pointer to fields having the default value generated
1580 /// Field used by unique constraint
1582 // ----------------------------------------------------------------------
1583 // The next few members are used if this (temporary) file is used solely for
1584 // the materialization/computation of an INTERSECT or EXCEPT set operation
1585 // (in addition to hash_field above used to detect duplicate rows). For
1586 // INTERSECT and EXCEPT, we always use the hash field and compute the shape
1587 // of the result set using m_set_counter. The latter is a hidden field
1588 // located between the hash field and the row proper, only present for
1589 // INTERSECT or EXCEPT materialized in a temporary result table. The
1590 // materialized table has no duplicate rows, relying instead of the embedded
1591 // counter to produce the correct number of duplicates with ALL semantics. If
1592 // we have distinct semantics, we squash duplicates. This all happens in the
1593 // reading step of the tmp table (TableScanIterator::Read),
1594 // cf. m_last_operation_is_distinct. For explanation if the logic of the set
1595 // counter, see MaterializeIterator<Profiler>::MaterializeOperand.
1596 //
1597
1598 /// A priori unlimited. We pass this on to TableScanIterator at construction
1599 /// time, q.v., to limit the number of rows out of an EXCEPT or INTERSECT.
1600 /// For these set operations, we do not know enough to enforce the limit at
1601 /// materialize time (as for UNION): only when reading the rows with
1602 /// TableScanIterator do we check the counters.
1603 /// @todo: Ideally, this limit should be communicated to TableScanIterator in
1604 /// some other way.
1606
1607 private:
1608 /// The set counter. It points to the field in the materialized table
1609 /// holding the counter used to compute INTERSECT and EXCEPT, in record[0].
1610 /// For EXCEPT [DISTINCT | ALL] and INTERSECT DISTINCT this is a simple 64
1611 /// bits counter. For INTERSECT ALL, it is subdivided into two sub counters
1612 /// cf. class HalfCounter, cf. MaterializeOperand. See set_counter().
1614
1615 /// If m_set_counter is set: true if last block has DISTINCT semantics,
1616 /// either because it is marked as such, or because we have computed this
1617 /// to give an equivalent answer. If false, we have ALL semantics.
1618 /// It will be true if any DISTINCT is given in the merged N-ary set
1619 /// operation. See is_distinct().
1621 /// If false, any de-duplication happens via an index on this table
1622 /// (e.g. SELECT DISTINCT, set operation). If true, this table represents the
1623 /// output of a set operation, and de-duplication happens via an in-memory
1624 /// hash map, in which case we do not use any index, unless we get secondary
1625 /// overflow.
1627
1628 public:
1629 /// True if character set conversions are always strict
1631
1641
1642 private:
1643 /// Holds the set operation type
1645
1646 public:
1647 /// Test if this tmp table stores the result of a UNION set operation or
1648 /// a single table.
1649 /// @return true if so, else false.
1650 bool is_union_or_table() const { return m_set_counter == nullptr; }
1651
1652 void set_use_hash_map(bool use_hash_map) {
1653 m_deduplicate_with_hash_map = use_hash_map;
1654 }
1655
1657
1658 /// Returns the set operation type
1660 if (m_set_op_type == SOT_NONE) {
1661 assert(is_union_or_table()); // EXCEPT and INTERSECT are already set up
1663 }
1664 return m_set_op_type;
1665 }
1666
1667 bool is_intersect() const {
1668 return m_set_op_type == SOT_INTERSECT_ALL ||
1670 }
1671
1672 bool is_except() const {
1673 return m_set_op_type == SOT_EXCEPT_ALL ||
1675 }
1676
1678 /**
1679 Initialize the set counter field pointer and the type of set operation
1680 *other than UNION*.
1681 @param set_counter the field in the materialized table that holds the
1682 counter we use to compute intersect or except
1683 @param except if true, EXCEPT, else INTERSECT
1684 @param distinct if true, the set operation is DISTINCT, else ALL
1685 */
1686 void set_set_op(Field_longlong *set_counter, bool except, bool distinct) {
1689 assert(m_set_op_type == SOT_NONE);
1690 m_set_op_type = except ? (distinct ? SOT_EXCEPT_DISTINCT : SOT_EXCEPT_ALL)
1691 : distinct ? SOT_INTERSECT_DISTINCT
1693 }
1694
1696 //
1697 // end of INTERSECT and EXCEPT specific members
1698 // ----------------------------------------------------------------------
1699
1700 Field *fts_doc_id_field{nullptr}; /* Set if FTS_DOC_ID field is present */
1701
1702 /* Table's triggers, 0 if there are no of them */
1704 Table_ref *pos_in_table_list{nullptr}; /* Element referring to this table */
1705 /* Position in thd->locked_table_list under LOCK TABLES */
1707 ORDER *group{nullptr};
1708 const char *alias{nullptr}; ///< alias or table name
1709
1710 /* foreign key name for which handle is open */
1711 const char *open_for_fk_name{nullptr};
1712
1713 uchar *null_flags{nullptr}; ///< Pointer to the null flags of record[0]
1715 nullptr}; ///< Saved null_flags while null_row is true
1716
1717 /* containers */
1719 /*
1720 Bitmap of fields that one or more query condition refers to. Only
1721 used if optimizer_condition_fanout_filter is turned 'on'.
1722 Currently, only the WHERE clause and ON clause of inner joins is
1723 taken into account but not ON conditions of outer joins.
1724 Furthermore, HAVING conditions apply to groups and are therefore
1725 not useful as table condition filters.
1726 */
1728
1729 /**
1730 Bitmap of table fields (columns), which are explicitly set in the
1731 INSERT INTO statement. It is declared here to avoid memory allocation
1732 on MEM_ROOT).
1733
1734 @sa fields_set_during_insert.
1735 */
1737
1738 /**
1739 The read set contains the set of columns that the execution engine needs to
1740 process the query. In particular, it is used to tell the storage engine
1741 which columns are needed. For virtual generated columns, the underlying base
1742 columns are also added, since they are required in order to calculate the
1743 virtual generated columns.
1744
1745 Internal operations in the execution engine that need to move rows between
1746 buffers, such as aggregation, sorting, hash join and set operations, should
1747 rather use read_set_internal, since the virtual generated columns have
1748 already been calculated when the row was read from the storage engine.
1749
1750 Set during resolving; every field that gets resolved, sets its own bit
1751 in the read set. In some cases, we switch the read set around during
1752 various phases; note that it is a pointer.
1753
1754 In addition, for binary logging purposes, the bitmaps are set according
1755 to the settings of @@binlog_row_image. Therefore, for logging purposes,
1756 some additional fields, to those specified by the optimizer, may be
1757 flagged in the read and write sets.
1758 @c TABLE::mark_columns_per_binlog_row_image for additional details.
1759 */
1761
1763
1764 /**
1765 A bitmap of fields that are explicitly referenced by the query. This is
1766 mostly the same as read_set, but it does not include base columns of
1767 referenced virtual generated columns unless the base columns are referenced
1768 explicitly in the query.
1769
1770 This is the read set that should be used for determining which columns to
1771 store in join buffers, aggregation buffers, sort buffers, or similar
1772 operations internal to the execution engine. Both because it is unnecessary
1773 to store the implicitly read base columns in the buffer, since they won't
1774 ever be read out of the buffer anyways, and because the base columns may not
1775 even be possible to read, if a covering index scan is used and the index
1776 only contains the virtual column and not all its base columns.
1777 */
1779
1780 /**
1781 A pointer to the bitmap of table fields (columns), which are explicitly set
1782 in the INSERT INTO statement.
1783
1784 fields_set_during_insert points to def_fields_set_during_insert
1785 for base (non-temporary) tables. In other cases, it is NULL.
1786 Triggers can not be defined for temporary tables, so this bitmap does not
1787 matter for temporary tables.
1788
1789 @sa def_fields_set_during_insert.
1790 */
1792
1793 /*
1794 The ID of the query that opened and is using this table. Has different
1795 meanings depending on the table type.
1796
1797 Temporary tables:
1798
1799 table->query_id is set to thd->query_id for the duration of a statement
1800 and is reset to 0 once it is closed by the same statement. A non-zero
1801 table->query_id means that a statement is using the table even if it's
1802 not the current statement (table is in use by some outer statement).
1803
1804 Non-temporary tables:
1805
1806 Under pre-locked or LOCK TABLES mode: query_id is set to thd->query_id
1807 for the duration of a statement and is reset to 0 once it is closed by
1808 the same statement. A non-zero query_id is used to control which tables
1809 in the list of pre-opened and locked tables are actually being used.
1810 */
1812
1813 /*
1814 For each key that has quick_keys.is_set(key) == true: estimate of #records
1815 and max #key parts that range access would use.
1816 */
1818
1819 /* Bitmaps of key parts that =const for the entire join. */
1821
1824
1825 /*
1826 Estimate of number of records that satisfy SARGable part of the table
1827 condition, or table->file->records if no SARGable condition could be
1828 constructed.
1829 This value is used by join optimizer as an estimate of number of records
1830 that will pass the table condition (condition that depends on fields of
1831 this table and constants)
1832 */
1834
1835 uint lock_position{0}; /* Position in MYSQL_LOCK.table */
1836 uint lock_data_start{0}; /* Start pos. in MYSQL_LOCK.locks */
1837 uint lock_count{0}; /* Number of locks */
1838 uint db_stat{0}; /* mode of file as in handler.h */
1839 int current_lock{0}; /* Type of lock on table */
1840
1841 // List of table check constraints.
1843
1844 private:
1845 /**
1846 If true, this table is inner w.r.t. some outer join operation, all columns
1847 are nullable (in the query), and null_row may be true.
1848 */
1849 bool nullable{false};
1850
1851 uint8 m_status{0}; /* What's in record[0] */
1852 public:
1853 /*
1854 If true, the current table row is considered to have all columns set to
1855 NULL, including columns declared as "not null" (see nullable).
1856 @todo make it private, currently join buffering changes it through a pointer
1857 */
1858 bool null_row{false};
1859
1860 bool copy_blobs{false}; /* copy_blobs when storing */
1861
1862 /*
1863 TODO: Each of the following flags take up 8 bits. They can just as easily
1864 be put into one single unsigned long and instead of taking up 18
1865 bytes, it would take up 4.
1866 */
1867 bool force_index{false};
1868
1869 /**
1870 Flag set when the statement contains FORCE INDEX FOR ORDER BY
1871 See Table_ref::process_index_hints().
1872 */
1874
1875 /**
1876 Flag set when the statement contains FORCE INDEX FOR GROUP BY
1877 See Table_ref::process_index_hints().
1878 */
1880 bool const_table{false};
1881 /// True if writes to this table should not write rows and just write keys.
1882 bool no_rows{false};
1883
1884 /**
1885 If set, the optimizer has found that row retrieval should access index
1886 tree only.
1887 */
1888 bool key_read{false};
1889 /**
1890 Certain statements which need the full row, set this to ban index-only
1891 access.
1892 */
1893 bool no_keyread{false};
1894 /**
1895 If set, indicate that the table is not replicated by the server.
1896 */
1897 bool no_replicate{false};
1898 /* To signal that the table is associated with a HANDLER statement */
1899 bool open_by_handler{false};
1900 /**
1901 To indicate that value of the auto_increment field was provided
1902 explicitly by the user or from some other source (e.g. in case of
1903 INSERT ... SELECT, ALTER TABLE or LOAD DATA) and not as default
1904 or result of conversion from NULL value.
1905
1906 @note Since auto_increment fields are always non-NULL we can't find
1907 out using methods of Field class if 0 value stored in such field
1908 was provided explicitly or is result of applying default/conversion
1909 from NULL value. In the former case no new auto_increment value
1910 needs to be generated in MODE_NO_AUTO_VALUE_ON_ZERO mode, while
1911 the latter cases require new value generation. Hence the need
1912 for this flag.
1913 @note Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode and only
1914 by handler::write_row().
1915 */
1917 bool alias_name_used{false}; /* true if table_name is alias */
1918 bool get_fields_in_item_tree{false}; /* Signal to fix_field */
1919
1920 private:
1921 /**
1922 This TABLE object is invalid and cannot be reused. TABLE object might have
1923 inconsistent info or handler might not allow some operations.
1924
1925 For example, TABLE might have inconsistent info about partitioning.
1926 We also use this flag to avoid calling handler::reset() for partitioned
1927 InnoDB tables after in-place ALTER TABLE API commit phase and to force
1928 closing table after REPAIR TABLE has failed during its prepare phase as
1929 well.
1930
1931 @note This member can be set only by thread that owns/has opened the
1932 table and while holding its THD::LOCK_thd_data lock.
1933 It can be read without locking by this owner thread, or by some other
1934 thread concurrently after acquiring owner's THD::LOCK_thd_data.
1935
1936 @note The TABLE will not be reopened under LOCK TABLES in
1937 close_thread_tables().
1938 */
1939 bool m_invalid_dict{false};
1940
1941 /**
1942 This TABLE object is invalid and cannot be reused as it has outdated
1943 rec_per_key and handler stats.
1944
1945 @note This member is protected from concurrent access to it by lock of
1946 Table Cache's partition to which this TABLE object belongs,
1947 */
1948 bool m_invalid_stats{false};
1949
1950 /**
1951 For tmp tables. true <=> tmp table has been instantiated.
1952 Also indicates that table was successfully opened since
1953 we immediately delete tmp tables which we fail to open.
1954 */
1955 bool created{false};
1956
1957 public:
1958 /// For a materializable derived or SJ table: true if has been materialized
1959 bool materialized{false};
1960 struct /* field connections */
1961 {
1962 class JOIN_TAB *join_tab{nullptr};
1963 class QEP_TAB *qep_tab{nullptr};
1964 thr_lock_type lock_type{TL_UNLOCK}; /* How table is used */
1966 /*
1967 true <=> range optimizer found that there is no rows satisfying
1968 table conditions.
1969 */
1970 bool impossible_range{false};
1972
1973 /**
1974 @todo This member should not be declared in-line. That makes it
1975 impossible for any function that does memory allocation to take a const
1976 reference to a TABLE object.
1977 */
1979 /**
1980 Initialized in Item_func_group_concat::setup for appropriate
1981 temporary table if GROUP_CONCAT is used with ORDER BY | DISTINCT
1982 and BLOB field count > 0.
1983 */
1985
1986 /**
1987 Not owned by the TABLE; used only from filesort_free_buffers().
1988 See comments on SortingIterator::CleanupAfterQuery().
1989 */
1992
1993 /**
1994 The result of applying a unique operation (by row ID) to the table, if done.
1995 In particular, this is done in some forms of index merge.
1996 */
1998 partition_info *part_info{nullptr}; /* Partition related information */
1999 /* If true, all partitions have been pruned away */
2002
2003 private:
2004 /// Cost model object for operations on this table
2006
2007 /// Estimate for the amount of data to read per row fetched from this table.
2008 /// The estimate is only calculated when using the hypergraph optimizer.
2010
2011#ifndef NDEBUG
2012 /**
2013 Internal tmp table sequential number. Increased in the order of
2014 creation. Used for debugging purposes when many tmp tables are used
2015 during execution (e.g several windows with window functions)
2016 */
2018#endif
2019 public:
2020 void reset();
2021 void init(THD *thd, Table_ref *tl);
2022 bool init_tmp_table(THD *thd, TABLE_SHARE *share, MEM_ROOT *m_root,
2023 CHARSET_INFO *charset, const char *alias, Field **fld,
2024 uint *blob_fld, bool is_virtual);
2025 bool fill_item_list(mem_root_deque<Item *> *item_list) const;
2026 void clear_column_bitmaps(void);
2027 void prepare_for_position(void);
2028
2031 uint key_parts = 0) const;
2033 void mark_auto_increment_column(void);
2034 void mark_columns_needed_for_update(THD *thd, bool mark_binlog_columns);
2038 void mark_generated_columns(bool is_update);
2039 void mark_gcol_in_maps(const Field *field);
2040 void mark_check_constraint_columns(bool is_update);
2041 void column_bitmaps_set(MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg);
2042 inline void column_bitmaps_set_no_signal(MY_BITMAP *read_set_arg,
2043 MY_BITMAP *write_set_arg) {
2044 read_set = read_set_arg;
2045 write_set = write_set_arg;
2046 }
2047 inline void use_all_columns() {
2049 }
2053 }
2054 void invalidate_dict();
2055 void invalidate_stats();
2056 /**
2057 @note Can be called by thread owning table without additional locking, and
2058 by any other thread which has acquired owner's THD::LOCK_thd_data lock.
2059 */
2060 inline bool has_invalid_dict() const {
2061 assert(assert_invalid_dict_is_locked(this));
2062 return !db_stat || m_invalid_dict;
2063 }
2064 /// @note Can be called by thread owning Table_cache::m_lock
2065 inline bool has_invalid_stats() {
2066 assert(assert_invalid_stats_is_locked(this));
2067 return m_invalid_stats;
2068 }
2069 /// @returns first non-hidden column
2071 /// @returns count of visible fields
2073 bool alloc_tmp_keys(uint new_key_count, uint new_key_part_count,
2074 bool modify_share);
2075 bool add_tmp_key(Field_map *key_parts, bool invisible, bool modify_share);
2076 void move_tmp_key(int old_idx, bool modify_share);
2077 void drop_unused_tmp_keys(bool modify_share);
2078
2079 void set_keyread(bool flag);
2080
2081 /**
2082 Check whether the given index has a virtual generated columns.
2083
2084 @param index_no the given index to check
2085
2086 @returns true if if index is defined over at least one virtual generated
2087 column
2088 */
2089 inline bool index_contains_some_virtual_gcol(uint index_no) const {
2090 assert(index_no < s->keys);
2091 return key_info[index_no].flags & HA_VIRTUAL_GEN_KEY;
2092 }
2093 void update_const_key_parts(Item *conds);
2094
2095 bool check_read_removal(uint index);
2096
2097 ptrdiff_t default_values_offset() const {
2098 return (ptrdiff_t)(s->default_values - record[0]);
2099 }
2100
2101 /// @returns true if a storage engine handler object is assigned to table
2102 bool has_storage_handler() const { return file != nullptr; }
2103
2104 /// Set storage handler for temporary table
2106 // Ensure consistent call order
2107 assert((file == nullptr && file_arg != nullptr) ||
2108 (file != nullptr && file_arg == nullptr));
2109 assert(!is_created());
2110 assert(file_arg->inited == handler::NONE);
2111 file = file_arg;
2112 }
2113 /// Return true if table is instantiated, and false otherwise.
2114 bool is_created() const { return created; }
2115
2116 /**
2117 Set the table as "created", and enable flags in storage engine
2118 that could not be enabled without an instantiated table.
2119 */
2120 void set_created();
2121 /**
2122 Set the contents of table to be "deleted", ie "not created", after having
2123 deleted the contents.
2124 */
2125 void set_deleted() { created = materialized = false; }
2126 /// Set table as nullable, ie it is inner wrt some outer join
2127 void set_nullable() { nullable = true; }
2128
2129 /// Return whether table is nullable
2130 bool is_nullable() const { return nullable; }
2131
2132 /// @return true if table contains one or more generated columns
2133 bool has_gcol() const { return vfield; }
2134
2135 /**
2136 Life cycle of the row buffer is as follows:
2137 - The initial state is "not started".
2138 - When reading a row through the storage engine handler, the status is set
2139 as "has row" or "no row", depending on whether a row was found or not.
2140 The "not started" state is cleared, as well as the "null row" state,
2141 the updated state and the deleted state.
2142 - When making a row available in record[0], make sure to update row status
2143 similarly to how the storage engine handler does it.
2144 - If a NULL-extended row is needed in join execution, the "null row" state
2145 is set. Note that this can be combined with "has row" if a row was read
2146 but condition on it was evaluated to false (happens for single-row
2147 lookup), or "no row" if no more rows could be read.
2148 Note also that for the "null row" state, the NULL bits inside the
2149 row are set to one, so the row inside the row buffer is no longer usable,
2150 unless the NULL bits are saved in a separate buffer.
2151 - The "is updated" and "is deleted" states are set when row is updated or
2152 deleted, respectively.
2153 */
2154 /// Set status for row buffer as "not started"
2157 null_row = false;
2158 }
2159
2160 /// @return true if a row operation has been done
2161 bool is_started() const { return !(m_status & STATUS_NOT_STARTED); }
2162
2163 /// Set status for row buffer: contains row
2165 m_status = 0;
2166 null_row = false;
2167 }
2168
2169 /**
2170 Set status for row buffer: contains no row. This is set when
2171 - A lookup operation finds no row
2172 - A scan operation scans past the last row of the range.
2173 - An error in generating key values before calling storage engine.
2174 */
2175 void set_no_row() {
2177 null_row = false;
2178 }
2179
2180 /**
2181 Set "row found" status from handler result
2182
2183 @param status 0 if row was found, <> 0 if row was not found
2184 */
2187 null_row = false;
2188 }
2189
2190 /**
2191 Set current row as "null row", for use in null-complemented outer join.
2192 The row buffer may or may not contain a valid row.
2193 set_null_row() and reset_null_row() are used by the join executor to
2194 signal the presence or absence of a NULL-extended row for an outer joined
2195 table. Null rows may also be used to specify rows that are all NULL in
2196 grouing operations.
2197 @note this is a destructive operation since the NULL value bit vector
2198 is overwritten. Caching operations must be aware of this.
2199 */
2201 null_row = true;
2203 if (s->null_bytes > 0) memset(null_flags, 255, s->null_bytes);
2204 }
2205
2206 /// Clear "null row" status for the current row
2208 null_row = false;
2209 m_status &= ~STATUS_NULL_ROW;
2210 }
2211
2212 /// Set "updated" property for the current row
2214 assert(is_started() && has_row());
2216 }
2217
2218 /// Set "deleted" property for the current row
2220 assert(is_started() && has_row());
2222 }
2223
2224 /// @return true if there is a row in row buffer
2225 bool has_row() const { return !(m_status & STATUS_NOT_FOUND); }
2226
2227 /// @return true if current row is null-extended
2228 bool has_null_row() const { return null_row; }
2229
2230 /// @return true if current row has been updated (multi-table update)
2231 bool has_updated_row() const { return m_status & STATUS_UPDATED; }
2232
2233 /// @return true if current row has been deleted (multi-table delete)
2234 bool has_deleted_row() const { return m_status & STATUS_DELETED; }
2235
2236 /// Save the NULL flags of the current row into the designated buffer.
2237 /// This should be done before null-complementing a table accessed
2238 /// with EQRefIterator or a const table, as they need to be able to
2239 /// restore the original contents of the record buffer before
2240 /// reading the next row. This is necessary because of their special
2241 /// code for avoiding table access if the same row should be
2242 /// accessed by the next read.
2244 if (s->null_bytes > 0) memcpy(null_flags_saved, null_flags, s->null_bytes);
2245 }
2246
2247 /// Restore the NULL flags of the current row from the designated buffer
2249 if (s->null_bytes > 0) memcpy(null_flags, null_flags_saved, s->null_bytes);
2250 }
2251
2252 /// Empties internal temporary table (deletes rows, closes scan)
2253 bool empty_result_table();
2254
2255 /**
2256 Initialize the optimizer cost model.
2257
2258 This function should be called each time a new query is started.
2259
2260 @param cost_model_server the main cost model object for the query
2261 */
2262 void init_cost_model(const Cost_model_server *cost_model_server) {
2263 m_cost_model.init(cost_model_server, this);
2264 }
2265
2266 /**
2267 Return the cost model object for this table.
2268 */
2269 const Cost_model_table *cost_model() const { return &m_cost_model; }
2270
2271 /// Set the estimate for the number of bytes to read per row in this table.
2274 }
2275
2276 /// Get the estimate for the number of bytes to read per row in this table.
2278
2279 /**
2280 Bind all the table's value generator columns in all the forms:
2281 stored/virtual GC, default expressions and checked constraints.
2282
2283 @details When a table is opened from the dictionary, the Value Generator
2284 expressions are bound during opening (see fix_value_generator_fields()).
2285 After query execution, Item::cleanup() is called on them
2286 (see cleanup_value_generator_items()). When the table is opened from the
2287 table cache, the Value Generetor(s) need to be bound again and this
2288 function does that.
2289 */
2291
2292 /**
2293 Clean any state in items associated with generated columns to be ready for
2294 the next statement.
2295 */
2297
2298#ifndef NDEBUG
2299 void set_tmp_table_seq_id(uint arg) { tmp_table_seq_id = arg; }
2300#endif
2301 /**
2302 Update covering keys depending on max read key length.
2303
2304 Update available covering keys for the table, based on a constrained field
2305 and the identified covering prefix keys: If the matched part of field is
2306 longer than the index prefix,
2307 the prefix index cannot be used as a covering index.
2308
2309 @param[in] field Pointer to field object
2310 @param[in] key_read_length Max read key length
2311 @param[in] covering_prefix_keys Covering prefix keys
2312 */
2313 void update_covering_prefix_keys(Field *field, uint16 key_read_length,
2314 Key_map *covering_prefix_keys);
2315
2316 /**
2317 Returns the primary engine handler for the table.
2318 If none exist, nullptr is returned.
2319 */
2321
2322 private:
2323 /**
2324 Bitmap that tells which columns are eligible for partial update in an
2325 update statement.
2326
2327 The bitmap is lazily allocated in the TABLE's mem_root when
2328 #mark_column_for_partial_update() is called.
2329 */
2331
2332 /**
2333 Object which contains execution time state used for partial update
2334 of JSON columns.
2335
2336 It is allocated in the execution mem_root by #setup_partial_update() if
2337 there are columns that have been marked as eligible for partial update.
2338 */
2340
2341 /**
2342 This flag decides whether or not we should log the drop temporary table
2343 command.
2344 */
2346
2347 public:
2348 /**
2349 Does this table have any columns that can be updated using partial update
2350 in the current row?
2351
2352 @return whether any columns in the current row can be updated using partial
2353 update
2354 */
2355 bool has_binary_diff_columns() const;
2356
2357 /**
2358 Get the list of binary diffs that have been collected for a given column in
2359 the current row, or `nullptr` if partial update cannot be used for that
2360 column.
2361
2362 @param field the column to get binary diffs for
2363 @return the list of binary diffs for the column, or `nullptr` if the column
2364 cannot be updated using partial update
2365 */
2366 const Binary_diff_vector *get_binary_diffs(const Field *field) const;
2367
2368 /**
2369 Mark a given column as one that can potentially be updated using
2370 partial update during execution of an update statement.
2371
2372 Whether it is actually updated using partial update, is not
2373 determined until execution time, since that depends both on the
2374 data that is in the column and the new data that is written to the
2375 column.
2376
2377 This function should be called during preparation of an update
2378 statement.
2379
2380 @param field a column which is eligible for partial update
2381 @retval false on success
2382 @retval true on out-of-memory
2383 */
2385
2386 /**
2387 Has this column been marked for partial update?
2388
2389 Note that this only tells if the column satisfies the syntactical
2390 requirements for being partially updated. Use #is_binary_diff_enabled() or
2391 #is_logical_diff_enabled() instead to see if partial update should be used
2392 on the column.
2393
2394 @param field the column to check
2395 @return whether the column has been marked for partial update
2396 */
2397 bool is_marked_for_partial_update(const Field *field) const;
2398
2399 /**
2400 Does this table have any columns that were marked with
2401 #mark_column_for_partial_update()?
2402
2403 Note that this only tells if any of the columns satisfy the syntactical
2404 requirements for being partially updated. Use
2405 #has_binary_diff_columns(), #is_binary_diff_enabled() or
2406 #is_logical_diff_enabled() instead to see if partial update should be used
2407 on a column.
2408 */
2410
2411 /**
2412 Enable partial update of JSON columns in this table. It is only
2413 enabled for the columns that have previously been marked for
2414 partial update using #mark_column_for_partial_update().
2415
2416 @param logical_diffs should logical JSON diffs be collected in addition
2417 to the physical binary diffs?
2418
2419 This function should be called once per statement execution, when
2420 the update statement is optimized.
2421
2422 @retval false on success
2423 @retval true on out-of-memory
2424 */
2425 bool setup_partial_update(bool logical_diffs);
2426
2427 /**
2428 @see setup_partial_update(bool)
2429
2430 This is a wrapper that auto-computes the value of the parameter
2431 logical_diffs.
2432
2433 @retval false on success
2434 @retval true on out-of-memory
2435 */
2436 bool setup_partial_update();
2437
2438 /**
2439 Add a binary diff for a column that is updated using partial update.
2440
2441 @param field the column that is being updated
2442 @param offset the offset of the changed portion
2443 @param length the length of the changed portion
2444
2445 @retval false on success
2446 @retval true on out-of-memory
2447 */
2448 bool add_binary_diff(const Field *field, size_t offset, size_t length);
2449
2450 /**
2451 Clear the diffs that have been collected for partial update of
2452 JSON columns, and re-enable partial update for any columns where
2453 partial update was temporarily disabled for the current row.
2454 Should be called between each row that is updated.
2455 */
2457
2458 /**
2459 Clean up state used for partial update of JSON columns.
2460
2461 This function should be called at the end of each statement
2462 execution.
2463 */
2465
2466 /**
2467 Temporarily disable collection of binary diffs for a column in the current
2468 row.
2469
2470 This function is called during execution to disable partial update of a
2471 column that was previously marked as eligible for partial update with
2472 #mark_column_for_partial_update() during preparation.
2473
2474 Partial update of this column will be re-enabled when we go to the next
2475 row.
2476
2477 @param field the column to stop collecting binary diffs for
2478 */
2480
2481 /**
2482 Temporarily disable collection of Json_diff objects describing the
2483 logical changes of a JSON column in the current row.
2484
2485 Collection of logical JSON diffs is re-enabled when we go to the next row.
2486
2487 @param field the column to stop collecting logical JSON diffs for
2488 */
2490
2491 /**
2492 Get a buffer that can be used to hold the partially updated column value
2493 while performing partial update.
2494 */
2496
2497 /**
2498 Add a logical JSON diff describing a logical change to a JSON column in
2499 partial update.
2500
2501 @param field the column that is updated
2502 @param path the JSON path that is changed
2503 @param operation the operation to perform
2504 @param new_value the new value in the path
2505
2506 @throws std::bad_alloc if memory cannot be allocated
2507 */
2509 enum_json_diff_operation operation,
2510 const Json_wrapper *new_value);
2511
2512 /**
2513 Get the list of JSON diffs that have been collected for a given column in
2514 the current row, or `nullptr` if partial update cannot be used for that
2515 column.
2516
2517 @param field the column to get JSON diffs for
2518 @return the list of JSON diffs for the column, or `nullptr` if the column
2519 cannot be updated using partial update
2520 */
2522
2523 /**
2524 Is partial update using binary diffs enabled on this JSON column?
2525
2526 @param field the column to check
2527 @return whether the column can be updated with binary diffs
2528 */
2529 bool is_binary_diff_enabled(const Field *field) const;
2530
2531 /**
2532 Is partial update using logical diffs enabled on this JSON column?
2533
2534 @param field the column to check
2535 @return whether the column can be updated with JSON diffs
2536 */
2537 bool is_logical_diff_enabled(const Field *field) const;
2538
2539 /**
2540 Virtual fields of type BLOB have a flag m_keep_old_value. This flag is set
2541 to false for all such fields in this table.
2542 */
2544
2545 /**
2546 Set the variable should_binlog_drop_if_temp_flag, so that
2547 the logging of temporary tables can be decided.
2548
2549 @param should_binlog the value to set flag should_binlog_drop_if_temp_flag
2550 */
2551 void set_binlog_drop_if_temp(bool should_binlog);
2552
2553 /**
2554 @return whether should_binlog_drop_if_temp_flag flag is
2555 set or not
2556 */
2557 bool should_binlog_drop_if_temp(void) const;
2558
2559 /**
2560 Find the histogram for the given field index.
2561
2562 @note If this is called on a TABLE object that belongs to a secondary
2563 engine, it will take a round-trip through the handler in order to obtain the
2564 histogram from the TABLE object associated with the primary engine. This is
2565 done to avoid storing histograms on both the primary and secondary
2566 TABLE_SHARE.
2567
2568 @param field_index The index of the field we want to find a histogram for.
2569
2570 @retval nullptr if no histogram is found.
2571 @retval Pointer to a histogram if one is found.
2572 */
2573 const histograms::Histogram *find_histogram(uint field_index) const;
2574};
2575
2576static inline void empty_record(TABLE *table) {
2577 restore_record(table, s->default_values);
2578 if (table->s->null_bytes > 0)
2579 memset(table->null_flags, 255, table->s->null_bytes);
2580}
2581
2582#define MY_I_S_MAYBE_NULL 1
2583#define MY_I_S_UNSIGNED 2
2584
2586 /**
2587 This is used as column name.
2588 */
2589 const char *field_name;
2590 /**
2591 For string-type columns, this is the maximum number of
2592 characters. Otherwise, it is the 'display-length' for the column.
2593 For the data type MYSQL_TYPE_DATETIME this field specifies the
2594 number of digits in the fractional part of time value.
2595 */
2597 /**
2598 This denotes data type for the column. For the most part, there seems to
2599 be one entry in the enum for each SQL data type, although there seem to
2600 be a number of additional entries in the enum.
2601 */
2604 /**
2605 This is used to set column attributes. By default, columns are @c NOT
2606 @c NULL and @c SIGNED, and you can deviate from the default
2607 by setting the appropriate flags. You can use either one of the flags
2608 @c MY_I_S_MAYBE_NULL and @c MY_I_S_UNSIGNED or
2609 combine them using the bitwise or operator @c |. Both flags are
2610 defined in table.h.
2611 */
2612 uint field_flags; // Field attributes (maybe_null, signed, unsigned etc.)
2613 const char *old_name;
2614 uint open_method; // Not used
2615};
2616
2618 const char *table_name;
2620 /* Fill table with data */
2621 int (*fill_table)(THD *thd, Table_ref *tables, Item *cond);
2622 /* Handle fields for old SHOW */
2623 int (*old_format)(THD *thd, ST_SCHEMA_TABLE *schema_table);
2624 int (*process_table)(THD *thd, Table_ref *tables, TABLE *table, bool res,
2627};
2628
2629/**
2630 Strategy for how to process a view or derived table (merge or materialization)
2631*/
2637
2638enum class enum_view_type {
2639 UNDEFINED,
2640 SQL_VIEW, // Traditional SQL VIEW
2641 JSON_DUALITY_VIEW // JSON Duality view
2642};
2643
2644#define VIEW_SUID_INVOKER 0
2645#define VIEW_SUID_DEFINER 1
2646#define VIEW_SUID_DEFAULT 2
2647
2648/* view WITH CHECK OPTION parameter options */
2649#define VIEW_CHECK_NONE 0
2650#define VIEW_CHECK_LOCAL 1
2651#define VIEW_CHECK_CASCADED 2
2652
2653/* result of view WITH CHECK OPTION parameter check */
2654#define VIEW_CHECK_OK 0
2655#define VIEW_CHECK_ERROR 1
2656#define VIEW_CHECK_SKIP 2
2657
2658/** The threshold size a blob field buffer before it is freed */
2659#define MAX_TDC_BLOB_SIZE 65536
2660
2661/**
2662 Struct that describes an expression selected from a derived table or view.
2663*/
2665 /**
2666 Points to an item that represents the expression.
2667 If the item is determined to be unused, the pointer is set to NULL.
2668 */
2670 /// Name of selected expression
2671 const char *name;
2672};
2673
2674/*
2675 Column reference of a NATURAL/USING join. Since column references in
2676 joins can be both from views and stored tables, may point to either a
2677 Field (for tables), or a Field_translator (for views).
2678*/
2679
2681 public:
2682 Field_translator *view_field; /* Column reference of merge view. */
2683 Item_field *table_field; /* Column reference of table or temp view. */
2684 Table_ref *table_ref; /* Original base table/view reference. */
2685 /*
2686 True if a common join column of two NATURAL/USING join operands. Notice
2687 that when we have a hierarchy of nested NATURAL/USING joins, a column can
2688 be common at some level of nesting but it may not be common at higher
2689 levels of nesting. Thus this flag may change depending on at which level
2690 we are looking at some column.
2691 */
2693
2694 public:
2696 Natural_join_column(Item_field *field_param, Table_ref *tab);
2697 const char *name();
2698 Item_ident *create_item(THD *thd);
2699 Field *field();
2700 const char *table_name();
2701 const char *db_name();
2702 GRANT_INFO *grant();
2703};
2704
2705/**
2706 This is generic enum. It may be reused in the ACL statements
2707 for clauses that can map to the values defined in this enum.
2708*/
2710 UNCHANGED, /* The clause is not specified */
2711 DEFAULT, /* Default value of clause is specified */
2712 YES, /* Value that maps to True is specified */
2713 NO /* Value that maps to False is specified */
2714};
2715
2716struct LEX_MFA {
2723 /*
2724 The following flags are indicators for the SQL syntax used while
2725 parsing CREATE/ALTER user. While other members are self-explanatory,
2726 'uses_authentication_string_clause' signifies if the password is in
2727 hash form (if the var was set to true) or not.
2728 */
2733 /* flag set during CREATE USER .. INITIAL AUTHENTICATION BY */
2735 /* flag set during ALTER USER .. ADD nth FACTOR */
2737 /* flag set during ALTER USER .. MODIFY nth FACTOR */
2739 /* flag set during ALTER USER .. DROP nth FACTOR */
2741 /*
2742 flag used during authentication and to decide if server should
2743 be in sandbox mode or not
2744 */
2746 /* flag set during ALTER USER .. nth FACTOR UNREGISTER */
2748 /* flag set during ALTER USER .. INITIATE REGISTRATION */
2750 /* flag set during ALTER USER .. FINISH REGISTRATION */
2752
2754 void reset() {
2756 auth = NULL_CSTR;
2760 nth_factor = 1;
2764 has_password_generator = false;
2765 passwordless = false;
2766 add_factor = false;
2767 drop_factor = false;
2768 modify_factor = false;
2769 requires_registration = false;
2770 unregister = false;
2771 init_registration = false;
2772 finish_registration = false;
2773 }
2774 void copy(LEX_MFA *m, MEM_ROOT *alloc);
2775};
2776
2777/*
2778 This structure holds the specifications relating to
2779 ALTER user ... PASSWORD EXPIRE ...
2780*/
2798 /* Holds the specification of 'PASSWORD REQUIRE CURRENT' clause. */
2800 void cleanup() {
2806 account_locked = false;
2818 }
2819};
2820
2821/*
2822 This structure holds the specifications related to
2823 mysql user and the associated auth details.
2824*/
2825struct LEX_USER {
2833 /* restrict MFA methods to atmost 3 authentication plugins */
2837
2838 void init() {
2839 user = NULL_CSTR;
2840 host = NULL_CSTR;
2842 uses_replace_clause = false;
2844 discard_old_password = false;
2861 mfa_list.clear();
2862 with_initial_auth = false;
2863 }
2864
2866
2867 bool add_mfa_identifications(LEX_MFA *factor2, LEX_MFA *factor3 = nullptr);
2868
2869 /*
2870 Allocates the memory in the THD mem pool and initialize the members of
2871 this struct. It is preferable to use this method to create a LEX_USER
2872 rather allocating the memory in the THD and initializing the members
2873 explicitly.
2874 */
2875 static LEX_USER *alloc(THD *thd);
2876 static LEX_USER *alloc(THD *thd, LEX_STRING *user, LEX_STRING *host);
2877 /*
2878 Initialize the members of this struct. It is preferable to use this method
2879 to initialize a LEX_USER rather initializing the members explicitly.
2880 */
2881 static LEX_USER *init(LEX_USER *to_init, THD *thd, LEX_STRING *user,
2882 LEX_STRING *host);
2883};
2884
2885/**
2886 Derive type of metadata lock to be requested for table used by a DML
2887 statement from the type of THR_LOCK lock requested for this table.
2888*/
2889
2890inline enum enum_mdl_type mdl_type_for_dml(enum thr_lock_type lock_type) {
2891 return lock_type >= TL_WRITE_ALLOW_WRITE
2895}
2896
2897/**
2898 Type of table which can be open for an element of table list.
2899*/
2900
2906
2907/**
2908 This structure is used to keep info about possible key for the result table
2909 of a derived table/view.
2910 The 'referenced_by' is the table map of tables to which this possible
2911 key corresponds.
2912 The 'used_field' is a map of fields of which this key consists of.
2913 See also the comment for the Table_ref::update_derived_keys function.
2914*/
2915
2917 public:
2921};
2922
2923class Table_function;
2924/*
2925 Table reference in the FROM clause.
2926
2927 These table references can be of several types that correspond to
2928 different SQL elements. Below we list all types of TABLE_LISTs with
2929 the necessary conditions to determine when a Table_ref instance
2930 belongs to a certain type.
2931
2932 1) table (Table_ref::view == NULL)
2933 - base table
2934 (Table_ref::derived == NULL)
2935 - subquery - Table_ref::table is a temp table
2936 (Table_ref::derived != NULL)
2937 - information schema table
2938 (Table_ref::schema_table != NULL)
2939 NOTICE: for schema tables Table_ref::field_translation may be != NULL
2940 2) view (Table_ref::view != NULL)
2941 - merge (Table_ref::effective_algorithm == VIEW_ALGORITHM_MERGE)
2942 also (Table_ref::field_translation != NULL)
2943 - temptable(Table_ref::effective_algorithm == VIEW_ALGORITHM_TEMPTABLE)
2944 also (Table_ref::field_translation == NULL)
2945 3) nested table reference (Table_ref::nested_join != NULL)
2946 - table sequence - e.g. (t1, t2, t3)
2947 TODO: how to distinguish from a JOIN?
2948 - general JOIN
2949 TODO: how to distinguish from a table sequence?
2950 - NATURAL JOIN
2951 (Table_ref::natural_join != NULL)
2952 - JOIN ... USING
2953 (Table_ref::join_using_fields != NULL)
2954 - semi-join
2955 ;
2956*/
2957
2959 public:
2960 Table_ref() = default;
2961
2962 /**
2963 Only to be used by legacy code that temporarily needs a Table_ref,
2964 more specifically: Query_result_create::binlog_show_create_table().
2965 */
2966 explicit Table_ref(TABLE *table_arg) : table(table_arg) {}
2967
2968 /// Constructor that can be used when the strings are null terminated.
2969 Table_ref(const char *db_name, const char *table_name,
2970 enum thr_lock_type lock_type)
2971 : Table_ref(db_name, strlen(db_name), table_name, strlen(table_name),
2972 table_name, lock_type) {}
2973
2974 /**
2975 Creates a Table_ref object with pre-allocated strings for database,
2976 table and alias.
2977 */
2978 Table_ref(TABLE *table_arg, const char *db_name_arg, size_t db_length_arg,
2979 const char *table_name_arg, size_t table_name_length_arg,
2980 const char *alias_arg, enum thr_lock_type lock_type_arg)
2981 : db(db_name_arg),
2982 table_name(table_name_arg),
2983 alias(alias_arg),
2984 m_map(1),
2985 table(table_arg),
2986 m_lock_descriptor{lock_type_arg},
2987 db_length(db_length_arg),
2988 table_name_length(table_name_length_arg) {
2991 }
2992
2993 /// Constructor that can be used when the strings are null terminated.
2994 Table_ref(const char *db_name, const char *table_name, const char *alias,
2995 enum thr_lock_type lock_type)
2996 : Table_ref(db_name, strlen(db_name), table_name, strlen(table_name),
2997 alias, lock_type) {}
2998
2999 /**
3000 This constructor can be used when a Table_ref is needed for an
3001 existing temporary table. These typically have very long table names, since
3002 it is a fully qualified path. For this reason, the table is set to the
3003 alias. The database name is left blank. The lock descriptor is set to
3004 TL_READ.
3005 */
3006 Table_ref(TABLE *table_arg, const char *alias_arg)
3007 : db(""),
3008 table_name(alias_arg),
3009 alias(alias_arg),
3010 m_map(1),
3011 table(table_arg),
3013 db_length(0),
3014 table_name_length(strlen(alias_arg)) {
3017 }
3018
3019 /**
3020 Sets an explicit enum_mdl_type value, without initializing
3021 m_lock_descriptor.
3022 */
3023 Table_ref(TABLE *table_arg, const char *alias_arg, enum_mdl_type mdl_type)
3024 : db(table_arg->s->db.str),
3025 table_name(table_arg->s->table_name.str),
3026 alias(alias_arg),
3027 m_map(1),
3028 table(table_arg),
3029 db_length(table_arg->s->db.length),
3030 table_name_length(table_arg->s->table_name.length) {
3033 }
3034
3035 Table_ref(const char *db_name, const char *table_name_arg,
3036 enum thr_lock_type lock_type_arg,
3037 enum enum_mdl_type mdl_request_type)
3038 : db(db_name),
3039 table_name(table_name_arg),
3040 alias(table_name_arg),
3041 m_map(1),
3042 m_lock_descriptor{lock_type_arg},
3043 db_length(strlen(db_name)),
3044 table_name_length(strlen(table_name_arg)) {
3047 mdl_request.set_type(mdl_request_type);
3048 }
3049
3050 Table_ref(const char *db_name, size_t db_length_arg,
3051 const char *table_name_arg, size_t table_name_length_arg,
3052 enum thr_lock_type lock_type_arg,
3053 enum enum_mdl_type mdl_request_type)
3054 : db(db_name),
3055 table_name(table_name_arg),
3056 alias(table_name_arg),
3057 m_map(1),
3058 m_lock_descriptor{lock_type_arg},
3059 db_length(db_length_arg),
3060 table_name_length(table_name_length_arg) {
3063 mdl_request.set_type(mdl_request_type);
3064 }
3065
3066 Table_ref(const char *db_name, size_t db_length_arg,
3067 const char *table_name_arg, size_t table_name_length_arg,
3068 enum thr_lock_type lock_type_arg)
3069 : db(db_name),
3070 table_name(table_name_arg),
3071 alias(table_name_arg),
3072 m_map(1),
3073 m_lock_descriptor{lock_type_arg},
3074 db_length(db_length_arg),
3075 table_name_length(table_name_length_arg) {}
3076
3077 /**
3078 Sets an explicit enum_mdl_type value, without initializing
3079 m_lock_descriptor.
3080 */
3081 Table_ref(const char *db_name, size_t db_length_arg,
3082 const char *table_name_arg, size_t table_name_length_arg,
3083 const char *alias_arg, enum enum_mdl_type mdl_request_type)
3084 : db(db_name),
3085 table_name(table_name_arg),
3086 alias(alias_arg),
3087 m_map(1),
3088 db_length(db_length_arg),
3089 table_name_length(table_name_length_arg) {
3092 mdl_request.set_type(mdl_request_type);
3093 }
3094
3095 Table_ref(const char *db_name, size_t db_length_arg,
3096 const char *table_name_arg, size_t table_name_length_arg,
3097 const char *alias_arg, enum thr_lock_type lock_type_arg,
3098 enum enum_mdl_type mdl_request_type)
3099 : db(db_name),
3100 table_name(table_name_arg),
3101 alias(alias_arg),
3102 m_map(1),
3103 m_lock_descriptor{lock_type_arg},
3104 db_length(db_length_arg),
3105 table_name_length(table_name_length_arg) {
3108 mdl_request.set_type(mdl_request_type);
3109 }
3110
3111 Table_ref(const char *db_name_arg, size_t db_length_arg,
3112 const char *table_name_arg, size_t table_name_length_arg,
3113 const char *alias_arg, enum thr_lock_type lock_type_arg)
3114 : db(db_name_arg),
3115 table_name(table_name_arg),
3116 alias(alias_arg),
3117 m_map(1),
3118 m_lock_descriptor{lock_type_arg},
3119 db_length(db_length_arg),
3120 table_name_length(table_name_length_arg) {
3123 }
3124
3125 /// Create a Table_ref object representing a nested join
3126 static Table_ref *new_nested_join(MEM_ROOT *allocator, const char *alias,
3128 mem_root_deque<Table_ref *> *belongs_to,
3129 Query_block *select);
3131 Item *join_cond() const { return m_join_cond; }
3132 void set_join_cond(Item *val) {
3133 // If optimization has started, it's too late to change m_join_cond.
3134 assert(m_join_cond_optim == nullptr || m_join_cond_optim == (Item *)1);
3135 m_join_cond = val;
3136 }
3139 /*
3140 Either we are setting to "empty", or there must pre-exist a
3141 permanent condition.
3142 */
3143 assert(cond == nullptr || cond == (Item *)1 || m_join_cond != nullptr);
3144 m_join_cond_optim = cond;
3145 }
3147
3148 /// @returns true if semi-join nest
3149 bool is_sj_nest() const { return m_is_sj_or_aj_nest && !m_join_cond; }
3150 /// @returns true if anti-join nest
3151 bool is_aj_nest() const { return m_is_sj_or_aj_nest && m_join_cond; }
3152 /// @returns true if anti/semi-join nest
3153 bool is_sj_or_aj_nest() const { return m_is_sj_or_aj_nest; }
3154 /// Makes the next a semi/antijoin nest
3156 assert(!m_is_sj_or_aj_nest);
3157 m_is_sj_or_aj_nest = true;
3158 }
3159
3160 /// Merge tables from a query block into a nested join structure
3162
3163 /// Reset table
3164 void reset();
3165
3166 /// Evaluate the check option of a view
3167 int view_check_option(THD *thd) const;
3168
3169 /// Produce a textual identification of this object
3170 void print(const THD *thd, String *str, enum_query_type query_type) const;
3171
3172 /// Check which single table inside a view that matches a table map
3173 bool check_single_table(Table_ref **table_ref, table_map map);
3174
3175 /// Allocate a buffer for inserted column values
3177
3179 /**
3180 Retrieve the last (right-most) leaf in a nested join tree with
3181 respect to name resolution.
3182
3183
3184 Given that 'this' is a nested table reference, recursively walk
3185 down the right-most children of 'this' until we reach a leaf
3186 table reference with respect to name resolution.
3187
3188 The right-most child of a nested table reference is the first
3189 element in the list of children because the children are inserted
3190 in reverse order.
3191
3192 @return
3193 - If 'this' is a nested table reference - the right-most child
3194 of the tree rooted in 'this',
3195 - else - 'this'
3196 */
3198 bool is_leaf_for_name_resolution() const;
3199
3200 /// Return the outermost view this table belongs to, or itself
3201 inline const Table_ref *top_table() const {
3202 return belong_to_view ? belong_to_view : this;
3203 }
3204
3206 return const_cast<Table_ref *>(
3207 const_cast<const Table_ref *>(this)->top_table());
3208 }
3209
3210 /// Prepare check option for a view
3211 bool prepare_check_option(THD *thd, bool is_cascaded = false);
3212
3213 /// Merge WHERE condition of view or derived table into outer query
3214 bool merge_where(THD *thd);
3215
3216 /// Prepare replace filter for a view (used for REPLACE command)
3217 bool prepare_replace_filter(THD *thd);
3218
3219 /// Return true if this represents a named view
3220 bool is_view() const { return view != nullptr; }
3221
3222 /// Return true if this represents a derived table (an unnamed view)
3223 bool is_derived() const { return derived != nullptr && view == nullptr; }
3224
3225 /// Return true if this represents a named view or a derived table
3226 bool is_view_or_derived() const { return derived != nullptr; }
3227
3228 /// Return true if this represents a non-materialized view or a derived table
3231 }
3232
3233 /// Return true if this represents a table function
3234 bool is_table_function() const { return table_function != nullptr; }
3235 /**
3236 @returns true if this is a recursive reference inside the definition of a
3237 recursive CTE.
3238 @note that it starts its existence as a dummy derived table, until the
3239 end of resolution when it's not a derived table anymore, just a reference
3240 to the materialized temporary table. Whereas a non-recursive
3241 reference to the recursive CTE is a derived table.
3242 */
3244
3245 /// @returns true if this is a base table (permanent or temporary)
3246 bool is_base_table() const {
3247 return !(is_view_or_derived() || is_table_function() ||
3249 }
3250 /**
3251 @see is_recursive_reference().
3252 @returns true if error
3253 */
3255
3256 /**
3257 @returns true for a table that represents an optimizer internal table,
3258 is a derived table, a recursive reference, a table function.
3259 Internal tables are only visible inside a query expression, and is hence
3260 not visible in any schema, or need any kind of privilege checking.
3261 */
3262 bool is_internal() const {
3264 }
3265
3266 /**
3267 @returns true for a table that is a placeholder, ie a derived table,
3268 a view, a recursive reference, a table function or a schema table.
3269 A table is also considered to be a placeholder if it does not have a
3270 TABLE object for some other reason.
3271 */
3272 bool is_placeholder() const {
3274 is_table_function() || schema_table || table == nullptr;
3275 }
3276
3277 /// Return true if view or derived table and can be merged
3278 bool is_mergeable() const;
3279
3280 /**
3281 Checks if this is a table that contains zero rows or one row, and that can
3282 be materialized during optimization.
3283
3284 @returns true if materializable table contains one or zero rows, and
3285 materialization during optimization is permitted
3286
3287 Returning true, if the hypergraph optimizer is not active, implies that the
3288 table is materialized during optimization, so it need not be optimized
3289 during execution. The hypergraph optimizer does not care about const tables,
3290 so such tables are not executed during optimization time when it is active.
3291 */
3292 bool materializable_is_const(THD *thd) const;
3293
3294 /// @returns true if this is a derived table containing a stored function.
3295 bool has_stored_program() const;
3296
3297 /// Return true if this is a derived table or view that is merged
3299
3300 /// Set table to be merged
3301 void set_merged() {
3304 }
3305
3306 /// Return true if this is a materializable derived table/view
3309 }
3310
3311 /// Set table to be materialized
3313 // @todo We should do this only once, but currently we cannot:
3314 // assert(effective_algorithm == VIEW_ALGORITHM_UNDEFINED);
3317 }
3318
3319 /// Return true if table is updatable
3320 bool is_updatable() const { return m_updatable; }
3321
3322 /// Set table as updatable. (per default, a table is non-updatable)
3323 void set_updatable() { m_updatable = true; }
3324
3325 /// Return true if table is insertable-into
3326 bool is_insertable() const { return m_insertable; }
3327
3328 /// Set table as insertable-into. (per default, a table is not insertable)
3329 void set_insertable() { m_insertable = true; }
3330
3331 /// Return true if table is being updated
3332 bool is_updated() const { return m_updated; }
3333
3334 /// Set table and all referencing views as being updated
3336 for (Table_ref *tr = this; tr != nullptr; tr = tr->referencing_view)
3337 tr->m_updated = true;
3338 }
3339
3340 /// Return true if table is being inserted into
3341 bool is_inserted() const { return m_inserted; }
3342
3343 /// Set table and all referencing views as being inserted into
3345 for (Table_ref *tr = this; tr != nullptr; tr = tr->referencing_view)
3346 tr->m_inserted = true;
3347 }
3348
3349 /// Return true if table is being deleted from
3350 bool is_deleted() const { return m_deleted; }
3351
3352 /// Set table and all referencing views as being deleted from
3354 for (Table_ref *tr = this; tr != nullptr; tr = tr->referencing_view)
3355 tr->m_deleted = true;
3356 }
3357
3358 /// Set table as full-text search (default is not fulltext searched)
3360
3361 /// Returns true if a MATCH function references this table.
3363
3364 /// Is this table only available in an external storage engine?
3365 bool is_external() const;
3366
3367 /**
3368 Set table as readonly, ie it is neither updatable, insertable nor
3369 deletable during this statement.
3370 */
3372 m_updatable = false;
3373 m_insertable = false;
3374 }
3375
3376 /**
3377 Return true if this is a view or derived table that is defined over
3378 more than one base table, and false otherwise.
3379 */
3380 bool is_multiple_tables() const {
3381 if (is_view_or_derived()) {
3382 assert(is_merged()); // Cannot be a materialized view
3383 return leaf_tables_count() > 1;
3384 } else {
3385 assert(nested_join == nullptr); // Must be a base table
3386 return false;
3387 }
3388 }
3389
3390 /// Return no. of base tables a merged view or derived table is defined over.
3391 uint leaf_tables_count() const;
3392
3393 /// Return first leaf table of a base table or a view/derived table
3395 Table_ref *tr = this;
3396 while (tr->merge_underlying_list) tr = tr->merge_underlying_list;
3397 return tr;
3398 }
3399
3400 /// Return any leaf table that is not an inner table of an outer join
3401 /// @todo WL#6570 with prepare-once, replace with first_leaf_table()
3402 /// when WL#6059 is merged in (it really converts RIGHT JOIN to
3403 /// LEFT JOIN so the first leaf is part of a LEFT JOIN,
3404 /// guaranteed).
3406 Table_ref *tr = this;
3407 while (tr->merge_underlying_list) {
3408 tr = tr->merge_underlying_list;
3409 /*
3410 "while" is used, however, an "if" might be sufficient since there is
3411 no more than one inner table in a join nest (with outer_join true).
3412 */
3413 while (tr->outer_join) tr = tr->next_local;
3414 }
3415 return tr;
3416 }
3417 /**
3418 Set the LEX object of a view (will also define this as a view).
3419 @note: The value 1 is used to indicate a view but without a valid
3420 query object. Use only if the LEX object is not going to
3421 be used in later processing.
3422 */
3423 void set_view_query(LEX *lex) { view = lex; }
3424
3425 /// Return the valid LEX object for a view.
3426 LEX *view_query() const {
3427 assert(view != nullptr && view != (LEX *)1);
3428 return view;
3429 }
3430
3431 /**
3432 Set the query expression of a derived table or view.
3433 (Will also define this as a derived table, unless it is a named view.)
3434 */
3436 derived = query_expr;
3437 }
3438
3439 /// Return the query expression of a derived table or view.
3441 assert(derived);
3442 return derived;
3443 }
3444
3445 /// Resolve a derived table or view reference
3446 bool resolve_derived(THD *thd, bool apply_semijoin);
3447
3448 /// Optimize the query expression representing a derived table/view
3449 bool optimize_derived(THD *thd);
3450
3451 /// Create result table for a materialized derived table/view
3452 bool create_materialized_table(THD *thd);
3453
3454 /// Materialize derived table
3455 bool materialize_derived(THD *thd);
3456
3457 /// Check if we can push outer where condition to this derived table
3459
3460 /// Return the number of hidden fields added for the temporary table
3461 /// created for this derived table.
3463
3464 /// Prepare security context for a view
3465 bool prepare_security(THD *thd);
3466
3469
3470 /**
3471 Compiles the tagged hints list and fills up TABLE::keys_in_use_for_query,
3472 TABLE::keys_in_use_for_group_by, TABLE::keys_in_use_for_order_by,
3473 TABLE::force_index and TABLE::covering_keys.
3474 */
3475 bool process_index_hints(const THD *thd, TABLE *table);
3476
3477 /**
3478 Compare the version of metadata from the previous execution
3479 (if any) with values obtained from the current table
3480 definition cache element.
3481
3482 @sa check_and_update_table_version()
3483 */
3485 return (m_table_ref_type == s->get_table_ref_type() &&
3487 }
3488
3489 /**
3490 Record the value of metadata version of the corresponding
3491 table definition cache element in this parse tree node.
3492
3493 @sa check_and_update_table_version()
3494 */
3497 }
3498
3499 void set_table_ref_id(enum_table_ref_type table_ref_type_arg,
3500 ulonglong table_ref_version_arg) {
3501 m_table_ref_type = table_ref_type_arg;
3502 m_table_ref_version = table_ref_version_arg;
3503 }
3504
3505 /**
3506 If a derived table, returns query block id of first underlying query block.
3507 Zero if not derived.
3508 */
3509 uint query_block_id() const;
3510
3511 /**
3512 This is for showing in EXPLAIN.
3513 If a derived table, returns query block id of first underlying query block
3514 of first materialized Table_ref instance. Zero if not derived.
3515 */
3516 uint query_block_id_for_explain() const;
3517
3518 /**
3519 @brief Returns the name of the database that the referenced table belongs
3520 to.
3521 */
3522 const char *get_db_name() const { return db; }
3523
3524 /**
3525 @brief Returns the name of the table that this Table_ref represents.
3526
3527 @details The unqualified table name or view name for a table or view,
3528 respectively.
3529 */
3530 const char *get_table_name() const { return table_name; }
3532 ha_rows fallback_estimate = PLACEHOLDER_TABLE_ROW_ESTIMATE);
3533 bool update_derived_keys(THD *, Field *, Item **, uint, bool *);
3534 bool generate_keys(THD *thd);
3535
3536 /// Setup a derived table to use materialization
3539
3540 /// Setup a table function to use materialization
3541 bool setup_table_function(THD *thd);
3542
3543 bool create_field_translation(THD *thd);
3544
3545 /**
3546 @brief Returns the outer join nest that this Table_ref belongs to, if
3547 any.
3548
3549 @details There are two kinds of join nests, outer-join nests and semi-join
3550 nests. This function returns non-NULL in the following cases:
3551 @li 1. If this table/nest is embedded in a nest and this nest IS NOT a
3552 semi-join nest. (In other words, it is an outer-join nest.)
3553 @li 2. If this table/nest is embedded in a nest and this nest IS a
3554 semi-join nest, but this semi-join nest is embedded in another
3555 nest. (This other nest will be an outer-join nest, since all inner
3556 joined nested semi-join nests have been merged in
3557 @c simplify_joins() ).
3558 Note: This function assumes that @c simplify_joins() has been performed.
3559 Before that, join nests will be present for all types of join.
3560
3561 @return outer join nest, or NULL if none.
3562 */
3563
3565 if (!embedding) return nullptr;
3566 if (embedding->is_sj_nest()) return embedding->embedding;
3567 return embedding;
3568 }
3569 /**
3570 Return true if this table is an inner table of some outer join.
3571
3572 Examine all the embedding join nests of the table.
3573 @note This function works also before redundant join nests have been
3574 eliminated.
3575
3576 @return true if table is an inner table of some outer join, false otherwise.
3577 */
3578
3580 if (outer_join) return true;
3581 for (Table_ref *emb = embedding; emb; emb = emb->embedding) {
3582 if (emb->outer_join) return true;
3583 }
3584 return false;
3585 }
3586
3587 /**
3588 Return the base table entry of an updatable table.
3589 In DELETE and UPDATE, a view used as a target table must be mergeable,
3590 updatable and defined over a single table.
3591 */
3593 const Table_ref *tbl = this;
3594 // For JDVs we return the root (outermost) base table
3595 if (tbl->is_json_duality_view()) {
3596 return jdv_root_base_table(tbl);
3597 }
3598 assert(tbl->is_updatable() && !tbl->is_multiple_tables());
3599 while (tbl->is_view_or_derived()) {
3600 tbl = tbl->merge_underlying_list;
3601 assert(tbl->is_updatable() && !tbl->is_multiple_tables());
3602 }
3603 return tbl;
3604 }
3605
3607 return const_cast<Table_ref *>(
3608 static_cast<const Table_ref *>(this)->updatable_base_table());
3609 }
3610
3611 /**
3612 Mark that there is a NATURAL JOIN or JOIN ... USING between two tables.
3613
3614 This function marks that table b should be joined with a either via
3615 a NATURAL JOIN or via JOIN ... USING. Both join types are special
3616 cases of each other, so we treat them together. The function
3617 setup_conds() creates a list of equal condition between all fields
3618 of the same name for NATURAL JOIN or the fields in
3619 Table_ref::join_using_fields for JOIN ... USING.
3620 The list of equality conditions is stored
3621 either in b->join_cond(), or in JOIN::conds, depending on whether there
3622 was an outer join.
3623
3624 EXAMPLE
3625 @verbatim
3626 SELECT * FROM t1 NATURAL LEFT JOIN t2
3627 <=>
3628 SELECT * FROM t1 LEFT JOIN t2 ON (t1.i=t2.i and t1.j=t2.j ... )
3629
3630 SELECT * FROM t1 NATURAL JOIN t2 WHERE <some_cond>
3631 <=>
3632 SELECT * FROM t1, t2 WHERE (t1.i=t2.i and t1.j=t2.j and <some_cond>)
3633
3634 SELECT * FROM t1 JOIN t2 USING(j) WHERE <some_cond>
3635 <=>
3636 SELECT * FROM t1, t2 WHERE (t1.j=t2.j and <some_cond>)
3637 @endverbatim
3638
3639 @param b Right join argument.
3640 */
3642
3643 /**
3644 Set granted privileges for a table.
3645
3646 Can be used when generating temporary tables that are also used in
3647 resolver process, such as when generating a UNION table
3648
3649 @param privilege Privileges granted for this table.
3650 */
3652 grant.privilege |= privilege;
3653 }
3654
3655 bool save_properties();
3656 void restore_properties();
3657
3658 /*
3659 List of tables local to a subquery or the top-level SELECT (used by
3660 SQL_I_List). Considers views as leaves (unlike 'next_leaf' below).
3661 Created at parse time in Query_block::add_table_to_list() ->
3662 table_list.link_in_list().
3663 */
3665 /* link in a global list of all queries tables */
3666 Table_ref *next_global{nullptr}, **prev_global{nullptr};
3667 const char *db{nullptr}, *table_name{nullptr}, *alias{nullptr};
3668 /*
3669 Target tablespace name: When creating or altering tables, this
3670 member points to the tablespace_name in the HA_CREATE_INFO struct.
3671 */
3673 char *option{nullptr}; /* Used by cache index */
3674
3675 /** Table level optimizer hints for this table. */
3677 /* Hints for query block of this table. */
3679
3680 void set_lock(const Lock_descriptor &descriptor) {
3681 m_lock_descriptor = descriptor;
3682 }
3683
3685
3687
3688 private:
3689 /**
3690 The members below must be kept aligned so that (1 << m_tableno) == m_map.
3691 A table that takes part in a join operation must be assigned a unique
3692 table number.
3693 */
3694 uint m_tableno{0}; ///< Table number within query block
3695 table_map m_map{0}; ///< Table map, derived from m_tableno
3696 /**
3697 If this table or join nest is the Y in "X [LEFT] JOIN Y ON C", this
3698 member points to C. May also be generated from JOIN ... USING clause.
3699 It may be modified only by permanent transformations (permanent = done
3700 once for all executions of a prepared statement).
3701 */
3704
3705 public:
3706 /*
3707 (Valid only for semi-join nests) Bitmap of tables that are within the
3708 semi-join (this is different from bitmap of all nest's children because
3709 tables that were pulled out of the semi-join nest remain listed as
3710 nest's children).
3711 */
3713
3714 /*
3715 During parsing - left operand of NATURAL/USING join where 'this' is
3716 the right operand. After parsing (this->natural_join == this) iff
3717 'this' represents a NATURAL or USING join operation. Thus after
3718 parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
3719 */
3721 /*
3722 True if 'this' represents a nested join that is a NATURAL JOIN.
3723 For one of the operands of 'this', the member 'natural_join' points
3724 to the other operand of 'this'.
3725 */
3726 bool is_natural_join{false};
3727 /* Field names in a USING clause for JOIN ... USING. */
3729 /*
3730 Explicitly store the result columns of either a NATURAL/USING join or
3731 an operand of such a join.
3732 */
3734 /* true if join_columns contains all columns of this table reference. */
3736
3737 /*
3738 List of nodes in a nested join tree, that should be considered as
3739 leaves with respect to name resolution. The leaves are: views,
3740 top-most nodes representing NATURAL/USING joins, subqueries, and
3741 base tables. All of these Table_ref instances contain a
3742 materialized list of columns. The list is local to a subquery.
3743 */
3745 /* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
3747 TABLE *table{nullptr}; /* opened table */
3749 table_id{}; /* table id (from binlog) for opened table */
3750 /*
3751 Query_result for derived table to pass it from table creation to table
3752 filling procedure
3753 */
3755 /*
3756 Reference from aux_tables to local list entry of main select of
3757 multi-delete statement:
3758 delete t1 from t2,t1 where t1.a<'B' and t2.b=t1.b;
3759 here it will be reference of first occurrence of t1 to second (as you
3760 can see this lists can't be merged)
3761 */
3763
3764 /*
3765 Holds the function used as the table function
3766 */
3768
3770
3771 /**
3772 For a view or derived table: Add materialize_path and table_path to
3773 m_materialized_path_cache.
3774 */
3775 void AddMaterializedPathToCache(THD *thd, AccessPath *materialize_path,
3776 const AccessPath *table_path);
3777
3778 /**
3779 Search m_materialized_path_cache for a materialization path for
3780 'table_path'. Return that materialization path, or nullptr if none
3781 is found.
3782 */
3784
3785 /// Empty m_materialized_path_cache.
3787
3788 private:
3789 /// Sampling information.
3792
3794
3795 /**
3796 This field is set to non-null for derived tables and views. It points
3797 to the Query_expression representing the derived table/view.
3798 E.g. for a query
3799 @verbatim SELECT * FROM (SELECT a FROM t1) b @endverbatim
3800 */
3801 Query_expression *derived{nullptr}; /* Query_expression of derived table */
3802
3803 /// If non-NULL, the CTE which this table is derived from.
3805 /**
3806 If the user has specified column names with the syntaxes "table name
3807 parenthesis column names":
3808 WITH qn(column names) AS (select...)
3809 or
3810 FROM (select...) dt(column names)
3811 or
3812 CREATE VIEW v(column_names) AS ...
3813 then this points to the list of column names. NULL otherwise.
3814 */
3816
3817 /**
3818 If we've previously made an access path for “derived”, it is cached here.
3819 This is useful if we need to plan the query block twice (the hypergraph
3820 optimizer can do so, with and without in2exists predicates), both saving
3821 work and avoiding issues when we try to throw away the old items_to_copy
3822 for a new (identical) one.
3823 */
3825
3826 public:
3827 ST_SCHEMA_TABLE *schema_table{nullptr}; /* Information_schema table */
3829 /*
3830 True when the view field translation table is used to convert
3831 schema table fields for backwards compatibility with SHOW command.
3832 */
3834 /* link to query_block where this table was used */
3836
3837 private:
3838 LEX *view{nullptr}; /* link on VIEW lex for merging */
3839
3840 /// m_mv_se_materialized true indicates that the view is a materialized view
3841 /// that is materialized by a storage engine directly.
3843 /// m_mv_se_name is the name of the storage engine that might do the
3844 /// materialization.
3845 LEX_CSTRING m_mv_se_name{.str = nullptr, .length = 0};
3846 /// m_mv_se_available indicates that the current Table_ref is using
3847 /// the materialized view. A Table_ref can be a materialized view (as
3848 /// indicated by m_mv_se_materialized), which is determined by its definition,
3849 /// yet the materialization might not be used during the current lifetime of
3850 /// this object, if the SE does not make it available for some reason.
3852
3853 public:
3854 /// Array of selected expressions from a derived table or view.
3856
3857 /// pointer to element after last one in translation table above
3859 /*
3860 List (based on next_local) of underlying tables of this view. I.e. it
3861 does not include the tables of subqueries used in the view. Is set only
3862 for merged views.
3863 */
3865 /*
3866 - 0 for base tables
3867 - in case of the view it is the list of all (not only underlying
3868 tables but also used in subquery ones) tables of the view.
3869 */
3871 /* most upper view this table belongs to */
3873 /*
3874 The view directly referencing this table
3875 (non-zero only for merged underlying tables of a view).
3876 */
3878 /* Ptr to parent MERGE table list item. See top comment in ha_myisammrg.cc */
3880 /*
3881 Security context (non-zero only for tables which belong
3882 to view with SQL SECURITY DEFINER)
3883 */
3885 /*
3886 This view security context (non-zero only for views with
3887 SQL SECURITY DEFINER)
3888 */
3890 /*
3891 List of all base tables local to a subquery including all view
3892 tables. Unlike 'next_local', this in this list views are *not*
3893 leaves. Created in setup_tables() -> make_leaf_tables().
3894 */
3896 Item *derived_where_cond{nullptr}; ///< WHERE condition from derived table
3897 Item *check_option{nullptr}; ///< WITH CHECK OPTION condition
3898 Item *replace_filter{nullptr}; ///< Filter for REPLACE command
3899 LEX_STRING select_stmt{nullptr, 0}; ///< text of (CREATE/SELECT) statement
3900 LEX_STRING source{nullptr, 0}; ///< source of CREATE VIEW
3901 LEX_STRING timestamp{nullptr, 0}; ///< GMT time stamp of last operation
3902 LEX_USER definer; ///< definer of view
3903 void set_tablesample(tablesample_type sampling_type_arg,
3904 Item *sampling_percentage_arg) {
3905 sampling_type = sampling_type_arg;
3906 sampling_percentage = sampling_percentage_arg;
3907 }
3908
3909 bool has_tablesample() const {
3911 }
3912
3914
3915 double get_sampling_percentage() const;
3916
3918
3920
3921 /**
3922 @note: This field is currently not reliable when read from dictionary:
3923 If an underlying view is changed, updatable_view is not changed,
3924 due to lack of dependency checking in dictionary implementation.
3925 Prefer to use is_updatable() during preparation and optimization.
3926 */
3927 ulonglong updatable_view{0}; ///< VIEW can be updated
3928
3929 bool is_mv_se_available() const { return m_mv_se_available; }
3930
3931 void set_mv_se_available(bool mv_available) {
3932 m_mv_se_available = mv_available;
3933 }
3934
3936
3937 void set_mv_se_materialized(bool is_mv) { m_mv_se_materialized = is_mv; }
3938
3939 const LEX_CSTRING &get_mv_se_name() const { return m_mv_se_name; }
3940
3941 void set_mv_se_name(const char *engine_name) {
3942 m_mv_se_name.str = engine_name;
3943 m_mv_se_name.length = strlen(engine_name);
3944 }
3945
3946 void set_mv_se_name(const LEX_CSTRING &engine_name) {
3947 m_mv_se_name = engine_name;
3948 }
3949
3950 /**
3951 @brief The declared algorithm, if this is a view.
3952 @details One of
3953 - VIEW_ALGORITHM_UNDEFINED
3954 - VIEW_ALGORITHM_TEMPTABLE
3955 - VIEW_ALGORITHM_MERGE
3956 @todo Replace with an enum
3957 */
3959 ulonglong view_suid{0}; ///< view is suid (true by default)
3960 ulonglong with_check{0}; ///< WITH CHECK OPTION
3961
3962 private:
3963 /// The view algorithm that is actually used, if this is a view.
3966
3967 public:
3969
3970 public:
3971 /// True if right argument of LEFT JOIN; false in other cases (i.e. if left
3972 /// argument of LEFT JOIN, if argument of INNER JOIN; RIGHT JOINs are
3973 /// converted to LEFT JOIN during contextualization).
3974 bool outer_join{false};
3975 /// True if was originally the left argument of a RIGHT JOIN, before we
3976 /// made it the right argument of a LEFT JOIN.
3978 uint shared{0}; /* Used in multi-upd */
3979 size_t db_length{0};
3981
3982 private:
3983 /// True if VIEW/TABLE is updatable, based on analysis of query (SQL rules).
3984 bool m_updatable{false};
3985 /// True if VIEW/TABLE is insertable, based on analysis of query (SQL rules).
3986 bool m_insertable{false};
3987 /// True if table is target of UPDATE statement, or updated in IODKU stmt.
3988 bool m_updated{false};
3989 /// True if table is target of INSERT statement.
3990 bool m_inserted{false};
3991 /// True if table is target of DELETE statement, or deleted in REPLACE stmt.
3992 bool m_deleted{false};
3993 bool m_fulltext_searched{false}; ///< True if fulltext searched
3994 public:
3995 bool straight{false}; /* optimize with prev table */
3996 /**
3997 True for tables and views being changed in a data change statement.
3998 Also true for tables subject to a SELECT ... FOR UPDATE.
3999 Also used by replication to filter out statements that can be ignored,
4000 especially important for multi-table UPDATE and DELETE.
4001 */
4002 bool updating{false};
4003 /// preload only non-leaf nodes (IS THIS USED???)
4004 bool ignore_leaves{false};
4005 /**
4006 The set of tables in the query block that this table depends on.
4007 Can be set due to outer join, join order hints or NOT EXISTS relationship.
4008 */
4010 /// The outer tables that an outer join's join condition depends on
4012 /**
4013 Is non-NULL if this table reference is a nested join, ie it represents
4014 the inner tables of an outer join, the tables contained in the
4015 parentheses of an inner join (eliminated during resolving), the tables
4016 referenced in a derived table or view, in a semi-join nest, the tables
4017 from the subquery.
4018 */
4020 /// The nested join containing this table reference.
4022 /// The join list immediately containing this table reference
4024 /// stop PS caching
4025 bool cacheable_table{false};
4026 /**
4027 Used to store foreign key name to identify correct table handle from
4028 thd->open_tables during find_fk_table_from_open_tables() call
4029 */
4030 const char *open_for_fk_name{nullptr};
4031
4032 /**
4033 Specifies which kind of table should be open for this element
4034 of table list.
4035 */
4037 /* true if this merged view contain auto_increment field */
4039 /// true <=> VIEW CHECK OPTION condition is processed (also for prep. stmts)
4041 /// true <=> Filter condition is processed
4043
4045 char timestamp_buffer[20]{0}; /* buffer for timestamp (19+1) */
4046 /*
4047 This Table_ref object is just placeholder for prelocking, it will be
4048 used for implicit LOCK TABLES only and won't be used in real statement.
4049 */
4051 /**
4052 Indicates that if Table_ref object corresponds to the table/view
4053 which requires special handling.
4054 */
4055 enum {
4056 /* Normal open. */
4058 /* Associate a table share only if the the table exists. */
4060 /*
4061 Associate a table share only if the the table exists.
4062 Also upgrade metadata lock to exclusive if table doesn't exist.
4063 */
4065 /* Don't associate a table share. */
4066 OPEN_STUB
4067 } open_strategy{OPEN_NORMAL};
4069 /** true if an alias for this table was specified in the SQL. */
4070 bool is_alias{false};
4071 /** true if the table is referred to in the statement using a fully
4072 qualified name (@<db_name@>.@<table_name@>).
4073 */
4074 bool is_fqtn{false};
4075 /**
4076 If true, this table is a derived (materialized) table which was created
4077 from a scalar subquery, cf.
4078 Query_block::transform_scalar_subqueries_to_join_with_derived
4079 */
4081
4082 /* View creation context. */
4083
4085
4086 /*
4087 Attributes to save/load view creation context in/from frm-file.
4088
4089 They are required only to be able to use existing parser to load
4090 view-definition file. As soon as the parser parsed the file, view
4091 creation context is initialized and the attributes become redundant.
4092
4093 These attributes MUST NOT be used for any purposes but the parsing.
4094 */
4095
4098
4099 /*
4100 View definition (SELECT-statement) in the UTF-form.
4101 */
4102
4104
4105 // True, If this is a system view
4106 bool is_system_view{false};
4107
4108 /// If view, then type of a view.
4110
4111 /// If json duality view, then represents duality view content tree node.
4113
4114 /*
4115 Set to 'true' if this is a DD table being opened in the context of a
4116 dictionary operation. Note that when 'false', this may still be a DD
4117 table when opened in a non-DD context, e.g. as part of an I_S view
4118 query.
4119 */
4120 bool is_dd_ctx_table{false};
4121
4122 /* End of view definition context. */
4123
4124 /* List of possible keys. Valid only for materialized derived tables/views. */
4126
4127 /**
4128 Indicates what triggers we need to pre-load for this Table_ref
4129 when opening an associated TABLE. This is filled after
4130 the parsed tree is created.
4131 */
4134
4136
4137 /// if true, EXPLAIN can't explain view due to insufficient rights.
4138 bool view_no_explain{false};
4139
4140 /* List to carry partition names from PARTITION (...) clause in statement */
4142
4143 /// Set table number
4145 assert(tableno < MAX_TABLES);
4147 m_map = (table_map)1 << tableno;
4148 }
4149 /// Return table number
4150 uint tableno() const { return m_tableno; }
4151
4152 /// Return table map derived from table number
4153 table_map map() const {
4154 assert(((table_map)1 << m_tableno) == m_map);
4155 return m_map;
4156 }
4157
4158 /// If non-NULL, the CTE which this table is derived from.
4161 /// @see m_derived_column_names
4164 }
4167 }
4168
4169 /**
4170 * @brief If view, then check if view is JSON duality view.
4171 *
4172 * @return true If view is JSON duality view.
4173 * @return false Otherwise.
4174 */
4177 }
4178
4179 private:
4180 /*
4181 A group of members set and used only during JOIN::optimize().
4182 */
4183 /**
4184 Optimized copy of m_join_cond (valid for one single
4185 execution). Initialized by Query_block::get_optimizable_conditions().
4186 */
4188
4189 public:
4190 COND_EQUAL *cond_equal{nullptr}; ///< Used with outer join
4191 /// true <=> this table is a const one and was optimized away.
4192
4193 bool optimized_away{false};
4194 /**
4195 true <=> all possible keys for a derived table were collected and
4196 could be re-used while statement re-execution.
4197 */
4198
4200
4201 private:
4202 /// If a recursive reference inside the definition of a CTE.
4204 // End of group for optimization
4205
4206 /** See comments for set_metadata_id() */
4208 /** See comments for TABLE_SHARE::get_table_ref_version() */
4210
4211 /*
4212 All members whose names are suffixed with "_saved" are duplicated in
4213 class TABLE but actually belong in this class. They are saved from class
4214 TABLE when preparing a statement and restored when executing the statement.
4215 They are not required for a regular (non-prepared) statement.
4216 */
4222 bool nullable_saved{false};
4230};
4231
4232/*
4233 Iterator over the fields of a generic table reference.
4234*/
4235
4237 public:
4238 virtual ~Field_iterator() = default;
4239 virtual void set(Table_ref *) = 0;
4240 virtual void next() = 0;
4241 virtual bool end_of_fields() = 0; /* Return 1 at end of list */
4242 virtual const char *name() = 0;
4243 virtual Item_ident *create_item(THD *) = 0;
4244 virtual Field *field() = 0;
4245};
4246
4247/*
4248 Iterator over the fields of a base table, view with temporary
4249 table, or subquery.
4250*/
4251
4254
4255 public:
4257 void set(Table_ref *table) override { ptr = table->table->field; }
4258 void set_table(TABLE *table) { ptr = table->field; }
4259 void next() override { ptr++; }
4260 bool end_of_fields() override { return *ptr == nullptr; }
4261 const char *name() override;
4262 Item_ident *create_item(THD *thd) override;
4263 Field *field() override { return *ptr; }
4264};
4265
4266/**
4267 Iterator over the fields of a merged derived table or view.
4268*/
4269
4273
4274 public:
4276 void set(Table_ref *table) override;
4277 void next() override { ptr++; }
4278 bool end_of_fields() override { return ptr == array_end; }
4279 const char *name() override;
4280 Item_ident *create_item(THD *thd) override;
4281 Item **item_ptr() { return &ptr->item; }
4282 Field *field() override { return nullptr; }
4283 inline Item *item() { return ptr->item; }
4285};
4286
4287/*
4288 Field_iterator interface to the list of materialized fields of a
4289 NATURAL/USING join.
4290*/
4291
4295
4296 public:
4298 ~Field_iterator_natural_join() override = default;
4299 void set(Table_ref *table) override;
4300 void next() override;
4301 bool end_of_fields() override { return !cur_column_ref; }
4302 const char *name() override { return cur_column_ref->name(); }
4303 Item_ident *create_item(THD *thd) override {
4304 return cur_column_ref->create_item(thd);
4305 }
4306 Field *field() override { return cur_column_ref->field(); }
4308};
4309
4310/**
4311 Generic iterator over the fields of an arbitrary table reference.
4312
4313 This class unifies the various ways of iterating over the columns
4314 of a table reference depending on the type of SQL entity it
4315 represents. If such an entity represents a nested table reference,
4316 this iterator encapsulates the iteration over the columns of the
4317 members of the table reference.
4318
4319 The implementation assumes that all underlying NATURAL/USING table
4320 references already contain their result columns and are linked into
4321 the list Table_ref::next_name_resolution_table.
4322*/
4323
4330 void set_field_iterator();
4331
4332 public:
4334 void set(Table_ref *table) override;
4335 void next() override;
4336 bool end_of_fields() override {
4337 return (table_ref == last_leaf && field_it->end_of_fields());
4338 }
4339 const char *name() override { return field_it->name(); }
4340 const char *get_table_name();
4341 const char *get_db_name();
4342 GRANT_INFO *grant();
4343 Item_ident *create_item(THD *thd) override {
4344 return field_it->create_item(thd);
4345 }
4346 Field *field() override { return field_it->field(); }
4348 Table_ref *parent_table_ref);
4350};
4351
4354 char *db, *table;
4356};
4357
4359 MY_BITMAP *bitmap) {
4360 my_bitmap_map *old = bitmap->bitmap;
4361 bitmap->bitmap = table->s->all_set.bitmap; // does not repoint last_word_ptr
4362 return old;
4363}
4364
4365static inline void tmp_restore_column_map(MY_BITMAP *bitmap,
4366 my_bitmap_map *old) {
4367 bitmap->bitmap = old;
4368}
4369
4370/* The following is only needed for debugging */
4371
4373 [[maybe_unused]],
4374 MY_BITMAP *bitmap
4375 [[maybe_unused]]) {
4376#ifndef NDEBUG
4377 return tmp_use_all_columns(table, bitmap);
4378#else
4379 return nullptr;
4380#endif
4381}
4382
4383static inline void dbug_tmp_restore_column_map(MY_BITMAP *bitmap
4384 [[maybe_unused]],
4385 my_bitmap_map *old
4386 [[maybe_unused]]) {
4387#ifndef NDEBUG
4388 tmp_restore_column_map(bitmap, old);
4389#endif
4390}
4391
4392/*
4393 Variant of the above : handle both read and write sets.
4394 Provide for the possibility of the read set being the same as the write set
4395*/
4396static inline void dbug_tmp_use_all_columns(
4397 TABLE *table [[maybe_unused]], my_bitmap_map **save [[maybe_unused]],
4398 MY_BITMAP *read_set [[maybe_unused]],
4399 MY_BITMAP *write_set [[maybe_unused]]) {
4400#ifndef NDEBUG
4401 save[0] = read_set->bitmap;
4402 save[1] = write_set->bitmap;
4403 (void)tmp_use_all_columns(table, read_set);
4404 (void)tmp_use_all_columns(table, write_set);
4405#endif
4406}
4407
4409 MY_BITMAP *read_set [[maybe_unused]], MY_BITMAP *write_set [[maybe_unused]],
4410 my_bitmap_map **old [[maybe_unused]]) {
4411#ifndef NDEBUG
4412 tmp_restore_column_map(read_set, old[0]);
4413 tmp_restore_column_map(write_set, old[1]);
4414#endif
4415}
4416
4417void init_mdl_requests(Table_ref *table_list);
4418
4419/**
4420 Unpacks the definition of a value generator in all its forms: generated
4421 column, default expression or checked constraint.
4422 The function parses the text definition of this expression, resolves its
4423 items and runs validation and calculates the base_columns_map which is used
4424 for tracking the columns the expression depends on.
4425
4426 @param[in] thd Thread handler
4427 @param[in] table Table having the value generator to be unpacked
4428 @param[in,out] val_generator Contains the expression in string format, and,
4429 if successful will be replaced by the parser
4430 with a new one having the unpacked expression.
4431 @param[in] source Source of value generator(a generated column,
4432 a regular column with generated default value or
4433 a check constraint).
4434 @param[in] source_name Name of the source (generated column, a regular
4435 column with generated default value or a check
4436 constraint).
4437 @param[in] field The column the value generator depends on. Can
4438 be null for checked constraints which do not
4439 depend on a single column.
4440 @param[in] is_create_table Indicates that table is opened as part
4441 of CREATE or ALTER and does not yet exist in SE
4442 @param[out] error_reported updated flag for the caller that no other error
4443 messages are to be generated.
4444
4445 @retval true Failure.
4446 @retval false Success.
4447*/
4448
4450 Value_generator **val_generator,
4452 const char *source_name, Field *field,
4453 bool is_create_table, bool *error_reported);
4454
4455/**
4456 Unpack the partition expression. Parse the partition expression
4457 to produce an Item.
4458
4459 @param[in] thd Thread handler
4460 @param[in] outparam Table object
4461 @param[in] share TABLE_SHARE object
4462 @param[in] engine_type Engine type of the partitions.
4463 @param[in] is_create_table Indicates that table is opened as part of
4464 CREATE or ALTER and does not yet exist in SE
4465
4466 @retval true Failure.
4467 @retval false Success.
4468*/
4469
4470bool unpack_partition_info(THD *thd, TABLE *outparam, TABLE_SHARE *share,
4471 handlerton *engine_type, bool is_create_table);
4472
4473int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
4474 uint db_stat, uint prgflag, uint ha_open_flags,
4475 TABLE *outparam, bool is_create_table,
4476 const dd::Table *table_def_param);
4477TABLE_SHARE *alloc_table_share(const char *db, const char *table_name,
4478 const char *key, size_t key_length,
4479 bool open_secondary);
4480void init_tmp_table_share(THD *thd, TABLE_SHARE *share, const char *key,
4481 size_t key_length, const char *table_name,
4482 const char *path, MEM_ROOT *mem_root);
4485Ident_name_check check_db_name(const char *name, size_t length);
4487 bool preserve_lettercase);
4488bool check_column_name(const Name_string &namestring);
4489Ident_name_check check_table_name(const char *name, size_t length);
4490int rename_file_ext(const char *from, const char *to, const char *ext);
4491char *get_field(MEM_ROOT *mem, Field *field);
4492bool get_field(MEM_ROOT *mem, Field *field, class String *res);
4493
4494int closefrm(TABLE *table, bool free_share);
4495void free_blobs(TABLE *table);
4497int set_zone(int nr, int min_zone, int max_zone);
4498void append_unescaped(String *res, const char *pos, size_t length);
4499char *fn_rext(char *name);
4501 const LEX_CSTRING &name);
4502
4503/* performance schema */
4505
4508
4509/* information schema */
4511
4512/* mysql schema name and DD ID */
4514static const uint MYSQL_SCHEMA_DD_ID = 1;
4515
4516/* mysql tablespace name and DD ID */
4518static const uint MYSQL_TABLESPACE_DD_ID = 1;
4519
4520/* replication's tables */
4524
4525inline bool is_infoschema_db(const char *name, size_t len) {
4526 return (
4529}
4530
4531inline bool is_infoschema_db(const char *name) {
4533}
4534
4535inline bool is_perfschema_db(const char *name, size_t len) {
4536 return (PERFORMANCE_SCHEMA_DB_NAME.length == len &&
4538 name));
4539}
4540
4541inline bool is_perfschema_db(const char *name) {
4543 name);
4544}
4545
4546/**
4547 Check if the table belongs to the P_S, excluding setup and threads tables.
4548
4549 @note Performance Schema tables must be accessible independently of the
4550 LOCK TABLE mode. This function is needed to handle the special case
4551 of P_S tables being used under LOCK TABLE mode.
4552*/
4553inline bool belongs_to_p_s(Table_ref *tl) {
4554 return (!strcmp("performance_schema", tl->db) &&
4555 strcmp(tl->table_name, "threads") &&
4556 strstr(tl->table_name, "setup_") == nullptr);
4557}
4558
4559/**
4560 return true if the table was created explicitly.
4561*/
4563 const char *name = table->s->table_name.str;
4565}
4566
4567bool is_simple_order(ORDER *order);
4568
4569uint add_pk_parts_to_sk(KEY *sk, uint sk_n, KEY *pk, uint pk_n,
4570 TABLE_SHARE *share, handler *handler_file,
4571 uint *usable_parts, bool use_extended_sk);
4572void setup_key_part_field(TABLE_SHARE *share, handler *handler_file,
4573 uint primary_key_n, KEY *keyinfo, uint key_n,
4574 uint key_part_n, uint *usable_parts,
4575 bool part_of_key_not_extended);
4576
4577const uchar *get_field_name(const uchar *arg, size_t *length);
4578
4579void repoint_field_to_record(TABLE *table, uchar *old_rec, uchar *new_rec);
4582 uint active_index = MAX_KEY);
4583
4584/**
4585 Check if a Table_ref instance represents a pre-opened temporary table.
4586*/
4587
4588inline bool is_temporary_table(const Table_ref *tl) {
4589 if (tl->is_view() || tl->schema_table) return false;
4590
4591 if (!tl->table) return false;
4592
4593 /*
4594 NOTE: 'table->s' might be NULL for specially constructed TABLE
4595 instances. See SHOW TRIGGERS for example.
4596 */
4597
4598 if (!tl->table->s) return false;
4599
4600 return tl->table->s->tmp_table != NO_TMP_TABLE;
4601}
4602
4603/**
4604 After parsing, a Common Table Expression is accessed through a
4605 Table_ref. This class contains all information about the CTE which the
4606 Table_ref needs.
4607
4608 @note that before and during parsing, the CTE is described by a
4609 PT_common_table_expr.
4610*/
4612 public:
4615 TABLE *clone_tmp_table(THD *thd, Table_ref *tl);
4617 /// Remove one table reference.
4618 void remove_table(Table_ref *tr);
4619 /// Empties the materialized CTE and informs all of its clones.
4620 bool clear_all_references();
4621 /**
4622 All references to this CTE in the statement, except those inside the
4623 query expression defining this CTE.
4624 In other words, all non-recursive references.
4625 */
4627 /// True if it's a recursive CTE
4629 /**
4630 List of all TABLE_LISTSs reading/writing to the tmp table created to
4631 materialize this CTE. Due to shared materialization, only the first one
4632 has a TABLE generated by create_tmp_table(); other ones have a TABLE
4633 generated by open_table_from_share().
4634 */
4636 /// Name of the WITH block. Used only for EXPLAIN FORMAT=tree.
4638};
4639
4640/**
4641 This iterates on those references to a derived table / view / CTE which are
4642 materialized. If a recursive CTE, this includes recursive references.
4643 Upon construction it is passed a non-recursive materialized reference
4644 to the derived table (Table_ref*).
4645 For a CTE it may return more than one reference; for a derived table or a
4646 view, there is only one (as references to a same view are treated as
4647 independent objects).
4648 References are returned as TABLE*.
4649*/
4651 const Table_ref *start; ///< The reference provided in construction.
4652 size_t ref_idx{0}; ///< Current index in cte->tmp_tables
4653 bool m_is_first{true}; ///< True when at first reference in list
4654 public:
4655 explicit Derived_refs_iterator(const Table_ref *start_arg)
4656 : start(start_arg) {}
4659 m_is_first = ref_idx == 0;
4660 // Derived tables and views have a single reference.
4661 if (cte == nullptr) {
4662 return ref_idx++ == 0 ? start->table : nullptr;
4663 }
4664 /*
4665 CTEs may have multiple references. Return the next one, but notice that
4666 some references may have been deleted.
4667 */
4668 while (ref_idx < cte->tmp_tables.size()) {
4669 TABLE *table = cte->tmp_tables[ref_idx++]->table;
4670 if (table != nullptr) return table;
4671 }
4672 return nullptr;
4673 }
4674 void rewind() {
4675 ref_idx = 0;
4676 m_is_first = true;
4677 }
4678 /// @returns true if the last get_next() returned the first element.
4679 bool is_first() const {
4680 // Call after get_next() has been called:
4681 assert(ref_idx > 0);
4682 return m_is_first;
4683 }
4684};
4685
4686/**
4687 RAII class to reset TABLE::autoinc_field_has_explicit_non_null_value after
4688 processing individual row in INSERT or LOAD DATA statements.
4689*/
4691 public:
4693 : m_table(table) {}
4696 }
4697
4698 private:
4700};
4701
4702// Whether we can ask the storage engine for the row ID of the last row read.
4703//
4704// Some operations needs a row ID to operate correctly (i.e. weedout). Normally,
4705// the row ID is provided by the storage engine by calling handler::position().
4706// But there are cases when position() should not be called:
4707//
4708// 1. If we have a const table (rows are fetched during optimization), we
4709// should not call position().
4710// 2. If we have a NULL-complemented row, calling position() would give a
4711// random row ID back, as there has not been any row read.
4712//
4713// Operations that needs the row ID must also check the value of
4714// QEP_TAB::rowid_status to see whether they actually need a row ID.
4715// See QEP_TAB::rowid_status for more details.
4716inline bool can_call_position(const TABLE *table) {
4717 return !table->const_table && !(table->is_nullable() && table->null_row);
4718}
4719
4720//////////////////////////////////////////////////////////////////////////
4721
4722/*
4723 NOTE:
4724 These structures are added to read .frm file in upgrade scenario.
4725
4726 They should not be used any where else in the code.
4727 They will be removed in future release.
4728 Any new code should not be added in this section.
4729*/
4730
4731/**
4732 These members were removed from TABLE_SHARE as they are not used in
4733 in the code. open_binary_frm() uses these members while reading
4734 .frm files.
4735*/
4737 public:
4740 null_field_first(false),
4741 stored_fields(0),
4743 frm_version(0),
4744 fieldnames() {}
4745
4748 uint stored_fields; /* Number of stored fields
4749 (i.e. without generated-only ones) */
4750
4751 enum utype {
4764 EMPTY_VAL, // EMPTY_VAL rather than EMPTY since EMPTY can conflict with
4765 // system headers.
4777 GENERATED_FIELD = 128
4779
4780 /**
4781 For shares representing views File_parser object with view
4782 definition read from .FRM file.
4783 */
4786 TYPELIB fieldnames; /* Pointer to fieldnames */
4787};
4788
4789/**
4790 Create TABLE_SHARE from .frm file.
4791
4792 FRM_context object is used to store the value removed from
4793 TABLE_SHARE. These values are used only for .frm file parsing.
4794
4795 @param[in] thd Thread handle.
4796 @param[in] path Path of the frm file.
4797 @param[out] share TABLE_SHARE to be populated.
4798 @param[out] frm_context FRM_context object.
4799 @param[in] db Database name.
4800 @param[in] table Table name.
4801 @param[in] is_fix_view_cols_and_deps Fix view column data, table
4802 and routine dependency.
4803
4804 @retval 0 ON SUCCESS
4805 @retval -1 ON FAILURE
4806 @retval -2 ON LESS SEVER FAILURE (see read_frm_file)
4807*/
4808int create_table_share_for_upgrade(THD *thd, const char *path,
4809 TABLE_SHARE *share, FRM_context *frm_context,
4810 const char *db, const char *table,
4811 bool is_fix_view_cols_and_deps);
4812//////////////////////////////////////////////////////////////////////////
4813
4814/**
4815 Create a copy of the key_info from TABLE_SHARE object to TABLE object.
4816
4817 Wherever prefix key is present, allocate a new Field object, having its
4818 field_length set to the prefix key length, and point the table's matching
4819 key_part->field to this new Field object.
4820
4821 This ensures that unpack_partition_info() reads the correct prefix length of
4822 partitioned fields
4823
4824 @param table Table for which key_info is to be allocated
4825 @param root MEM_ROOT in which to allocate key_info
4826
4827 @retval false Success
4828 @retval true Failed to allocate memory for table.key_info in root
4829*/
4830
4832
4833#endif /* TABLE_INCLUDED */
uint32_t Access_bitmask
Definition: auth_acls.h:34
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
int64 query_id_t
Definition: binlog.h:72
Per internal schema ACL access rules.
Definition: auth_common.h:149
Per internal table ACL access rules.
Definition: auth_common.h:111
RAII class to reset TABLE::autoinc_field_has_explicit_non_null_value after processing individual row ...
Definition: table.h:4690
Autoinc_field_has_explicit_non_null_value_reset_guard(TABLE *table)
Definition: table.h:4692
~Autoinc_field_has_explicit_non_null_value_reset_guard()
Definition: table.h:4694
Class that represents a single change to a column value in partial update of a JSON column.
Definition: table.h:1373
const char * old_data(const Field *field) const
Get a pointer to the start of the old data to be replaced.
Definition: table.cc:8158
size_t length() const
Definition: table.h:1394
size_t m_length
The size of the portion that is to be replaced.
Definition: table.h:1378
const char * new_data(const Field *field) const
Get a pointer to the start of the replacement data.
Definition: table.cc:8149
Binary_diff(size_t offset, size_t length)
Create a new Binary_diff object.
Definition: table.h:1387
size_t m_offset
The offset of the start of the change.
Definition: table.h:1375
size_t offset() const
Definition: table.h:1391
Definition: sql_bitmap.h:154
Class is used as a BLOB field value storage for intermediate GROUP_CONCAT results.
Definition: table.h:1333
bool truncated_value
Sign that some values were cut during saving into the storage.
Definition: table.h:1340
Blob_mem_storage()
Definition: table.cc:4188
void reset()
Definition: table.h:1346
void set_truncated_value(bool is_truncated_value)
Definition: table.h:1363
MEM_ROOT storage
Definition: table.h:1335
~Blob_mem_storage()
Definition: table.cc:4192
bool is_truncated_value() const
Definition: table.h:1366
char * store(const char *from, size_t length)
Function creates duplicate of 'from' string in 'storage' MEM_ROOT.
Definition: table.h:1360
After parsing, a Common Table Expression is accessed through a Table_ref.
Definition: table.h:4611
Common_table_expr(MEM_ROOT *mem_root)
Definition: table.h:4613
LEX_STRING name
Name of the WITH block. Used only for EXPLAIN FORMAT=tree.
Definition: table.h:4637
TABLE * clone_tmp_table(THD *thd, Table_ref *tl)
Produces, from the first tmp TABLE object, a clone TABLE object for Table_ref 'tl',...
Definition: sql_derived.cc:171
bool clear_all_references()
Empties the materialized CTE and informs all of its clones.
Definition: sql_union.cc:952
bool recursive
True if it's a recursive CTE.
Definition: table.h:4628
Mem_root_array< Table_ref * > references
All references to this CTE in the statement, except those inside the query expression defining this C...
Definition: table.h:4626
void remove_table(Table_ref *tr)
Remove one table reference.
Definition: sql_derived.cc:260
bool substitute_recursive_reference(THD *thd, Query_block *sl)
Replaces the recursive reference in query block 'sl' with a clone of the first tmp table.
Definition: sql_derived.cc:247
Mem_root_array< Table_ref * > tmp_tables
List of all TABLE_LISTSs reading/writing to the tmp table created to materialize this CTE.
Definition: table.h:4635
API for getting cost estimates for server operations that are not directly related to a table object.
Definition: opt_costmodel.h:54
API for getting cost estimates for operations on table data.
Definition: opt_costmodel.h:242
void init(const Cost_model_server *cost_model_server, const TABLE *table)
Initializes the cost model object.
Definition: opt_costmodel.cc:68
Default_object_creation_ctx – default implementation of Object_creation_ctx.
Definition: table.h:237
const CHARSET_INFO * get_client_cs()
Definition: table.h:239
void change_env(THD *thd) const override
Definition: table.cc:221
void delete_backup_ctx() override
Definition: table.cc:219
Default_object_creation_ctx(THD *thd)
Definition: table.cc:206
const CHARSET_INFO * get_connection_cl()
Definition: table.h:241
Object_creation_ctx * create_backup_ctx(THD *thd) const override
Definition: table.cc:214
const CHARSET_INFO * m_connection_cl
connection_cl stores the value of collation_connection session variable.
Definition: table.h:275
const CHARSET_INFO * m_client_cs
client_cs stores the value of character_set_client session variable.
Definition: table.h:265
This structure is used to keep info about possible key for the result table of a derived table/view.
Definition: table.h:2916
table_map referenced_by
Definition: table.h:2918
Field_map used_fields
Definition: table.h:2919
uint key_part_count
Definition: table.h:2920
This iterates on those references to a derived table / view / CTE which are materialized.
Definition: table.h:4650
bool is_first() const
Definition: table.h:4679
TABLE * get_next()
Definition: table.h:4657
Derived_refs_iterator(const Table_ref *start_arg)
Definition: table.h:4655
const Table_ref * start
The reference provided in construction.
Definition: table.h:4651
bool m_is_first
True when at first reference in list.
Definition: table.h:4653
size_t ref_idx
Current index in cte->tmp_tables.
Definition: table.h:4652
void rewind()
Definition: table.h:4674
These members were removed from TABLE_SHARE as they are not used in in the code.
Definition: table.h:4736
utype
Definition: table.h:4751
@ CASEUP
Definition: table.h:4756
@ NO
Definition: table.h:4761
@ NONE
Definition: table.h:4752
@ REL
Definition: table.h:4762
@ NEXT_NUMBER
Definition: table.h:4768
@ DATE
Definition: table.h:4753
@ PNR
Definition: table.h:4757
@ BIT_FIELD
Definition: table.h:4770
@ TIMESTAMP_OLD_FIELD
Definition: table.h:4771
@ GENERATED_FIELD
Definition: table.h:4777
@ INTERVAL_FIELD
Definition: table.h:4769
@ TIMESTAMP_UN_FIELD
Definition: table.h:4775
@ NOEMPTY
Definition: table.h:4755
@ CHECK
Definition: table.h:4763
@ YES
Definition: table.h:4760
@ TIMESTAMP_DNUN_FIELD
Definition: table.h:4776
@ BLOB_FIELD
Definition: table.h:4773
@ UNKNOWN_FIELD
Definition: table.h:4766
@ CASEDN
Definition: table.h:4767
@ TIMESTAMP_DN_FIELD
Definition: table.h:4774
@ PGNR
Definition: table.h:4759
@ EMPTY_VAL
Definition: table.h:4764
@ CAPITALIZE
Definition: table.h:4772
@ SHIELD
Definition: table.h:4754
@ BGNR
Definition: table.h:4758
bool null_field_first
Definition: table.h:4747
uchar frm_version
Definition: table.h:4785
handlerton * default_part_db_type
Definition: table.h:4746
TYPELIB fieldnames
Definition: table.h:4786
const File_parser * view_def
For shares representing views File_parser object with view definition read from .FRM file.
Definition: table.h:4784
uint stored_fields
Definition: table.h:4748
FRM_context()
Definition: table.h:4738
Definition: table.h:4292
~Field_iterator_natural_join() override=default
Natural_join_column * column_ref()
Definition: table.h:4307
void next() override
Definition: table.cc:5246
void set(Table_ref *table) override
Definition: table.cc:5240
Natural_join_column * cur_column_ref
Definition: table.h:4294
Field_iterator_natural_join()
Definition: table.h:4297
const char * name() override
Definition: table.h:4302
Item_ident * create_item(THD *thd) override
Definition: table.h:4303
List_iterator_fast< Natural_join_column > column_ref_it
Definition: table.h:4293
bool end_of_fields() override
Definition: table.h:4301
Field * field() override
Definition: table.h:4306
Generic iterator over the fields of an arbitrary table reference.
Definition: table.h:4324
Field_iterator * field_it
Definition: table.h:4329
Field_iterator_view view_field_it
Definition: table.h:4327
Table_ref * table_ref
Definition: table.h:4325
const char * get_table_name()
Definition: table.cc:5319
Field * field() override
Definition: table.h:4346
const char * get_db_name()
Definition: table.cc:5326
Field_iterator_table_ref()
Definition: table.h:4333
void set(Table_ref *table) override
Definition: table.cc:5296
Natural_join_column * get_or_create_column_ref(THD *thd, Table_ref *parent_table_ref)
Create new or return existing column reference to a column of a natural/using join.
Definition: table.cc:5387
Table_ref * first_leaf
Definition: table.h:4325
GRANT_INFO * grant()
Definition: table.cc:5346
void next() override
Definition: table.cc:5305
Field_iterator_table table_field_it
Definition: table.h:4326
Table_ref * last_leaf
Definition: table.h:4325
const char * name() override
Definition: table.h:4339
Natural_join_column * get_natural_column_ref()
Return an existing reference to a column of a natural/using join.
Definition: table.cc:5467
void set_field_iterator()
Definition: table.cc:5253
Item_ident * create_item(THD *thd) override
Definition: table.h:4343
bool end_of_fields() override
Definition: table.h:4336
Field_iterator_natural_join natural_join_it
Definition: table.h:4328
Definition: table.h:4252
Item_ident * create_item(THD *thd) override
Definition: table.cc:5166
const char * name() override
Definition: table.cc:5164
Field ** ptr
Definition: table.h:4253
void set_table(TABLE *table)
Definition: table.h:4258
void next() override
Definition: table.h:4259
Field_iterator_table()
Definition: table.h:4256
bool end_of_fields() override
Definition: table.h:4260
void set(Table_ref *table) override
Definition: table.h:4257
Field * field() override
Definition: table.h:4263
Iterator over the fields of a merged derived table or view.
Definition: table.h:4270
void next() override
Definition: table.h:4277
Item_ident * create_item(THD *thd) override
Definition: table.cc:5184
Item * item()
Definition: table.h:4283
Table_ref * view
Definition: table.h:4272
Field_iterator_view()
Definition: table.h:4275
Field_translator * field_translator()
Definition: table.h:4284
Item ** item_ptr()
Definition: table.h:4281
void set(Table_ref *table) override
Definition: table.cc:5157
Field * field() override
Definition: table.h:4282
Field_translator * array_end
Definition: table.h:4271
const char * name() override
Definition: table.cc:5182
Field_translator * ptr
Definition: table.h:4271
bool end_of_fields() override
Definition: table.h:4278
Definition: table.h:4236
virtual const char * name()=0
virtual Field * field()=0
virtual void next()=0
virtual void set(Table_ref *)=0
virtual ~Field_iterator()=default
virtual Item_ident * create_item(THD *)=0
virtual bool end_of_fields()=0
A field that stores a JSON value.
Definition: field.h:3908
Definition: field.h:2448
Definition: field.h:573
Definition: parse_file.h:87
Definition: sql_auth_cache.h:476
Base class to be used by handlers different shares.
Definition: handler.h:4296
Intrusive parameterized list.
Definition: sql_plist.h:75
Definition: sql_lex.h:506
Definition: item.h:4529
Definition: item.h:4258
A wrapper Item that normally returns its parameter, but becomes NULL when processing rows for rollup.
Definition: item_func.h:1770
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:929
Query optimization plan node.
Definition: sql_select.h:602
Vector of logical diffs describing changes to a JSON column.
Definition: json_diff.h:141
A path expression which can be used to seek to a position inside a JSON value.
Definition: json_path.h:295
Abstraction for accessing JSON values irrespective of whether they are (started out as) binary JSON v...
Definition: json_dom.h:1268
Definition: key.h:57
Definition: key.h:113
ulong flags
dupp key and pack flags
Definition: key.h:118
Definition: sql_list.h:654
Definition: sql_list.h:494
Context of the owner of metadata locks.
Definition: mdl.h:1415
A pending metadata lock request.
Definition: mdl.h:805
void set_type(enum_mdl_type type_arg)
Set type of lock request.
Definition: mdl.h:856
A granted metadata lock.
Definition: mdl.h:988
An abstract class for inspection of a connected subgraph of the wait-for graph.
Definition: mdl.h:923
Abstract class representing an edge in the waiters graph to be traversed by deadlock detection algori...
Definition: mdl.h:949
This class caches table_paths for materialized tables.
Definition: table.cc:7656
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:432
Storage for name strings.
Definition: item.h:297
Definition: table.h:2680
Item_field * table_field
Definition: table.h:2683
Field_translator * view_field
Definition: table.h:2682
Natural_join_column(Field_translator *field_param, Table_ref *tab)
Definition: table.cc:5086
const char * name()
Definition: table.cc:5109
Table_ref * table_ref
Definition: table.h:2684
bool is_common
Definition: table.h:2692
const char * db_name()
Definition: table.cc:5141
GRANT_INFO * grant()
Definition: table.cc:5155
Field * field()
Definition: table.cc:5128
const char * table_name()
Definition: table.cc:5136
Item_ident * create_item(THD *thd)
Definition: table.cc:5118
Object_creation_ctx – interface for creation context of database objects (views, stored routines,...
Definition: table.h:213
void restore_env(THD *thd, Object_creation_ctx *backup_ctx)
Definition: table.cc:194
Object_creation_ctx()=default
virtual Object_creation_ctx * create_backup_ctx(THD *thd) const =0
virtual void change_env(THD *thd) const =0
virtual void delete_backup_ctx()=0
virtual ~Object_creation_ctx()=default
Object_creation_ctx * set_n_backup(THD *thd)
Definition: table.cc:184
Query block level hints.
Definition: opt_hints.h:378
Table level hints.
Definition: opt_hints.h:567
Definition: sql_executor.h:256
This class represents a query block, aka a query specification, which is a query consisting of a SELE...
Definition: sql_lex.h:1179
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:643
Definition: sql_union.h:40
This class represents a buffer that can be used for multi-row reads.
Definition: record_buffer.h:47
A set of THD members describing the current authenticated user.
Definition: sql_security_ctx.h:54
Definition: sql_sort.h:156
An adapter that takes in another RowIterator and produces the same rows, just in sorted order.
Definition: sorting_iterator.h:58
Class to represent check constraint in the TABLE_SHARE.
Definition: sql_check_constraint.h:110
Class to represent check constraint in the TABLE instance.
Definition: sql_check_constraint.h:145
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:169
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Element that represents the table in the specific table cache.
Definition: table_cache.h:265
Cache for open TABLE objects.
Definition: table_cache.h:74
Definition: table.h:621
Table_check_intact()
Definition: table.h:627
bool has_keys
Definition: table.h:623
virtual void report_error(uint code, const char *fmt,...)=0
bool check(THD *thd, TABLE *table, const TABLE_FIELD_DEF *table_def)
Checks whether a table is intact.
Definition: table.cc:3855
virtual ~Table_check_intact()=default
Class representing a table function.
Definition: table_function.h:53
The Table_histograms_collection manages a collection of reference-counted snapshots of histogram stat...
Definition: table_histograms.h:239
The Table_histograms class represents a snapshot of the collection of histograms associated with a ta...
Definition: table_histograms.h:145
Definition: table.h:2958
bool m_inserted
True if table is target of INSERT statement.
Definition: table.h:3990
LEX_STRING view_body_utf8
Definition: table.h:4103
bool force_index_group_saved
Definition: table.h:4225
bool view_no_explain
if true, EXPLAIN can't explain view due to insufficient rights.
Definition: table.h:4138
AccessPath * GetCachedMaterializedPath(const AccessPath *table_path)
Search m_materialized_path_cache for a materialization path for 'table_path'.
Definition: table.cc:7736
Common_table_expr * m_common_table_expr
If non-NULL, the CTE which this table is derived from.
Definition: table.h:3804
bool is_base_table() const
Definition: table.h:3246
bool m_is_sj_or_aj_nest
Definition: table.h:3703
const char * get_table_name() const
Returns the name of the table that this Table_ref represents.
Definition: table.h:3530
Key_map keys_in_use_for_group_by_saved
Definition: table.h:4220
List< String > * join_using_fields
Definition: table.h:3728
void set_privileges(Access_bitmask privilege)
Set granted privileges for a table.
Definition: table.h:3651
Item * derived_where_cond
WHERE condition from derived table.
Definition: table.h:3896
char timestamp_buffer[20]
Definition: table.h:4045
bool process_index_hints(const THD *thd, TABLE *table)
Compiles the tagged hints list and fills up TABLE::keys_in_use_for_query, TABLE::keys_in_use_for_grou...
Definition: table.cc:6471
MY_BITMAP read_set_saved
Definition: table.h:4227
bool is_updatable() const
Return true if table is updatable.
Definition: table.h:3320
ulonglong with_check
WITH CHECK OPTION.
Definition: table.h:3960
bool generate_keys(THD *thd)
Generate keys for a materialized derived table/view.
Definition: table.cc:7175
void set_lock(const Lock_descriptor &descriptor)
Definition: table.h:3680
Table_ref(TABLE *table_arg, const char *alias_arg)
This constructor can be used when a Table_ref is needed for an existing temporary table.
Definition: table.h:3006
Lock_descriptor m_lock_descriptor
Definition: table.h:3965
bool prepare_replace_filter(THD *thd)
Prepare replace filter for a view (used for REPLACE command)
Definition: table.cc:4809
bool can_push_condition_to_derived(THD *thd)
Check if we can push outer where condition to this derived table.
Definition: sql_derived.cc:1073
COND_EQUAL * cond_equal
Used with outer join.
Definition: table.h:4190
bool materializable_is_const(THD *thd) const
Checks if this is a table that contains zero rows or one row, and that can be materialized during opt...
Definition: table.cc:6623
bool setup_table_function(THD *thd)
Setup a table function to use materialization.
Definition: sql_derived.cc:989
bool is_aj_nest() const
Definition: table.h:3151
LEX_CSTRING m_mv_se_name
m_mv_se_name is the name of the storage engine that might do the materialization.
Definition: table.h:3845
bool is_non_materialized_view_or_derived() const
Return true if this represents a non-materialized view or a derived table.
Definition: table.h:3229
table_map sj_inner_tables
Definition: table.h:3712
LEX * view_query() const
Return the valid LEX object for a view.
Definition: table.h:3426
Table_ref * first_leaf_table()
Return first leaf table of a base table or a view/derived table.
Definition: table.h:3394
table_map m_map
Table map, derived from m_tableno.
Definition: table.h:3695
const Create_col_name_list * derived_column_names() const
Definition: table.h:4162
Table_ref * first_leaf_for_name_resolution()
Retrieve the first (left-most) leaf in a nested join tree with respect to name resolution.
Definition: table.cc:4947
const Create_col_name_list * m_derived_column_names
If the user has specified column names with the syntaxes "table name parenthesis column names": WITH ...
Definition: table.h:3815
Field_translator * field_translation
Array of selected expressions from a derived table or view.
Definition: table.h:3855
bool join_order_swapped
True if was originally the left argument of a RIGHT JOIN, before we made it the right argument of a L...
Definition: table.h:3977
void set_mv_se_materialized(bool is_mv)
Definition: table.h:3937
Table_ref(TABLE *table_arg, const char *db_name_arg, size_t db_length_arg, const char *table_name_arg, size_t table_name_length_arg, const char *alias_arg, enum thr_lock_type lock_type_arg)
Creates a Table_ref object with pre-allocated strings for database, table and alias.
Definition: table.h:2978
void set_mv_se_available(bool mv_available)
Definition: table.h:3931
bool is_multiple_tables() const
Return true if this is a view or derived table that is defined over more than one base table,...
Definition: table.h:3380
ulonglong m_table_ref_version
See comments for TABLE_SHARE::get_table_ref_version()
Definition: table.h:4209
Table_ref * outer_join_nest() const
Returns the outer join nest that this Table_ref belongs to, if any.
Definition: table.h:3564
bool has_tablesample() const
Definition: table.h:3909
double sampling_percentage_val
Definition: table.h:3793
void set_updatable()
Set table as updatable. (per default, a table is non-updatable)
Definition: table.h:3323
bool prepare_security(THD *thd)
Prepare security context for a view.
Definition: table.cc:5063
void set_deleted()
Set table and all referencing views as being deleted from.
Definition: table.h:3353
bool check_option_processed
true <=> VIEW CHECK OPTION condition is processed (also for prep. stmts)
Definition: table.h:4040
bool check_single_table(Table_ref **table_ref, table_map map)
Check which single table inside a view that matches a table map.
Definition: table.cc:4875
bool is_external() const
Is this table only available in an external storage engine?
Definition: table.cc:7583
void set_derived_query_expression(Query_expression *query_expr)
Set the query expression of a derived table or view.
Definition: table.h:3435
Query_block * schema_query_block
Definition: table.h:3828
ST_SCHEMA_TABLE * schema_table
Definition: table.h:3827
enum_table_ref_type m_table_ref_type
See comments for set_metadata_id()
Definition: table.h:4207
ulonglong updatable_view
VIEW can be updated.
Definition: table.h:3927
table_map map() const
Return table map derived from table number.
Definition: table.h:4153
Item * m_join_cond
If this table or join nest is the Y in "X [LEFT] JOIN Y ON C", this member points to C.
Definition: table.h:3702
bool cacheable_table
stop PS caching
Definition: table.h:4025
bool is_derived_unfinished_materialization() const
Definition: table.cc:7573
void set_derived_column_names(const Create_col_name_list *d)
Definition: table.h:4165
Table_ref * embedding
The nested join containing this table reference.
Definition: table.h:4021
bool is_placeholder() const
Definition: table.h:3272
bool schema_table_filled
Definition: table.h:4133
void set_updated()
Set table and all referencing views as being updated.
Definition: table.h:3335
void set_uses_materialization()
Set table to be materialized.
Definition: table.h:3312
Table_ref(const char *db_name, size_t db_length_arg, const char *table_name_arg, size_t table_name_length_arg, const char *alias_arg, enum thr_lock_type lock_type_arg, enum enum_mdl_type mdl_request_type)
Definition: table.h:3095
Field_translator * field_translation_end
pointer to element after last one in translation table above
Definition: table.h:3858
Security_context * find_view_security_context(THD *thd)
Find security context of current view.
Definition: table.cc:5032
Key_map merge_keys_saved
Definition: table.h:4218
bool setup_materialized_derived_tmp_table(THD *thd)
Sets up the tmp table to contain the derived table's rows.
Definition: sql_derived.cc:865
mem_root_deque< Table_ref * > * join_list
The join list immediately containing this table reference.
Definition: table.h:4023
bool is_mergeable() const
Return true if view or derived table and can be merged.
Definition: table.cc:6603
bool m_mv_se_materialized
m_mv_se_materialized true indicates that the view is a materialized view that is materialized by a st...
Definition: table.h:3842
mem_root_deque< Table_ref * > * view_tables
Definition: table.h:3870
uint m_tableno
The members below must be kept aligned so that (1 << m_tableno) == m_map.
Definition: table.h:3694
void print(const THD *thd, String *str, enum_query_type query_type) const
Produce a textual identification of this object.
Definition: sql_lex.cc:2985
Table_ref * referencing_view
Definition: table.h:3877
void set_fulltext_searched()
Set table as full-text search (default is not fulltext searched)
Definition: table.h:3359
Table_ref * correspondent_table
Definition: table.h:3762
bool is_view() const
Return true if this represents a named view.
Definition: table.h:3220
List< Natural_join_column > * join_columns
Definition: table.h:3733
int view_check_option(THD *thd) const
Evaluate the check option of a view.
Definition: table.cc:4852
const char * get_db_name() const
Returns the name of the database that the referenced table belongs to.
Definition: table.h:3522
bool updating
True for tables and views being changed in a data change statement.
Definition: table.h:4002
bool m_insertable
True if VIEW/TABLE is insertable, based on analysis of query (SQL rules).
Definition: table.h:3986
bool is_mv_se_available() const
Definition: table.h:3929
void set_readonly()
Set table as readonly, ie it is neither updatable, insertable nor deletable during this statement.
Definition: table.h:3371
bool is_updated() const
Return true if table is being updated.
Definition: table.h:3332
bool m_updatable
True if VIEW/TABLE is updatable, based on analysis of query (SQL rules).
Definition: table.h:3984
void set_tableno(uint tableno)
Set table number.
Definition: table.h:4144
enum_view_algorithm effective_algorithm
The view algorithm that is actually used, if this is a view.
Definition: table.h:3964
bool is_inner_table_of_outer_join() const
Return true if this table is an inner table of some outer join.
Definition: table.h:3579
Table_ref * belong_to_view
Definition: table.h:3872
LEX * view
Definition: table.h:3838
bool set_insert_values(MEM_ROOT *mem_root)
Allocate a buffer for inserted column values.
Definition: table.cc:4896
MY_BITMAP read_set_internal_saved
Definition: table.h:4229
bool is_derived() const
Return true if this represents a derived table (an unnamed view)
Definition: table.h:3223
bool derived_keys_ready
true <=> all possible keys for a derived table were collected and could be re-used while statement re...
Definition: table.h:4199
const Table_ref * updatable_base_table() const
Return the base table entry of an updatable table.
Definition: table.h:3592
enum_view_type view_type
If view, then type of a view.
Definition: table.h:4109
void restore_properties()
Restore persistent properties into TABLE from Table_ref.
Definition: table.cc:4580
Table_ref ** prev_global
Definition: table.h:3666
Query_block * query_block
Definition: table.h:3835
const Table_ref * top_table() const
Return the outermost view this table belongs to, or itself.
Definition: table.h:3201
void set_merged()
Set table to be merged.
Definition: table.h:3301
void set_insertable()
Set table as insertable-into. (per default, a table is not insertable)
Definition: table.h:3329
const LEX_CSTRING & get_mv_se_name() const
Definition: table.h:3939
uint tableno() const
Return table number.
Definition: table.h:4150
size_t db_length
Definition: table.h:3979
List< Index_hint > * index_hints
Definition: table.h:3746
LEX_STRING select_stmt
text of (CREATE/SELECT) statement
Definition: table.h:3899
Table_ref(const char *db_name_arg, size_t db_length_arg, const char *table_name_arg, size_t table_name_length_arg, const char *alias_arg, enum thr_lock_type lock_type_arg)
Definition: table.h:3111
bool is_natural_join
Definition: table.h:3726
Query_expression * derived
This field is set to non-null for derived tables and views.
Definition: table.h:3801
MY_BITMAP lock_partitions_saved
Definition: table.h:4226
bool is_fulltext_searched() const
Returns true if a MATCH function references this table.
Definition: table.h:3362
Table_ref * natural_join
Definition: table.h:3720
bool outer_join
True if right argument of LEFT JOIN; false in other cases (i.e.
Definition: table.h:3974
Table_ref * parent_l
Definition: table.h:3879
bool is_table_function() const
Return true if this represents a table function.
Definition: table.h:3234
bool m_updated
True if table is target of UPDATE statement, or updated in IODKU stmt.
Definition: table.h:3988
bool optimized_away
true <=> this table is a const one and was optimized away.
Definition: table.h:4193
bool is_insertable() const
Return true if table is insertable-into.
Definition: table.h:3326
bool is_alias
true if an alias for this table was specified in the SQL.
Definition: table.h:4070
Table_ref()=default
bool straight
Definition: table.h:3995
int fetch_number_of_rows(ha_rows fallback_estimate=PLACEHOLDER_TABLE_ROW_ESTIMATE)
Retrieve number of rows in the table.
Definition: table.cc:6702
void set_join_cond(Item *val)
Definition: table.h:3132
bool is_system_view
Definition: table.h:4106
uint8 trg_event_map
Indicates what triggers we need to pre-load for this Table_ref when opening an associated TABLE.
Definition: table.h:4132
Table_ref * last_leaf_for_name_resolution()
Retrieve the last (right-most) leaf in a nested join tree with respect to name resolution.
Definition: table.cc:4963
bool schema_table_reformed
Definition: table.h:3833
bool is_sj_or_aj_nest() const
Definition: table.h:3153
Key_map keys_in_use_for_query_saved
Definition: table.h:4219
MY_BITMAP write_set_saved
Definition: table.h:4228
List< String > * partition_names
Definition: table.h:4141
bool force_index_order_saved
Definition: table.h:4224
Query_expression * derived_query_expression() const
Return the query expression of a derived table or view.
Definition: table.h:3440
bool ignore_leaves
preload only non-leaf nodes (IS THIS USED???)
Definition: table.h:4004
Table_ref * next_leaf
Definition: table.h:3895
bool is_leaf_for_name_resolution() const
Test if this is a leaf with respect to name resolution.
Definition: table.cc:4924
Table_ref * next_local
Definition: table.h:3664
Table_ref * merge_underlying_list
Definition: table.h:3864
LEX_CSTRING target_tablespace_name
Definition: table.h:3672
dd::enum_table_type required_type
Definition: table.h:4044
static Table_ref * new_nested_join(MEM_ROOT *allocator, const char *alias, Table_ref *embedding, mem_root_deque< Table_ref * > *belongs_to, Query_block *select)
Create a Table_ref object representing a nested join.
Definition: table.cc:4452
bool m_was_scalar_subquery
If true, this table is a derived (materialized) table which was created from a scalar subquery,...
Definition: table.h:4080
bool is_recursive_reference() const
Definition: table.h:3243
GRANT_INFO grant
Definition: table.h:3968
Table_ref * top_table()
Definition: table.h:3205
bool is_table_ref_id_equal(TABLE_SHARE *s) const
Compare the version of metadata from the previous execution (if any) with values obtained from the cu...
Definition: table.h:3484
void set_sj_or_aj_nest()
Makes the next a semi/antijoin nest.
Definition: table.h:3155
bool validate_tablesample_clause(THD *thd)
Definition: table.cc:7597
void set_table_ref_id(enum_table_ref_type table_ref_type_arg, ulonglong table_ref_version_arg)
Definition: table.h:3499
void set_tablesample(tablesample_type sampling_type_arg, Item *sampling_percentage_arg)
Definition: table.h:3903
bool is_internal() const
Definition: table.h:3262
void set_mv_se_name(const char *engine_name)
Definition: table.h:3941
bool prepare_view_security_context(THD *thd)
Load security context information for this view.
Definition: table.cc:4987
const Lock_descriptor & lock_descriptor() const
Definition: table.h:3684
bool nullable_saved
Definition: table.h:4222
NESTED_JOIN * nested_join
Is non-NULL if this table reference is a nested join, ie it represents the inner tables of an outer j...
Definition: table.h:4019
Table_ref(TABLE *table_arg, const char *alias_arg, enum_mdl_type mdl_type)
Sets an explicit enum_mdl_type value, without initializing m_lock_descriptor.
Definition: table.h:3023
const char * db
Definition: table.h:3667
Security_context * security_ctx
Definition: table.h:3884
bool is_inserted() const
Return true if table is being inserted into.
Definition: table.h:3341
Table_ref(const char *db_name, size_t db_length_arg, const char *table_name_arg, size_t table_name_length_arg, enum thr_lock_type lock_type_arg, enum enum_mdl_type mdl_request_type)
Definition: table.h:3050
bool materialize_derived(THD *thd)
Materialize derived table.
Definition: sql_derived.cc:1747
MaterializedPathCache * m_materialized_path_cache
If we've previously made an access path for “derived”, it is cached here.
Definition: table.h:3824
Security_context * view_sctx
Definition: table.h:3889
bool merge_where(THD *thd)
Merge WHERE condition of view or derived table into outer query.
Definition: table.cc:4616
ulonglong view_suid
view is suid (true by default)
Definition: table.h:3959
ulonglong algorithm
The declared algorithm, if this is a view.
Definition: table.h:3958
uint get_hidden_field_count_for_derived() const
Return the number of hidden fields added for the temporary table created for this derived table.
Definition: table.cc:7578
List< Derived_key > derived_key_list
Definition: table.h:4125
bool prepare_check_option(THD *thd, bool is_cascaded=false)
Prepare check option for a view.
Definition: table.cc:4750
void set_common_table_expr(Common_table_expr *c)
Definition: table.h:4160
enum Table_ref::@194 OPEN_NORMAL
Indicates that if Table_ref object corresponds to the table/view which requires special handling.
Table_ref * next_global
Definition: table.h:3666
bool optimize_derived(THD *thd)
Optimize the query expression representing a derived table/view.
Definition: sql_derived.cc:1635
LEX_STRING timestamp
GMT time stamp of last operation.
Definition: table.h:3901
bool replace_filter_processed
true <=> Filter condition is processed
Definition: table.h:4042
tablesample_type sampling_type
Sampling information.
Definition: table.h:3790
Table_ref(const char *db_name, const char *table_name_arg, enum thr_lock_type lock_type_arg, enum enum_mdl_type mdl_request_type)
Definition: table.h:3035
mysql::binlog::event::Table_id table_id
Definition: table.h:3749
enum_open_type open_type
Specifies which kind of table should be open for this element of table list.
Definition: table.h:4036
@ OPEN_IF_EXISTS
Definition: table.h:4059
@ OPEN_STUB
Definition: table.h:4066
@ OPEN_FOR_CREATE
Definition: table.h:4064
Item * m_join_cond_optim
Optimized copy of m_join_cond (valid for one single execution).
Definition: table.h:4187
table_map join_cond_dep_tables
The outer tables that an outer join's join condition depends on.
Definition: table.h:4011
Table_ref * updatable_base_table()
Definition: table.h:3606
Item * replace_filter
Filter for REPLACE command.
Definition: table.h:3898
bool merge_underlying_tables(Query_block *select)
Merge tables from a query block into a nested join structure.
Definition: table.cc:4488
Common_table_expr * common_table_expr() const
If non-NULL, the CTE which this table is derived from.
Definition: table.h:4159
bool internal_tmp_table
Definition: table.h:4068
LEX_STRING source
source of CREATE VIEW
Definition: table.h:3900
bool update_sampling_percentage()
Definition: table.cc:7629
Table_ref(const char *db_name, size_t db_length_arg, const char *table_name_arg, size_t table_name_length_arg, enum thr_lock_type lock_type_arg)
Definition: table.h:3066
LEX_CSTRING view_connection_cl_name
Definition: table.h:4097
bool has_stored_program() const
Definition: table.cc:6618
LEX_CSTRING view_client_cs_name
Definition: table.h:4096
bool save_properties()
Save persistent properties from TABLE into Table_ref.
Definition: table.cc:4549
bool is_join_columns_complete
Definition: table.h:3735
const char * open_for_fk_name
Used to store foreign key name to identify correct table handle from thd->open_tables during find_fk_...
Definition: table.h:4030
bool m_is_recursive_reference
If a recursive reference inside the definition of a CTE.
Definition: table.h:4203
bool is_deleted() const
Return true if table is being deleted from.
Definition: table.h:3350
bool prelocking_placeholder
Definition: table.h:4050
LEX_USER definer
definer of view
Definition: table.h:3902
bool is_json_duality_view() const
If view, then check if view is JSON duality view.
Definition: table.h:4175
const char * table_name
Definition: table.h:3667
jdv::Content_tree_node * jdv_content_tree
If json duality view, then represents duality view content tree node.
Definition: table.h:4112
Item * sampling_percentage
Definition: table.h:3769
uint shared
Definition: table.h:3978
Item ** join_cond_optim_ref()
Definition: table.h:3146
bool create_field_translation(THD *thd)
Create field translation for merged derived table/view.
Definition: table.cc:4653
bool create_materialized_table(THD *thd)
Create result table for a materialized derived table/view.
Definition: sql_derived.cc:1685
uint query_block_id_for_explain() const
This is for showing in EXPLAIN.
Definition: table.cc:6416
Opt_hints_table * opt_hints_table
Table level optimizer hints for this table.
Definition: table.h:3676
tablesample_type get_sampling_type() const
Definition: table.h:3919
bool setup_materialized_derived(THD *thd)
Setup a derived table to use materialization.
Definition: sql_derived.cc:853
Table_ref * any_outer_leaf_table()
Return any leaf table that is not an inner table of an outer join.
Definition: table.h:3405
View_creation_ctx * view_creation_ctx
Definition: table.h:4084
char * option
Definition: table.h:3673
void AddMaterializedPathToCache(THD *thd, AccessPath *materialize_path, const AccessPath *table_path)
For a view or derived table: Add materialize_path and table_path to m_materialized_path_cache.
Definition: table.cc:7744
double get_sampling_percentage() const
Definition: table.cc:7645
Table_ref(const char *db_name, size_t db_length_arg, const char *table_name_arg, size_t table_name_length_arg, const char *alias_arg, enum enum_mdl_type mdl_request_type)
Sets an explicit enum_mdl_type value, without initializing m_lock_descriptor.
Definition: table.h:3081
TABLE * table
Definition: table.h:3747
void set_view_query(LEX *lex)
Set the LEX object of a view (will also define this as a view).
Definition: table.h:3423
void set_inserted()
Set table and all referencing views as being inserted into.
Definition: table.h:3344
bool update_derived_keys(THD *, Field *, Item **, uint, bool *)
Update derived table's list of possible keys.
Definition: table.cc:7038
uint query_block_id() const
If a derived table, returns query block id of first underlying query block.
Definition: table.cc:6411
bool m_fulltext_searched
True if fulltext searched.
Definition: table.h:3993
Item * join_cond() const
Definition: table.h:3131
Table_ref * next_name_resolution_table
Definition: table.h:3744
bool is_view_or_derived() const
Return true if this represents a named view or a derived table.
Definition: table.h:3226
bool is_merged() const
Return true if this is a derived table or view that is merged.
Definition: table.h:3298
void set_join_cond_optim(Item *cond)
Definition: table.h:3138
table_map dep_tables
The set of tables in the query block that this table depends on.
Definition: table.h:4009
size_t table_name_length
Definition: table.h:3980
bool uses_materialization() const
Return true if this is a materializable derived table/view.
Definition: table.h:3307
void add_join_natural(Table_ref *b)
Mark that there is a NATURAL JOIN or JOIN ... USING between two tables.
Definition: table.h:3641
bool is_sj_nest() const
Definition: table.h:3149
bool contain_auto_increment
Definition: table.h:4038
bool m_mv_se_available
m_mv_se_available indicates that the current Table_ref is using the materialized view.
Definition: table.h:3851
bool resolve_derived(THD *thd, bool apply_semijoin)
Resolve a derived table or view reference.
Definition: sql_derived.cc:274
Key_map covering_keys_saved
Definition: table.h:4217
bool is_mv_se_materialized() const
Definition: table.h:3935
uint leaf_tables_count() const
Return no. of base tables a merged view or derived table is defined over.
Definition: table.cc:6637
const char * alias
Definition: table.h:3667
Item * join_cond_optim() const
Definition: table.h:3137
bool set_recursive_reference()
Definition: table.cc:7566
Opt_hints_qb * opt_hints_qb
Definition: table.h:3678
bool is_dd_ctx_table
Definition: table.h:4120
Table_ref(TABLE *table_arg)
Only to be used by legacy code that temporarily needs a Table_ref, more specifically: Query_result_cr...
Definition: table.h:2966
bool is_fqtn
true if the table is referred to in the statement using a fully qualified name (<db_name>.
Definition: table.h:4074
void set_mv_se_name(const LEX_CSTRING &engine_name)
Definition: table.h:3946
bool force_index_saved
Definition: table.h:4223
Table_ref(const char *db_name, const char *table_name, enum thr_lock_type lock_type)
Constructor that can be used when the strings are null terminated.
Definition: table.h:2969
Item ** join_cond_ref()
Definition: table.h:3130
void ClearMaterializedPathCache()
Empty m_materialized_path_cache.
Definition: table.h:3786
Key_map keys_in_use_for_order_by_saved
Definition: table.h:4221
Table_function * table_function
Definition: table.h:3767
bool m_deleted
True if table is target of DELETE statement, or deleted in REPLACE stmt.
Definition: table.h:3992
MDL_request mdl_request
Definition: table.h:4135
Table_ref(const char *db_name, const char *table_name, const char *alias, enum thr_lock_type lock_type)
Constructor that can be used when the strings are null terminated.
Definition: table.h:2994
Item * check_option
WITH CHECK OPTION condition.
Definition: table.h:3897
Query_result_union * derived_result
Definition: table.h:3754
void set_table_ref_id(TABLE_SHARE *s)
Record the value of metadata version of the corresponding table definition cache element in this pars...
Definition: table.h:3495
void reset()
Reset table.
Definition: table.cc:4503
This class holds all information about triggers of a table.
Definition: table_trigger_dispatcher.h:68
Object containing parameters used when creating and using temporary tables.
Definition: temp_table_param.h:97
This class represents a trigger object.
Definition: trigger.h:90
Used for storing information associated with generated column, default values generated from expressi...
Definition: field.h:481
View_creation_ctx – creation context of view objects.
Definition: table.h:282
static View_creation_ctx * create(THD *thd)
Definition: table.cc:232
View_creation_ctx(THD *thd)
Definition: table.h:289
Class representing the fact that some thread waits for table share to be flushed.
Definition: table.h:651
MDL_context * m_ctx
Definition: table.h:652
Wait_for_flush ** prev_in_share
Definition: table.h:673
Wait_for_flush * next_in_share
Pointers for participating in the list of waiters for table share.
Definition: table.h:672
TABLE_SHARE * m_share
Definition: table.h:653
MDL_context * get_ctx() const
Definition: table.h:663
uint m_deadlock_weight
Definition: table.h:654
bool accept_visitor(MDL_wait_for_graph_visitor *dvisitor) override
Traverse portion of wait-for graph which is reachable through edge represented by this flush ticket i...
Definition: table.cc:3993
Wait_for_flush(MDL_context *ctx_arg, TABLE_SHARE *share_arg, uint deadlock_weight_arg)
Definition: table.h:657
uint get_deadlock_weight() const override
Definition: table.cc:3997
enum_rule
Definition: foreign_key.h:54
Definition: table.h:47
Definition: view.h:39
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4752
enum handler::@60 inited
@ NONE
Definition: handler.h:4839
Histogram base class.
Definition: histogram.h:315
Definition: content_tree.h:120
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:172
Each table share has a table id, it is mainly used for row based replication.
Definition: table_id.h:42
Definition: partition_info.h:209
A table definition from the master.
Definition: rpl_utility.h:249
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
enum_query_type
Query type constants (usable as bitmap flags).
Definition: enum_query_type.h:31
This file contains the field type.
enum_field_types
Column types for MySQL Note: Keep include/mysql/components/services/bits/stored_program_bits....
Definition: field_types.h:55
void * memdup_root(MEM_ROOT *root, const void *str, size_t len)
Definition: my_alloc.cc:296
struct PSI_table_share PSI_table_share
Definition: psi_table_bits.h:100
static void free_share(st_blackhole_share *share)
Definition: ha_blackhole.cc:308
static int flag
Definition: hp_test1.cc:40
static uint keys
Definition: hp_test2.cc:49
enum_json_diff_operation
Enum that describes what kind of operation a Json_diff object represents.
Definition: json_diff.h:52
float rec_per_key_t
Data type for records per key estimates that are stored in the KEY::rec_per_key_float[] array.
Definition: key.h:96
enum_order
Definition: key_spec.h:65
@ ORDER_NOT_RELEVANT
Definition: key_spec.h:65
constexpr const LEX_CSTRING EMPTY_CSTR
Definition: lex_string.h:49
constexpr const LEX_CSTRING NULL_CSTR
Definition: lex_string.h:48
A better implementation of the UNIX ctype(3) library.
int my_strcasecmp(const CHARSET_INFO *cs, const char *s1, const char *s2)
Definition: m_ctype.h:651
MYSQL_PLUGIN_IMPORT CHARSET_INFO * system_charset_info
Definition: mysqld.cc:1578
#define MDL_REQUEST_INIT(R, P1, P2, P3, P4, P5)
Definition: mdl.h:909
@ MDL_TRANSACTION
Locks with transaction duration are automatically released at the end of transaction.
Definition: mdl.h:344
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
This file includes constants used by all storage engines.
#define HA_VIRTUAL_GEN_KEY
Set if a key is on any virtual generated columns.
Definition: my_base.h:557
ulong key_part_map
Definition: my_base.h:1095
my_off_t ha_rows
Definition: my_base.h:1228
#define HA_POS_ERROR
Definition: my_base.h:1230
ha_storage_media
Definition: my_base.h:116
@ HA_SM_DEFAULT
Definition: my_base.h:117
uint32 my_bitmap_map
Definition: my_bitmap.h:41
Header for compiler-dependent features.
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
uint8_t uint8
Definition: my_inttypes.h:63
unsigned char uchar
Definition: my_inttypes.h:52
int64_t int64
Definition: my_inttypes.h:68
uint16_t uint16
Definition: my_inttypes.h:65
uint32_t uint32
Definition: my_inttypes.h:67
Common header for many mysys elements.
uint64_t table_map
Definition: my_table_map.h:30
#define NAME_CHAR_LEN
Field/table name length.
Definition: mysql_com.h:60
ABI for instrumented mutexes.
static char * path
Definition: mysqldump.cc:150
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1077
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Definition: buf0block_hint.cc:30
static PFS_engine_table_share_proxy share
Definition: connection_control_pfs_table.cc:92
const std::string charset("charset")
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:44
enum_table_type
Definition: abstract_table.h:53
Definition: os0file.h:89
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
bool index(const std::string &value, const String &search_for, uint32_t *idx)
Definition: contains.h:76
Definition: column_statistics.h:34
Definition: content_tree.cc:39
Json_data_extension ext
Definition: backend.cc:50
entry::Table Table
Definition: select.h:51
size_t size(const char *const c)
Definition: base64.h:46
const char * table_name
Definition: rules_table_service.cc:56
const char * db_name
Definition: rules_table_service.cc:55
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2898
Performance schema instrumentation interface.
required string key
Definition: replication_asynchronous_connection_failover.proto:60
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:61
repeated Source source
Definition: replication_asynchronous_connection_failover.proto:42
Value_generator_source
Enum to indicate source for which value generator is used.
Definition: field.h:471
enum_stats_auto_recalc
Definition: handler.h:3346
row_type
Definition: handler.h:691
void free_blobs(TABLE *table)
Definition: table.cc:3457
LEX_CSTRING SLOW_LOG_NAME
Definition: table.cc:153
bool update_generated_write_fields(const MY_BITMAP *bitmap, TABLE *table)
Calculate data for each generated field marked for write in the corresponding column map.
Definition: table.cc:7501
I_P_List< Wait_for_flush, I_P_List_adapter< Wait_for_flush, &Wait_for_flush::next_in_share, &Wait_for_flush::prev_in_share > > Wait_for_flush_list
Definition: table.h:680
enum_open_type
Type of table which can be open for an element of table list.
Definition: table.h:2901
@ OT_TEMPORARY_OR_BASE
Definition: table.h:2902
@ OT_TEMPORARY_ONLY
Definition: table.h:2903
@ OT_BASE_ONLY
Definition: table.h:2904
static my_bitmap_map * tmp_use_all_columns(TABLE *table, MY_BITMAP *bitmap)
Definition: table.h:4358
int64 query_id_t
Definition: table.h:150
bool unpack_value_generator(THD *thd, TABLE *table, Value_generator **val_generator, Value_generator_source source, const char *source_name, Field *field, bool is_create_table, bool *error_reported)
Unpacks the definition of a value generator in all its forms: generated column, default expression or...
Definition: table.cc:2611
static void tmp_restore_column_map(MY_BITMAP *bitmap, my_bitmap_map *old)
Definition: table.h:4365
static void empty_record(TABLE *table)
Definition: table.h:2576
bool assert_invalid_stats_is_locked(const TABLE *)
Assert that caller holds lock on the table cache when TABLE::m_invalid_stats is accessed.
Definition: table.cc:8488
static my_bitmap_map * dbug_tmp_use_all_columns(TABLE *table, MY_BITMAP *bitmap)
Definition: table.h:4372
char * fn_rext(char *name)
Returns pointer to '.frm' extension of the file name.
Definition: table.cc:307
bool is_simple_order(ORDER *order)
Test if the order list consists of simple field expressions.
Definition: table.cc:7344
LEX_CSTRING MYSQL_SCHEMA_NAME
Definition: table.cc:144
enum enum_mdl_type mdl_type_for_dml(enum thr_lock_type lock_type)
Derive type of metadata lock to be requested for table used by a DML statement from the type of THR_L...
Definition: table.h:2890
bool create_key_part_field_with_prefix_length(TABLE *table, MEM_ROOT *root)
Create a copy of the key_info from TABLE_SHARE object to TABLE object.
Definition: table.cc:2836
bool is_user_table(TABLE *table)
return true if the table was created explicitly.
Definition: table.h:4562
bool assert_invalid_dict_is_locked(const TABLE *)
Assert that LOCK_thd_data is held when TABLE::m_invalid_dict is accessed.
Definition: table.cc:8475
void update_create_info_from_table(HA_CREATE_INFO *info, TABLE *form)
Definition: table.cc:3630
enum_view_algorithm
Strategy for how to process a view or derived table (merge or materialization)
Definition: table.h:2632
@ VIEW_ALGORITHM_TEMPTABLE
Definition: table.h:2634
@ VIEW_ALGORITHM_UNDEFINED
Definition: table.h:2633
@ VIEW_ALGORITHM_MERGE
Definition: table.h:2635
Mem_root_array_YY< LEX_CSTRING > Create_col_name_list
Definition: table.h:148
LEX_CSTRING MI_INFO_NAME
Definition: table.cc:159
bool is_infoschema_db(const char *name, size_t len)
Definition: table.h:4525
enum_view_type
Definition: table.h:2638
bool update_generated_read_fields(uchar *buf, TABLE *table, uint active_index=MAX_KEY)
Evaluate necessary virtual generated columns.
Definition: table.cc:7439
bool is_perfschema_db(const char *name, size_t len)
Definition: table.h:4535
Ident_name_check
Enumerate possible status of a identifier name while determining its validity.
Definition: table.h:202
Ident_name_check check_and_convert_db_name(LEX_STRING *db, bool preserve_lettercase)
Check if database name is valid, and convert to lower case if necessary.
Definition: table.cc:3758
LEX_CSTRING GENERAL_LOG_NAME
Definition: table.cc:150
const uchar * get_field_name(const uchar *arg, size_t *length)
LEX_CSTRING WORKER_INFO_NAME
Definition: table.cc:162
tmp_table_type
Definition: table.h:425
@ TRANSACTIONAL_TMP_TABLE
Definition: table.h:428
@ NON_TRANSACTIONAL_TMP_TABLE
Definition: table.h:427
@ INTERNAL_TMP_TABLE
Definition: table.h:429
@ NO_TMP_TABLE
Definition: table.h:426
@ SYSTEM_TMP_TABLE
Definition: table.h:430
int closefrm(TABLE *table, bool free_share)
Free information allocated by openfrm.
Definition: table.cc:3387
enum_table_category
Category of table found in the table share.
Definition: table.h:436
@ TABLE_CATEGORY_ACL_TABLE
A ACL metadata table.
Definition: table.h:604
@ TABLE_UNKNOWN_CATEGORY
Unknown value.
Definition: table.h:440
@ TABLE_CATEGORY_USER
User table.
Definition: table.h:475
@ TABLE_CATEGORY_RPL_INFO
Replication Information Tables.
Definition: table.h:572
@ TABLE_CATEGORY_INFORMATION
Information schema tables.
Definition: table.h:509
@ TABLE_CATEGORY_GTID
Gtid Table.
Definition: table.h:589
@ TABLE_CATEGORY_DICTIONARY
A data dictionary table.
Definition: table.h:597
@ TABLE_CATEGORY_PERFORMANCE
Performance schema tables.
Definition: table.h:553
@ TABLE_CATEGORY_LOG
Log tables.
Definition: table.h:531
@ TABLE_CATEGORY_SYSTEM
System table, maintained by the server.
Definition: table.h:487
@ TABLE_CATEGORY_TEMPORARY
Temporary table.
Definition: table.h:465
bool is_temporary_table(const Table_ref *tl)
Check if a Table_ref instance represents a pre-opened temporary table.
Definition: table.h:4588
enum_table_ref_type
Enumerate possible types of a table from re-execution standpoint.
Definition: table.h:189
@ TABLE_REF_VIEW
Definition: table.h:192
@ TABLE_REF_BASE_TABLE
Definition: table.h:193
@ TABLE_REF_I_S_TABLE
Definition: table.h:194
@ TABLE_REF_TMP_TABLE
Definition: table.h:195
@ TABLE_REF_NULL
Initial value set by the parser.
Definition: table.h:191
bool check_column_name(const Name_string &namestring)
Definition: table.cc:3824
#define STATUS_DELETED
Reserved for use by multi-table delete. Means the row has been deleted.
Definition: table.h:1444
TABLE_CATEGORY get_table_category(const LEX_CSTRING &db, const LEX_CSTRING &name)
Definition: table.cc:313
uint add_pk_parts_to_sk(KEY *sk, uint sk_n, KEY *pk, uint pk_n, TABLE_SHARE *share, handler *handler_file, uint *usable_parts, bool use_extended_sk)
Generate extended secondary keys by adding primary key parts to the existing secondary key.
Definition: table.cc:818
bool can_call_position(const TABLE *table)
Definition: table.h:4716
#define STATUS_UPDATED
Reserved for use by multi-table update. Means the row has been updated.
Definition: table.h:1437
#define tmp_file_prefix
Prefix for tmp tables.
Definition: table.h:169
Lex_acl_attrib_udyn
This is generic enum.
Definition: table.h:2709
static const uint MYSQL_SCHEMA_DD_ID
Definition: table.h:4514
Bitmap< MAX_FIELDS > Field_map
Definition: table.h:1450
index_hint_type
Definition: table.h:1447
@ INDEX_HINT_FORCE
Definition: table.h:1447
@ INDEX_HINT_IGNORE
Definition: table.h:1447
@ INDEX_HINT_USE
Definition: table.h:1447
int create_table_share_for_upgrade(THD *thd, const char *path, TABLE_SHARE *share, FRM_context *frm_context, const char *db, const char *table, bool is_fix_view_cols_and_deps)
Create TABLE_SHARE from .frm file.
Definition: table.cc:8381
void append_unescaped(String *res, const char *pos, size_t length)
Store an SQL quoted string.
Definition: table.cc:3593
Ident_name_check check_table_name(const char *name, size_t length)
Function to check if table name is valid or not.
Definition: table.cc:3797
char * get_field(MEM_ROOT *mem, Field *field)
Allocate string field in MEM_ROOT and return it as NULL-terminated string.
Definition: table.cc:3692
LEX_CSTRING MYSQL_TABLESPACE_NAME
Definition: table.cc:147
static const uint MYSQL_TABLESPACE_DD_ID
Definition: table.h:4518
#define STATUS_NOT_STARTED
Flags for TABLE::m_status (maximum 8 bits).
Definition: table.h:1429
void setup_key_part_field(TABLE_SHARE *share, handler *handler_file, uint primary_key_n, KEY *keyinfo, uint key_n, uint key_part_n, uint *usable_parts, bool part_of_key_not_extended)
Setup key-related fields of Field object for given key and key part.
Definition: table.cc:740
void init_tmp_table_share(THD *thd, TABLE_SHARE *share, const char *key, size_t key_length, const char *table_name, const char *path, MEM_ROOT *mem_root)
Initialize share for temporary tables.
Definition: table.cc:469
enum enum_table_category TABLE_CATEGORY
Definition: table.h:606
LEX_CSTRING INFORMATION_SCHEMA_NAME
Definition: table.cc:137
void init_mdl_requests(Table_ref *table_list)
Helper function which allows to allocate metadata lock request objects for all elements of table list...
Definition: table.cc:6591
struct Table_share_foreign_key_info TABLE_SHARE_FOREIGN_KEY_INFO
static void dbug_tmp_restore_column_maps(MY_BITMAP *read_set, MY_BITMAP *write_set, my_bitmap_map **old)
Definition: table.h:4408
void repoint_field_to_record(TABLE *table, uchar *old_rec, uchar *new_rec)
Repoint a table's fields from old_rec to new_rec.
Definition: table.cc:7359
#define PLACEHOLDER_TABLE_ROW_ESTIMATE
Definition: table.h:172
void free_blob_buffers_and_reset(TABLE *table, uint32 size)
Reclaims temporary blob storage which is bigger than a threshold.
Definition: table.cc:3478
bool unpack_partition_info(THD *thd, TABLE *outparam, TABLE_SHARE *share, handlerton *engine_type, bool is_create_table)
Unpack the partition expression.
Definition: table.cc:2744
#define STATUS_NOT_FOUND
Means we were searching for a row and didn't find it.
Definition: table.h:1435
int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias, uint db_stat, uint prgflag, uint ha_open_flags, TABLE *outparam, bool is_create_table, const dd::Table *table_def_param)
Open a table based on a TABLE_SHARE.
Definition: table.cc:2921
LEX_CSTRING PERFORMANCE_SCHEMA_DB_NAME
Definition: table.cc:140
#define STATUS_NULL_ROW
Means that table->null_row is set.
Definition: table.h:1442
ulong refresh_version
Definition: mysqld.cc:1401
static void dbug_tmp_restore_column_map(MY_BITMAP *bitmap, my_bitmap_map *old)
Definition: table.h:4383
#define restore_record(A, B)
Definition: table.h:164
int set_zone(int nr, int min_zone, int max_zone)
Definition: table.cc:3575
Ident_name_check check_db_name(const char *name, size_t length)
Check if database name is valid.
Definition: table.cc:3722
int rename_file_ext(const char *from, const char *to, const char *ext)
Definition: table.cc:3649
TABLE_SHARE * alloc_table_share(const char *db, const char *table_name, const char *key, size_t key_length, bool open_secondary)
Allocate and setup a TABLE_SHARE structure.
Definition: table.cc:378
void free_table_share(TABLE_SHARE *share)
Free table share and memory used by it.
Definition: table.cc:609
bool belongs_to_p_s(Table_ref *tl)
Check if the table belongs to the P_S, excluding setup and threads tables.
Definition: table.h:4553
bool assert_ref_count_is_locked(const TABLE_SHARE *)
Assert that the LOCK_open mutex is held when the reference count of a TABLE_SHARE is accessed.
Definition: table.cc:521
#define tmp_file_prefix_length
Definition: table.h:170
LEX_CSTRING RLI_INFO_NAME
Definition: table.cc:156
const Table_ref * jdv_root_base_table(const Table_ref *)
Returns the Table_ref of the root (outermost) base table of the JDV.
Definition: table.cc:8500
struct Table_share_foreign_key_parent_info TABLE_SHARE_FOREIGN_KEY_PARENT_INFO
File containing constants that can be used throughout the server.
constexpr const unsigned int MAX_KEY
Definition: sql_const.h:45
constexpr const size_t MAX_TABLES
Max tables in join.
Definition: sql_const.h:109
enum_mark_columns
Definition: sql_const.h:232
enum_mdl_type
Type of metadata lock request.
Definition: sql_lexer_yacc_state.h:106
@ MDL_SHARED_WRITE
Definition: sql_lexer_yacc_state.h:179
@ MDL_SHARED_WRITE_LOW_PRIO
Definition: sql_lexer_yacc_state.h:185
@ MDL_SHARED_READ
Definition: sql_lexer_yacc_state.h:169
int plan_idx
This represents the index of a JOIN_TAB/QEP_TAB in an array.
Definition: sql_opt_exec_shared.h:54
static MEM_ROOT mem
Definition: sql_servers.cc:100
case opt name
Definition: sslopt-case.h:29
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:238
This struct represents the number of bytes we expect to read for a table row.
Definition: cost_model.h:347
Definition: m_ctype.h:421
Definition: item_cmpfunc.h:2866
Struct that describes an expression selected from a derived table or view.
Definition: table.h:2664
Item * item
Points to an item that represents the expression.
Definition: table.h:2669
const char * name
Name of selected expression.
Definition: table.h:2671
The current state of the privilege checking process for the current user, SQL statement and SQL objec...
Definition: table.h:384
GRANT_INTERNAL_INFO m_internal
The grant state for internal tables.
Definition: table.h:422
GRANT_INFO()
Definition: table.cc:283
Access_bitmask privilege
The set of privileges that the current user has fulfilled for a certain host, database,...
Definition: table.h:420
GRANT_TABLE * grant_table
A copy of the privilege information regarding the current host, database, object and user.
Definition: table.h:392
uint version
Used for cache invalidation when caching privilege information.
Definition: table.h:408
State information for internal tables grants.
Definition: table.h:361
bool m_table_lookup_done
True if the internal lookup by table name was done.
Definition: table.h:367
const ACL_internal_table_access * m_table_access
Cached internal table access.
Definition: table.h:369
bool m_schema_lookup_done
True if the internal lookup by schema name was done.
Definition: table.h:363
const ACL_internal_schema_access * m_schema_access
Cached internal schema access.
Definition: table.h:365
Struct to hold information about the table that should be created.
Definition: handler.h:3355
Hook class which via its methods specifies which members of T should be used for participating in a i...
Definition: sql_plist.h:198
Definition of name for generated keys, owned by TABLE_SHARE.
Definition: table.h:722
char name[NAME_CHAR_LEN]
Definition: table.h:723
Definition: table.h:2781
bool use_default_password_lifetime
Definition: table.h:2784
bool update_password_expired_column
Definition: table.h:2783
bool update_failed_login_attempts
Definition: table.h:2795
uint32 password_reuse_interval
Definition: table.h:2791
bool use_default_password_reuse_interval
Definition: table.h:2792
Lex_acl_attrib_udyn update_password_require_current
Definition: table.h:2799
uint failed_login_attempts
Definition: table.h:2794
bool update_password_reuse_interval
Definition: table.h:2793
bool update_password_history
Definition: table.h:2790
int password_lock_time
Definition: table.h:2796
bool update_account_locked_column
Definition: table.h:2786
bool update_password_expired_fields
Definition: table.h:2782
bool use_default_password_history
Definition: table.h:2789
bool update_password_lock_time
Definition: table.h:2797
bool account_locked
Definition: table.h:2787
void cleanup()
Definition: table.h:2800
uint16 expire_after_days
Definition: table.h:2785
uint32 password_history_length
Definition: table.h:2788
Definition: table.h:2716
bool modify_factor
Definition: table.h:2738
LEX_CSTRING generated_password
Definition: table.h:2719
LEX_CSTRING auth
Definition: table.h:2718
bool uses_identified_with_clause
Definition: table.h:2731
bool uses_authentication_string_clause
Definition: table.h:2730
bool finish_registration
Definition: table.h:2751
LEX_CSTRING plugin
Definition: table.h:2717
LEX_CSTRING client_plugin
Definition: table.h:2721
void copy(LEX_MFA *m, MEM_ROOT *alloc)
Definition: table.cc:7756
bool uses_identified_by_clause
Definition: table.h:2729
bool drop_factor
Definition: table.h:2740
bool init_registration
Definition: table.h:2749
uint nth_factor
Definition: table.h:2722
bool requires_registration
Definition: table.h:2745
LEX_CSTRING challenge_response
Definition: table.h:2720
bool add_factor
Definition: table.h:2736
bool has_password_generator
Definition: table.h:2732
LEX_MFA()
Definition: table.h:2753
bool unregister
Definition: table.h:2747
void reset()
Definition: table.h:2754
bool passwordless
Definition: table.h:2734
Definition: table.h:2825
bool retain_current_password
Definition: table.h:2830
LEX_ALTER alter_status
Definition: table.h:2832
List< LEX_MFA > mfa_list
Definition: table.h:2835
bool uses_replace_clause
Definition: table.h:2829
LEX_CSTRING host
Definition: table.h:2827
static LEX_USER * alloc(THD *thd)
Definition: table.cc:7792
void init()
Definition: table.h:2838
LEX_CSTRING current_auth
Definition: table.h:2828
bool with_initial_auth
Definition: table.h:2836
LEX_CSTRING user
Definition: table.h:2826
LEX_MFA first_factor_auth_info
Definition: table.h:2834
LEX_USER()
Definition: table.h:2865
bool discard_old_password
Definition: table.h:2831
bool add_mfa_identifications(LEX_MFA *factor2, LEX_MFA *factor3=nullptr)
Definition: table.cc:7799
The LEX object currently serves three different purposes:
Definition: sql_lex.h:4002
Definition: thr_lock.h:99
thr_lock_type type
Definition: thr_lock.h:100
@ TABLE
Definition: mdl.h:407
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
void ClearForReuse()
Similar to Clear(), but anticipates that the block will be reused for further allocations.
Definition: my_alloc.cc:190
Definition: mysql_lex_string.h:40
const char * str
Definition: mysql_lex_string.h:41
size_t length
Definition: mysql_lex_string.h:42
Definition: mysql_lex_string.h:35
Definition: my_bitmap.h:43
my_bitmap_map * bitmap
Definition: my_bitmap.h:44
Struct NESTED_JOIN is used to represent how tables are connected through outer join operations and se...
Definition: nested_join.h:78
Instances of Name_resolution_context store the information necessary for name resolution of Items and...
Definition: item.h:414
Definition: table.h:4352
uint32 locked
Definition: table.h:4355
char * table
Definition: table.h:4354
OPEN_TABLE_LIST * next
Definition: table.h:4353
uint32 in_use
Definition: table.h:4355
char * db
Definition: table.h:4354
Definition: table.h:298
const char * used_alias
Tells whether this ORDER element was referenced with an alias or with an expression in the query,...
Definition: table.h:339
char * buff
Definition: table.h:350
bool is_item_original() const
Definition: table.h:303
Item_rollup_group_item * rollup_item
Definition: table.h:328
bool in_field_list
Definition: table.h:332
Item * item_initial
The initial ordering expression.
Definition: table.h:318
ORDER * next
Definition: table.h:305
MY_BITMAP * grouping_set_info
If the query block includes non-primitive grouping, then these modifiers are represented as grouping ...
Definition: table.h:313
enum_order direction
Definition: table.h:330
Item ** item
Points at the item in the select fields.
Definition: table.h:326
ORDER()
Definition: table.h:299
table_map depend_map
Definition: table.h:351
Field * field_in_tmp_table
When GROUP BY is implemented with a temporary table (i.e.
Definition: table.h:349
table_map used
Definition: table.h:351
ORDER(Item *grouped_expr)
Definition: table.h:300
bool is_explicit
Definition: table.h:352
A struct that contains execution time state used for partial update of JSON columns.
Definition: table.cc:7872
Definition: table.h:2585
int value
Definition: table.h:2603
const char * field_name
This is used as column name.
Definition: table.h:2589
enum_field_types field_type
This denotes data type for the column.
Definition: table.h:2602
const char * old_name
Definition: table.h:2613
uint open_method
Definition: table.h:2614
uint field_flags
This is used to set column attributes.
Definition: table.h:2612
uint field_length
For string-type columns, this is the maximum number of characters.
Definition: table.h:2596
Definition: table.h:2617
int(* process_table)(THD *thd, Table_ref *tables, TABLE *table, bool res, LEX_CSTRING db_name, LEX_CSTRING table_name)
Definition: table.h:2624
int(* fill_table)(THD *thd, Table_ref *tables, Item *cond)
Definition: table.h:2621
ST_FIELD_INFO * fields_info
Definition: table.h:2619
int(* old_format)(THD *thd, ST_SCHEMA_TABLE *schema_table)
Definition: table.h:2623
bool hidden
Definition: table.h:2626
const char * table_name
Definition: table.h:2618
Definition: table.h:616
const TABLE_FIELD_TYPE * field
Definition: table.h:618
uint count
Definition: table.h:617
Definition: table.h:610
LEX_CSTRING cset
Definition: table.h:613
LEX_CSTRING name
Definition: table.h:611
LEX_CSTRING type
Definition: table.h:612
This structure is shared between different table objects.
Definition: table.h:731
ulong stored_rec_length
Definition: table.h:832
uint next_number_index
Definition: table.h:950
Key_map keys_in_use
The set of indexes that are not disabled for this table.
Definition: table.h:823
TABLE_SHARE_FOREIGN_KEY_PARENT_INFO * foreign_key_parent
Definition: table.h:1073
bool visit_subgraph(Wait_for_flush *waiting_ticket, MDL_wait_for_graph_visitor *gvisitor)
Traverse portion of wait-for graph which is reachable through this table share in search for deadlock...
Definition: table.cc:4011
Table_cache_element ** cache_element
Array of table_cache_instances pointers to elements of table caches respresenting this table in each ...
Definition: table.h:776
MEM_ROOT mem_root
Definition: table.h:757
bool is_primary_engine() const
Does this TABLE_SHARE represent a table in a primary storage engine?
Definition: table.h:1295
void destroy()
Release resources and free memory occupied by the table share.
Definition: table.cc:543
TABLE_SHARE_FOREIGN_KEY_INFO * foreign_key
Definition: table.h:1071
bool is_secondary_engine() const
Does this TABLE_SHARE represent a table in a secondary storage engine?
Definition: table.h:1298
uint stats_sample_pages
Definition: table.h:869
bool is_mv_se_materialized
Materialized view, materialized directly by a storage engine.
Definition: table.h:966
handlerton * db_type() const
Definition: table.h:837
Table_histograms_collection * m_histograms
Definition: table.h:752
LEX_STRING comment
Definition: table.h:785
Handler_share * ha_share
Main handler's share.
Definition: table.h:1036
MEM_ROOT * alloc_for_tmp_file_handler
Used to allocate new handler for internal temporary table when the size limitation of the primary sto...
Definition: table.h:762
enum_stats_auto_recalc stats_auto_recalc
Definition: table.h:872
const char * tablespace
Definition: table.h:986
partition_info * m_part_info
Partition meta data.
Definition: table.h:1006
LEX_STRING compress
Definition: table.h:786
const TABLE_FIELD_DEF * table_field_def_cache
Cache the checked structure of this table.
Definition: table.h:1033
uint column_bitmap_size
Definition: table.h:954
ulong mysql_version
Definition: table.h:830
uint max_tmp_key_parts
For materialized derived tables: allocated size of base_key_parts array of all TABLE objects.
Definition: table.h:910
uint total_key_length
Definition: table.h:884
bool has_masking_policy_columns() const
Definition: table.h:1243
TYPELIB keynames
Definition: table.h:764
uchar * default_values
Definition: table.h:784
LEX_STRING encrypt_type
Definition: table.h:787
PSI_table_share * m_psi
Instrumentation for this table share.
Definition: table.h:1039
bool is_missing_primary_key() const
Determine if the table is missing a PRIMARY KEY.
Definition: table.h:1238
bool db_low_byte_first
Definition: table.h:962
Schema_read_only
Schema's read only mode - ON (true) or OFF (false).
Definition: table.h:1097
LEX_CSTRING table_cache_key
Definition: table.h:808
unsigned int m_ref_count
How many TABLE objects use this TABLE_SHARE.
Definition: table.h:1313
unsigned long version() const
Returns the version of this TABLE_SHARE.
Definition: table.h:1148
uint max_unique_length
Definition: table.h:883
tmp_table_type tmp_table
Definition: table.h:851
unsigned long m_version
TABLE_SHARE version, if changed the TABLE_SHARE must be reopened.
Definition: table.h:1320
uint find_first_unused_tmp_key(const Key_map &k)
For a materialized derived table: informs the share that certain not-yet-used keys are going to be us...
Definition: table.cc:6135
int cached_row_logging_check
Definition: table.h:976
ulong reclength
Definition: table.h:831
uint varchar_fields
Definition: table.h:896
uint next_number_keypart
Definition: table.h:952
bool secondary_load
Secondary engine load status.
Definition: table.h:792
uint tmp_handler_count
Only for internal temporary tables.
Definition: table.h:858
Field ** field
Definition: table.h:779
ulong avg_row_length
Definition: table.h:829
plugin_ref db_plugin
Definition: table.h:836
LEX_CSTRING table_name
Definition: table.h:810
const dd::View * view_object
View object holding view definition read from DD.
Definition: table.h:1051
uint db_create_options
Bitmap with flags representing some of table options/attributes.
Definition: table.h:936
uint rec_buff_length
Definition: table.h:877
uint blob_fields
Definition: table.h:895
uint max_tmp_keys
For materialized derived tables: allocated size of key_info array.
Definition: table.h:905
LEX_STRING connect_string
Definition: table.h:813
Field ** found_next_number_field
Definition: table.h:780
ha_rows min_rows
Definition: table.h:828
bool is_referenced_by_foreign_key() const
Returns whether this table is referenced by a foreign key.
Definition: table.h:1309
uint foreign_keys
Arrays with descriptions of foreign keys in which this table participates as child or parent.
Definition: table.h:1070
Schema_read_only schema_read_only
Definition: table.h:1098
bool wait_for_old_version(THD *thd, struct timespec *abstime, uint deadlock_weight)
Wait until the subject share is removed from the table definition cache and make sure it's destroyed.
Definition: table.cc:4105
uint fields
Definition: table.h:876
uint tmp_open_count
Only for internal temporary tables.
Definition: table.h:864
Key_name * key_names
Array of names for generated keys, used for materialized derived tables.
Definition: table.h:915
Key_map keys_for_keyread
Definition: table.h:827
char * partition_info_str
Storing the full partitioning clause (PARTITION BY ...) which is used when creating new partition_inf...
Definition: table.h:1020
TABLE_SHARE(unsigned long version, bool secondary)
Create a new TABLE_SHARE with the given version number.
Definition: table.h:740
uint null_bytes
Definition: table.h:875
bool system
Definition: table.h:961
bool is_view
Definition: table.h:964
ulonglong get_table_ref_version() const
Return a table metadata version.
Definition: table.cc:4178
uint rowid_field_offset
Definition: table.h:946
uint max_key_length
Definition: table.h:882
ulong * base_rec_per_key
Records per key array, used for materialized derived tables.
Definition: table.h:921
bool has_secondary_engine() const
Does this TABLE_SHARE represent a primary table that has a shadow copy in a secondary storage engine?
Definition: table.h:1304
List< Trigger > * triggers
List of trigger descriptions for the table loaded from the data-dictionary.
Definition: table.h:1087
bool is_distinct
Whether this is a temporary table that already has a UNIQUE index (removing duplicate rows on insert)...
Definition: table.h:892
dd::Table * tmp_table_def
Data-dictionary object describing explicit temporary table represented by this share.
Definition: table.h:1059
TABLE_SHARE * next
Definition: table.h:767
LEX_STRING path
Definition: table.h:811
bool m_open_in_progress
Definition: table.h:967
uint next_number_key_offset
Definition: table.h:951
uint keys
Definition: table.h:878
Key_map visible_indexes
The set of visible and enabled indexes for this table.
Definition: table.h:826
uint foreign_key_parents
Definition: table.h:1072
uint masking_policy_field_count
Number of fields having a masking policy.
Definition: table.h:960
bool has_old_version() const
Is this table share being expelled from the table definition cache?
Definition: table.h:1158
mysql_mutex_t LOCK_ha_data
Definition: table.h:766
Wait_for_flush_list m_flush_tickets
List of tickets representing threads waiting for the share to be flushed.
Definition: table.h:1044
void clear_version()
Set the version of this TABLE_SHARE to zero.
Definition: table.cc:532
uint gen_def_field_count
Number of fields having the default value generated.
Definition: table.h:958
MY_BITMAP all_set
Definition: table.h:797
unsigned int ref_count() const
How many TABLE objects use this TABLE_SHARE.
Definition: table.h:1268
uint last_null_bit_pos
Definition: table.h:875
TABLE_CATEGORY table_category
Category of this table.
Definition: table.h:755
bool error
Definition: table.h:953
unsigned int decrement_ref_count()
Decrement the reference count by one.
Definition: table.h:1287
const CHARSET_INFO * table_charset
Definition: table.h:794
unsigned int increment_ref_count()
Increment the reference count by one.
Definition: table.h:1277
mysql::binlog::event::Table_id table_map_id
Definition: table.h:968
bool auto_partitioned
Filled in when reading from frm.
Definition: table.h:1013
void set_table_cache_key(char *key_buff, const char *key, size_t key_length)
Set share's table cache key and update its db and table name appropriately.
Definition: table.h:1140
void set_table_cache_key(char *key_buff, size_t key_length)
Set share's table cache key and update its db and table name appropriately.
Definition: table.h:1114
ulonglong autoextend_size
Definition: table.h:834
uint primary_key
Definition: table.h:949
ha_storage_media default_storage_media
Definition: table.h:983
rec_per_key_t * base_rec_per_key_float
Records per key array, float rep., used for materialized derived tables.
Definition: table.h:927
bool m_secondary_engine
Does this TABLE_SHARE represent a table in a secondary storage engine?
Definition: table.h:1324
std::uint32_t key_block_size
Definition: table.h:868
bool crashed
Definition: table.h:963
Key_map usable_indexes(const THD *thd) const
The set of indexes that the optimizer may use when creating an execution plan.
Definition: table.cc:506
LEX_CSTRING normalized_path
Definition: table.h:812
uint key_parts
Definition: table.h:879
uint vfields
Number of generated fields.
Definition: table.h:956
enum enum_table_ref_type get_table_ref_type() const
Convert unrelated members of TABLE_SHARE to one enum representing its type.
Definition: table.h:1166
uint db_options_in_use
Bitmap with flags representing some of table options/attributes which are in use by storage engine.
Definition: table.h:945
ha_rows max_rows
Definition: table.h:828
ulonglong get_table_def_version() const
Definition: table.h:1145
TYPELIB * intervals
Definition: table.h:765
uint first_unused_tmp_key
For materialized derived tables;.
Definition: table.h:901
TABLE_SHARE ** prev
Definition: table.h:767
uint null_fields
Definition: table.h:894
LEX_CSTRING secondary_engine
Secondary storage engine.
Definition: table.h:790
KEY * key_info
Definition: table.h:781
uint partition_info_str_len
Definition: table.h:1021
LEX_CSTRING db
Definition: table.h:809
LEX_CSTRING engine_attribute
Definition: table.h:815
LEX_CSTRING secondary_engine_attribute
Definition: table.h:816
uint * blob_field
Definition: table.h:782
enum row_type real_row_type
Real row format used for the table by the storage engine.
Definition: table.h:850
TABLE_SHARE()=default
Sql_check_constraint_share_list * check_constraint_share_list
Definition: table.h:1076
Query_block * owner_of_possible_tmp_keys
For materialized derived tables;.
Definition: table.h:1062
Definition: table.h:1456
void mark_columns_used_by_index(uint index)
Definition: table.cc:5589
bool materialized
For a materializable derived or SJ table: true if has been materialized.
Definition: table.h:1959
void mark_generated_columns(bool is_update)
Update the write/read_set for generated columns when doing update and insert operation.
Definition: table.cc:6321
class QEP_TAB * qep_tab
Definition: table.h:1963
bool m_invalid_dict
This TABLE object is invalid and cannot be reused.
Definition: table.h:1939
query_id_t query_id
Definition: table.h:1811
bool force_index_order
Flag set when the statement contains FORCE INDEX FOR ORDER BY See Table_ref::process_index_hints().
Definition: table.h:1873
void column_bitmaps_set_no_signal(MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg)
Definition: table.h:2042
void mark_columns_needed_for_update(THD *thd, bool mark_binlog_columns)
Mark columns needed for doing an update of a row.
Definition: table.cc:5757
const char * alias
alias or table name
Definition: table.h:1708
partition_info * part_info
Definition: table.h:1998
uint8 m_status
Definition: table.h:1851
bool key_read
If set, the optimizer has found that row retrieval should access index tree only.
Definition: table.h:1888
bool no_replicate
If set, indicate that the table is not replicated by the server.
Definition: table.h:1897
class JOIN_TAB * join_tab
Definition: table.h:1962
void set_no_row()
Set status for row buffer: contains no row.
Definition: table.h:2175
const BytesPerTableRow * m_bytes_per_row
Estimate for the amount of data to read per row fetched from this table.
Definition: table.h:2009
const char * open_for_fk_name
Definition: table.h:1711
void mark_columns_needed_for_insert(THD *thd)
Definition: table.cc:6265
Field ** vfield
Pointer to generated columns.
Definition: table.h:1577
void clear_column_bitmaps(void)
Definition: table.cc:5489
uint tmp_table_seq_id
Internal tmp table sequential number.
Definition: table.h:2017
TABLE ** cache_prev
Definition: table.h:1469
Key_map covering_keys
Definition: table.h:1533
uchar * null_flags
Pointer to the null flags of record[0].
Definition: table.h:1713
Key_map keys_in_use_for_group_by
Definition: table.h:1564
Key_map keys_in_use_for_query
Definition: table.h:1562
Field_longlong * set_counter()
Definition: table.h:1695
void set_storage_handler(handler *file_arg)
Set storage handler for temporary table.
Definition: table.h:2105
bool has_null_row() const
Definition: table.h:2228
TABLE ** triggers_lru_prev
Definition: table.h:1481
Record_buffer m_record_buffer
Buffer for use in multi-row reads. Initially empty.
Definition: table.h:1521
void set_deleted()
Set the contents of table to be "deleted", ie "not created", after having deleted the contents.
Definition: table.h:2125
Set_operator_type m_set_op_type
Holds the set operation type.
Definition: table.h:1644
void set_created()
Set the table as "created", and enable flags in storage engine that could not be enabled without an i...
Definition: table.cc:6252
void use_all_columns()
Definition: table.h:2047
bool has_updated_row() const
Definition: table.h:2231
TABLE * cache_next
Links for the lists of used/unused TABLE objects for the particular table in the specific instance of...
Definition: table.h:1469
Set_operator_type set_op_type()
Returns the set operation type.
Definition: table.h:1659
void blobs_need_not_keep_old_value()
Virtual fields of type BLOB have a flag m_keep_old_value.
Definition: table.cc:8404
Table_ref * pos_in_table_list
Definition: table.h:1704
void set_set_op(Field_longlong *set_counter, bool except, bool distinct)
Initialize the set counter field pointer and the type of set operation other than UNION*.
Definition: table.h:1686
ORDER * group
Definition: table.h:1707
bool has_binary_diff_columns() const
Does this table have any columns that can be updated using partial update in the current row?
Definition: table.cc:7993
void set_use_hash_map(bool use_hash_map)
Definition: table.h:1652
void mark_columns_per_binlog_row_image(THD *thd)
Definition: table.cc:5829
ha_rows quick_condition_rows
Definition: table.h:1833
THD * in_use
The current session using this table object.
Definition: table.h:1510
void disable_logical_diffs_for_current_row(const Field *field) const
Temporarily disable collection of Json_diff objects describing the logical changes of a JSON column i...
Definition: table.cc:8228
MY_BITMAP * fields_set_during_insert
A pointer to the bitmap of table fields (columns), which are explicitly set in the INSERT INTO statem...
Definition: table.h:1791
void mark_columns_needed_for_delete(THD *thd)
Definition: table.cc:5680
ha_rows quick_rows[MAX_KEY]
Definition: table.h:1817
thr_lock_type lock_type
Definition: table.h:1964
bool null_row
Definition: table.h:1858
uint lock_data_start
Definition: table.h:1836
bool const_table
Definition: table.h:1880
MY_BITMAP read_set_internal
A bitmap of fields that are explicitly referenced by the query.
Definition: table.h:1778
bool is_marked_for_partial_update(const Field *field) const
Has this column been marked for partial update?
Definition: table.cc:7987
bool force_index_group
Flag set when the statement contains FORCE INDEX FOR GROUP BY See Table_ref::process_index_hints().
Definition: table.h:1879
bool has_storage_handler() const
Definition: table.h:2102
bool open_by_handler
Definition: table.h:1899
void bind_value_generators_to_fields()
Bind all the table's value generator columns in all the forms: stored/virtual GC, default expressions...
Definition: table.cc:4369
Table_ref * pos_in_locked_tables
Definition: table.h:1706
void disable_binary_diffs_for_current_row(const Field *field)
Temporarily disable collection of binary diffs for a column in the current row.
Definition: table.cc:7975
void set_keyread(bool flag)
Definition: table.cc:6241
bool index_contains_some_virtual_gcol(uint index_no) const
Check whether the given index has a virtual generated columns.
Definition: table.h:2089
uint db_stat
Definition: table.h:1838
bool is_logical_diff_enabled(const Field *field) const
Is partial update using logical diffs enabled on this JSON column?
Definition: table.cc:8206
bool has_invalid_dict() const
Definition: table.h:2060
bool has_invalid_stats()
Definition: table.h:2065
uchar * insert_values
Definition: table.h:1518
ptrdiff_t default_values_offset() const
Definition: table.h:2097
uchar * record[2]
Definition: table.h:1515
void invalidate_dict()
Definition: table.cc:8451
void mark_auto_increment_column(void)
Mark auto-increment fields as used fields in both read and write maps.
Definition: table.cc:5649
bool alias_name_used
Definition: table.h:1917
bool fill_item_list(mem_root_deque< Item * > *item_list) const
Create Item_field for each column in the table.
Definition: table.cc:4426
bool impossible_range
Definition: table.h:1970
bool is_binary_diff_enabled(const Field *field) const
Is partial update using binary diffs enabled on this JSON column?
Definition: table.cc:8200
void invalidate_stats()
Definition: table.cc:8462
Cost_model_table m_cost_model
Cost model object for operations on this table.
Definition: table.h:2005
bool should_binlog_drop_if_temp_flag
This flag decides whether or not we should log the drop temporary table command.
Definition: table.h:2345
void cleanup_value_generator_items()
Clean any state in items associated with generated columns to be ready for the next statement.
Definition: table.cc:4395
bool m_deduplicate_with_hash_map
If false, any de-duplication happens via an index on this table (e.g.
Definition: table.h:1626
Field_longlong * m_set_counter
The set counter.
Definition: table.h:1613
void init_cost_model(const Cost_model_server *cost_model_server)
Initialize the optimizer cost model.
Definition: table.h:2262
bool not_exists_optimize
Definition: table.h:1965
bool force_index
Definition: table.h:1867
void init(THD *thd, Table_ref *tl)
Initialize TABLE instance (newly created, or coming either from table cache or THD::temporary_tables ...
Definition: table.cc:4205
bool is_except() const
Definition: table.h:1672
MY_BITMAP * read_set
The read set contains the set of columns that the execution engine needs to process the query.
Definition: table.h:1760
bool should_binlog_drop_if_temp(void) const
Definition: table.cc:8419
bool get_fields_in_item_tree
Definition: table.h:1918
uint visible_field_count() const
Definition: table.h:2072
const Binary_diff_vector * get_binary_diffs(const Field *field) const
Get the list of binary diffs that have been collected for a given column in the current row,...
Definition: table.cc:8084
void mark_check_constraint_columns(bool is_update)
Update the read_map with columns needed for check constraint evaluation when doing update and insert ...
Definition: table.cc:6381
int current_lock
Definition: table.h:1839
void move_tmp_key(int old_idx, bool modify_share)
For a materialized derived table: moves a KEY definition from a position to the first not-yet-used po...
Definition: table.cc:6158
uint quick_n_ranges[MAX_KEY]
Definition: table.h:1823
TABLE * next
Definition: table.h:1459
bool add_binary_diff(const Field *field, size_t offset, size_t length)
Add a binary diff for a column that is updated using partial update.
Definition: table.cc:8089
bool m_invalid_stats
This TABLE object is invalid and cannot be reused as it has outdated rec_per_key and handler stats.
Definition: table.h:1948
bool empty_result_table()
Empties internal temporary table (deletes rows, closes scan)
Definition: table.cc:8423
void cleanup_partial_update()
Clean up state used for partial update of JSON columns.
Definition: table.cc:8054
uint lock_position
Definition: table.h:1835
Key_map quick_keys
Definition: table.h:1534
struct TABLE::@193 reginfo
void restore_null_flags()
Restore the NULL flags of the current row from the designated buffer.
Definition: table.h:2248
Table_trigger_dispatcher * triggers
Definition: table.h:1703
bool no_keyread
Certain statements which need the full row, set this to ban index-only access.
Definition: table.h:1893
bool is_intersect() const
Definition: table.h:1667
void set_tmp_table_seq_id(uint arg)
Definition: table.h:2299
Partial_update_info * m_partial_update_info
Object which contains execution time state used for partial update of JSON columns.
Definition: table.h:2339
void set_binlog_drop_if_temp(bool should_binlog)
Set the variable should_binlog_drop_if_temp_flag, so that the logging of temporary tables can be deci...
Definition: table.cc:8415
void mark_gcol_in_maps(const Field *field)
Adds a generated column and its dependencies to the read_set/write_set bitmaps.
Definition: table.cc:7521
void set_deleted_row()
Set "deleted" property for the current row.
Definition: table.h:2219
void reset_null_row()
Clear "null row" status for the current row.
Definition: table.h:2207
Field ** gen_def_fields_ptr
Pointer to fields having the default value generated.
Definition: table.h:1579
MY_BITMAP fields_for_functional_indexes
A bitmap marking the hidden generated columns that exists for functional indexes.
Definition: table.h:1498
void set_not_started()
Life cycle of the row buffer is as follows:
Definition: table.h:2155
const histograms::Histogram * find_histogram(uint field_index) const
Find the histogram for the given field index.
Definition: table.cc:8240
SortingIterator * sorting_iterator
Not owned by the TABLE; used only from filesort_free_buffers().
Definition: table.h:1990
bool m_last_operation_is_distinct
If m_set_counter is set: true if last block has DISTINCT semantics, either because it is marked as su...
Definition: table.h:1620
key_part_map const_key_parts[MAX_KEY]
Definition: table.h:1820
Field ** field
Definition: table.h:1511
bool alloc_tmp_keys(uint new_key_count, uint new_key_part_count, bool modify_share)
Allocate space for keys, for a materialized derived table.
Definition: table.cc:5911
MEM_ROOT mem_root
Definition: table.h:1978
void column_bitmaps_set(MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg)
Definition: table.cc:7551
bool uses_hash_map() const
Definition: table.h:1656
uint hidden_field_count
Count of hidden fields, if internal temporary table; 0 otherwise.
Definition: table.h:1513
bool is_nullable() const
Return whether table is nullable.
Definition: table.h:2130
MY_BITMAP tmp_set
Definition: table.h:1718
MDL_ticket * mdl_ticket
Definition: table.h:2001
bool has_gcol() const
Definition: table.h:2133
bool all_partitions_pruned_away
Definition: table.h:2000
MY_BITMAP def_read_set
Definition: table.h:1718
String * get_partial_update_buffer()
Get a buffer that can be used to hold the partially updated column value while performing partial upd...
Definition: table.cc:8060
bool setup_partial_update()
Definition: table.cc:8025
bool m_charset_conversion_is_strict
True if character set conversions are always strict.
Definition: table.h:1630
bool has_deleted_row() const
Definition: table.h:2234
bool check_read_removal(uint index)
Read removal is possible if the selected quick read method is using full unique index.
Definition: table.cc:7313
const Json_diff_vector * get_logical_diffs(const Field_json *field) const
Get the list of JSON diffs that have been collected for a given column in the current row,...
Definition: table.cc:8194
void set_bytes_per_row(const BytesPerTableRow *bytes_per_row)
Set the estimate for the number of bytes to read per row in this table.
Definition: table.h:2272
KEY_PART_INFO * base_key_parts
Key part array for generated keys, used for materialized derived tables.
Definition: table.h:1572
bool is_started() const
Definition: table.h:2161
Set_operator_type
Definition: table.h:1632
@ SOT_EXCEPT_DISTINCT
Definition: table.h:1639
@ SOT_NONE
Definition: table.h:1633
@ SOT_UNION_ALL
Definition: table.h:1634
@ SOT_INTERSECT_ALL
Definition: table.h:1636
@ SOT_INTERSECT_DISTINCT
Definition: table.h:1637
@ SOT_UNION_DISTINCT
Definition: table.h:1635
@ SOT_EXCEPT_ALL
Definition: table.h:1638
MY_BITMAP cond_set
Definition: table.h:1727
void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map, uint key_parts=0) const
mark columns used by key, but don't reset other fields
Definition: table.cc:5627
void reset()
Reset state of fields after optimization and execution.
Definition: table.cc:4275
MY_BITMAP pack_row_tmp_set
Definition: table.h:1718
void default_column_bitmaps()
Definition: table.h:2050
void drop_unused_tmp_keys(bool modify_share)
For a materialized derived table: after move_tmp_key() has moved all definitions of used KEYs,...
Definition: table.cc:6215
void clear_partial_update_diffs()
Clear the diffs that have been collected for partial update of JSON columns, and re-enable partial up...
Definition: table.cc:8065
void set_null_row()
Set current row as "null row", for use in null-complemented outer join.
Definition: table.h:2200
handler * get_primary_handler() const
Returns the primary engine handler for the table.
Definition: table.cc:7558
Sql_table_check_constraint_list * table_check_constraint_list
Definition: table.h:1842
TABLE * triggers_lru_next
Links for the LRU list of unused TABLE objects with fully loaded triggers in the specific instance of...
Definition: table.h:1481
Key_map possible_quick_keys
Definition: table.h:1549
bool created
For tmp tables.
Definition: table.h:1955
bool has_row() const
Definition: table.h:2225
const Cost_model_table * cost_model() const
Return the cost model object for this table.
Definition: table.h:2269
Field * next_number_field
Definition: table.h:1574
void update_const_key_parts(Item *conds)
Update TABLE::const_key_parts for single table UPDATE/DELETE query.
Definition: table.cc:7283
void save_null_flags()
Save the NULL flags of the current row into the designated buffer.
Definition: table.h:2243
Field * found_next_number_field
Definition: table.h:1575
Key_map keys_in_use_for_order_by
Definition: table.h:1566
void set_row_status_from_handler(int status)
Set "row found" status from handler result.
Definition: table.h:2185
Field ** visible_field_ptr() const
Definition: table.h:2070
uchar * null_flags_saved
Saved null_flags while null_row is true.
Definition: table.h:1714
uchar * write_row_record
Definition: table.h:1516
ha_rows m_limit_rows
A priori unlimited.
Definition: table.h:1605
MY_BITMAP def_write_set
Definition: table.h:1718
bool is_union_or_table() const
Test if this tmp table stores the result of a UNION set operation or a single table.
Definition: table.h:1650
uint lock_count
Definition: table.h:1837
Field * hash_field
Field used by unique constraint.
Definition: table.h:1581
MY_BITMAP def_fields_set_during_insert
Bitmap of table fields (columns), which are explicitly set in the INSERT INTO statement.
Definition: table.h:1736
bool mark_column_for_partial_update(const Field *field)
Mark a given column as one that can potentially be updated using partial update during execution of a...
Definition: table.cc:7960
Field * fts_doc_id_field
Definition: table.h:1700
bool autoinc_field_has_explicit_non_null_value
To indicate that value of the auto_increment field was provided explicitly by the user or from some o...
Definition: table.h:1916
KEY * key_info
Definition: table.h:1567
bool init_tmp_table(THD *thd, TABLE_SHARE *share, MEM_ROOT *m_root, CHARSET_INFO *charset, const char *alias, Field **fld, uint *blob_fld, bool is_virtual)
Initialize table as internal tmp table.
Definition: table.cc:4319
void set_found_row()
Set status for row buffer: contains row.
Definition: table.h:2164
void mark_column_used(Field *field, enum enum_mark_columns mark)
Mark column as either read or written (or none) according to mark_used.
Definition: table.cc:5546
const BytesPerTableRow * bytes_per_row() const
Get the estimate for the number of bytes to read per row in this table.
Definition: table.h:2277
void set_nullable()
Set table as nullable, ie it is inner wrt some outer join.
Definition: table.h:2127
Blob_mem_storage * blob_storage
Initialized in Item_func_group_concat::setup for appropriate temporary table if GROUP_CONCAT is used ...
Definition: table.h:1984
void set_updated_row()
Set "updated" property for the current row.
Definition: table.h:2213
TABLE * prev
Definition: table.h:1459
void prepare_for_position(void)
Tell handler we are going to call position() and rnd_pos() later.
Definition: table.cc:5521
TABLE_SHARE * s
Definition: table.h:1457
bool has_columns_marked_for_partial_update() const
Does this table have any columns that were marked with mark_column_for_partial_update()?
Definition: table.cc:8045
MY_BITMAP * m_partial_update_columns
Bitmap that tells which columns are eligible for partial update in an update statement.
Definition: table.h:2330
bool copy_blobs
Definition: table.h:1860
void add_logical_diff(const Field_json *field, const Json_seekable_path &path, enum_json_diff_operation operation, const Json_wrapper *new_value)
Add a logical JSON diff describing a logical change to a JSON column in partial update.
Definition: table.cc:8164
bool is_distinct() const
Definition: table.h:1677
bool add_tmp_key(Field_map *key_parts, bool invisible, bool modify_share)
Add one key to a materialized derived table.
Definition: table.cc:6026
SortingIterator * duplicate_removal_iterator
Definition: table.h:1991
void update_covering_prefix_keys(Field *field, uint16 key_read_length, Key_map *covering_prefix_keys)
Update covering keys depending on max read key length.
Definition: table.cc:8435
bool nullable
If true, this table is inner w.r.t.
Definition: table.h:1849
Key_map merge_keys
Definition: table.h:1537
Sort_result unique_result
The result of applying a unique operation (by row ID) to the table, if done.
Definition: table.h:1997
bool is_created() const
Return true if table is instantiated, and false otherwise.
Definition: table.h:2114
uint quick_key_parts[MAX_KEY]
Definition: table.h:1822
MY_BITMAP * write_set
Definition: table.h:1762
bool no_rows
True if writes to this table should not write rows and just write keys.
Definition: table.h:1882
Definition: typelib.h:35
Definition: table.h:682
LEX_CSTRING fk_name
Definition: table.h:683
LEX_CSTRING * referenced_column_names
Array with names of referenced columns of the FK.
Definition: table.h:702
LEX_CSTRING referenced_table_db
Definition: table.h:684
dd::Foreign_key::enum_rule delete_rule
Definition: table.h:691
LEX_CSTRING * referencing_column_names
Array with names of referencing columns of the FK.
Definition: table.h:697
LEX_CSTRING unique_constraint_name
Name of unique key matching FK in parent table, "" if there is no unique key.
Definition: table.h:690
uint columns
Definition: table.h:692
dd::Foreign_key::enum_rule update_rule
Definition: table.h:691
LEX_CSTRING referenced_table_name
Definition: table.h:685
dd::Foreign_key::enum_rule delete_rule
Definition: table.h:716
LEX_CSTRING fk_name
Since referenced_column_names and referencing_column_names are already stored in TABLE_SHARE_FOREIGN_...
Definition: table.h:712
dd::Foreign_key::enum_rule update_rule
Definition: table.h:716
LEX_CSTRING referencing_table_name
Definition: table.h:714
LEX_CSTRING referencing_table_db
Definition: table.h:713
handlerton is a singleton structure - one instance per storage engine - to provide access to storage ...
Definition: handler.h:2851
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:50
Definition: sql_plugin_ref.h:45
Contains the class Table_id, mainly used for row based replication.
tablesample_type
Definition: tablesample.h:27
thr_lock_type
Definition: thr_lock.h:51
@ TL_WRITE_LOW_PRIORITY
Definition: thr_lock.h:90
@ TL_UNLOCK
Definition: thr_lock.h:53
@ TL_READ
Definition: thr_lock.h:62
@ TL_WRITE_ALLOW_WRITE
Definition: thr_lock.h:73
static void mark()
Definition: xcom_transport.cc:698