MySQL 9.5.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, 2025, 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
685 /**
686 Name of unique key matching FK in parent table, "" if there is no
687 unique key.
688 */
692 /**
693 Arrays with names of referencing columns of the FK.
694 */
697
703
704/**
705 Definition of name for generated keys, owned by TABLE_SHARE
706*/
707struct Key_name {
709};
710
711/**
712 This structure is shared between different table objects. There is one
713 instance of table share per one table in the database.
714*/
715
717 TABLE_SHARE() = default;
718
719 /**
720 Create a new TABLE_SHARE with the given version number.
721 @param version the version of the TABLE_SHARE
722 @param secondary set to true if the TABLE_SHARE represents a table
723 in a secondary storage engine
724 */
725 TABLE_SHARE(unsigned long version, bool secondary)
726 : m_version(version), m_secondary_engine(secondary) {}
727
728 /*
729 Managed collection of refererence-counted snapshots of histograms statistics
730 for the table. TABLE objects acquire/release pointers to histogram
731 statistics from this collection. A new statistics snapshot is inserted when
732 the share is initialized and when histograms are updated/dropped.
733
734 For temporary tables m_histograms should be nullptr since we do not support
735 histograms on temporary tables.
736 */
738
739 /** Category of this table. */
741
743 /**
744 Used to allocate new handler for internal temporary table when the
745 size limitation of the primary storage engine is exceeded.
746 */
748
749 TYPELIB keynames; /* Pointers to keynames */
750 TYPELIB *intervals{nullptr}; /* pointer to interval info */
751 mysql_mutex_t LOCK_ha_data; /* To protect access to ha_data */
752 TABLE_SHARE *next{nullptr}, **prev{nullptr}; /* Link to unused shares */
753 /**
754 Array of table_cache_instances pointers to elements of table caches
755 respresenting this table in each of Table_cache instances.
756 Allocated along with the share itself in alloc_table_share().
757 Each element of the array is protected by Table_cache::m_lock in the
758 corresponding Table_cache. False sharing should not be a problem in
759 this case as elements of this array are supposed to be updated rarely.
760 */
762
763 /* The following is copied to each TABLE on OPEN */
764 Field **field{nullptr};
766 KEY *key_info{nullptr}; /* data of keys defined for the table */
767 uint *blob_field{nullptr}; /* Index to blobs in Field array */
768
769 uchar *default_values{nullptr}; /* row with default values */
770 LEX_STRING comment{nullptr, 0}; /* Comment about table */
771 LEX_STRING compress{nullptr, 0}; /* Compression algorithm */
772 LEX_STRING encrypt_type{nullptr, 0}; /* encryption algorithm */
773
774 /** Secondary storage engine. */
776 /** Secondary engine load status */
777 bool secondary_load{false};
778
780 nullptr}; /* Default charset of string fields */
781
783 /*
784 Key which is used for looking-up table in table cache and in the list
785 of thread's temporary tables. Has the form of:
786 "database_name\0table_name\0" + optional part for temporary tables.
787
788 Note that all three 'table_cache_key', 'db' and 'table_name' members
789 must be set (and be non-zero) for tables in table cache. They also
790 should correspond to each other.
791 To ensure this one can use set_table_cache() methods.
792 */
794 LEX_CSTRING db{nullptr, 0}; /* Pointer to db */
795 LEX_CSTRING table_name{nullptr, 0}; /* Table name (for open) */
796 LEX_STRING path{nullptr, 0}; /* Path to .frm file (from datadir) */
797 LEX_CSTRING normalized_path{nullptr, 0}; /* unpack_filename(path) */
799
802
803 /**
804 The set of indexes that are not disabled for this table. I.e. it excludes
805 indexes disabled by `ALTER TABLE ... DISABLE KEYS`, however it does
806 include invisible indexes. The data dictionary populates this bitmap.
807 */
809
810 /// The set of visible and enabled indexes for this table.
813 ha_rows min_rows{0}, max_rows{0}; /* create information */
814 ulong avg_row_length{0}; /* create information */
815 ulong mysql_version{0}; /* 0 if .frm is created before 5.0 */
816 ulong reclength{0}; /* Recordlength */
817 ulong stored_rec_length{0}; /* Stored record length
818 (no generated-only generated fields) */
820
821 plugin_ref db_plugin{nullptr}; /* storage engine plugin */
822 inline handlerton *db_type() const /* table_type for handler */
823 {
824 // assert(db_plugin);
825 return db_plugin ? plugin_data<handlerton *>(db_plugin) : nullptr;
826 }
827 /**
828 Value of ROW_FORMAT option for the table as provided by user.
829 Can be different from the real row format used by the storage
830 engine. ROW_TYPE_DEFAULT value indicates that no explicit
831 ROW_FORMAT was specified for the table. @sa real_row_type.
832 */
833 enum row_type row_type = {}; // Zero-initialized to ROW_TYPE_DEFAULT
834 /** Real row format used for the table by the storage engine. */
835 enum row_type real_row_type = {}; // Zero-initialized to ROW_TYPE_DEFAULT
837
838 /**
839 Only for internal temporary tables.
840 Count of TABLEs (having this TABLE_SHARE) which have a "handler"
841 (table->file!=nullptr) which is open (ha_open() has been called).
842 */
844
845 /**
846 Only for internal temporary tables.
847 Count of TABLEs (having this TABLE_SHARE) which have opened this table.
848 */
850
851 // Can only be 1,2,4,8 or 16, but use uint32_t since that how it is
852 // represented in InnoDB
853 std::uint32_t key_block_size{0}; /* create key_block_size, if used */
854 uint stats_sample_pages{0}; /* number of pages to sample during
855 stats estimation, if used, otherwise 0. */
857 stats_auto_recalc{}; /* Automatic recalc of stats.
858 Zero-initialized to HA_STATS_AUTO_RECALC_DEFAULT
859 */
861 uint fields{0}; /* Number of fields */
862 uint rec_buff_length{0}; /* Size of table->record[] buffer */
863 uint keys{0}; /* Number of keys defined for the table*/
864 uint key_parts{0}; /* Number of key parts of all keys
865 defined for the table
866 */
867 uint max_key_length{0}; /* Length of the longest key */
868 uint max_unique_length{0}; /* Length of the longest unique key */
870 /**
871 Whether this is a temporary table that already has a UNIQUE index (removing
872 duplicate rows on insert), so that the optimizer does not need to run
873 DISTINCT itself. Also used for INTERSECT and EXCEPT as a fall-back if
874 hashing fails (secondary overflow of in-memory hash table, in which case
875 we revert to de-duplication using the unique key in the output table).
876 */
877 bool is_distinct{false};
878
879 uint null_fields{0}; /* number of null fields */
880 uint blob_fields{0}; /* number of blob fields */
881 uint varchar_fields{0}; /* number of varchar fields */
882 /**
883 For materialized derived tables; @see add_derived_key().
884 'first' means: having the lowest position in key_info.
885 */
887 /**
888 For materialized derived tables: allocated size of key_info array.
889 */
891 /**
892 For materialized derived tables: allocated size of base_key_parts array of
893 all TABLE objects. Used for generated keys.
894 */
896 /**
897 Array of names for generated keys, used for materialized derived tables.
898 Shared among all TABLE objects referring to this table share.
899 */
901 /**
902 Records per key array, used for materialized derived tables.
903 This is a contiguous array, with size given by max_tmp_key_parts.
904 The array is shared with all TABLE objects referring to this table share.
905 */
906 ulong *base_rec_per_key{nullptr};
907 /**
908 Records per key array, float rep., used for materialized derived tables.
909 This is a contiguous array, with size given by max_tmp_key_parts.
910 The array is shared with all TABLE objects referring to this table share.
911 */
913 /**
914 Bitmap with flags representing some of table options/attributes.
915
916 @sa HA_OPTION_PACK_RECORD, HA_OPTION_PACK_KEYS, ...
917
918 @note This is basically copy of HA_CREATE_INFO::table_options bitmap
919 at the time of table opening/usage.
920 */
922 /**
923 Bitmap with flags representing some of table options/attributes which
924 are in use by storage engine.
925
926 @note db_options_in_use is normally copy of db_create_options but can
927 be overridden by SE. E.g. MyISAM does this at handler::open() and
928 handler::info() time.
929 */
931 uint rowid_field_offset{0}; /* Field_nr +1 to rowid field */
932 // Primary key index number, used in TABLE::key_info[]. See
933 // is_missing_primary_key() for more details.
934 uint primary_key{0};
935 uint next_number_index{0}; /* autoincrement key number */
936 uint next_number_key_offset{0}; /* autoinc keypart offset in a key */
937 uint next_number_keypart{0}; /* autoinc keypart number in a key */
938 bool error{false}; /* error during open_table_def() */
940 /// Number of generated fields
941 uint vfields{0};
942 /// Number of fields having the default value generated
944 bool system{false}; /* Set if system table (one record) */
945 bool db_low_byte_first{false}; /* Portable row format */
946 bool crashed{false};
947 bool is_view{false};
948 /// Materialized view, materialized directly by a storage engine
950 bool m_open_in_progress{false}; /* True: alloc'ed, false: def opened */
951 mysql::binlog::event::Table_id table_map_id; /* for row-based replication */
952
953 /*
954 Cache for row-based replication table share checks that does not
955 need to be repeated. Possible values are: -1 when cache value is
956 not calculated yet, 0 when table *shall not* be replicated, 1 when
957 table *may* be replicated.
958 */
960
961 /*
962 Storage media to use for this table (unless another storage
963 media has been specified on an individual column - in versions
964 where that is supported)
965 */
967
968 /* Name of the tablespace used for this table */
969 const char *tablespace{nullptr};
970
971 /**
972 Partition meta data. Allocated from TABLE_SHARE::mem_root,
973 created when reading from the dd tables,
974 used as template for each TABLE instance.
975 The reason for having it on the TABLE_SHARE is to be able to reuse the
976 partition_elements containing partition names, values etc. instead of
977 allocating them for each TABLE instance.
978 TODO: Currently it is filled in and then only used for generating
979 the partition_info_str. The plan is to clone/copy/reference each
980 TABLE::part_info instance from it.
981 What is missing before it can be completed:
982 1) The partition expression, currently created only during parsing which
983 also needs the current TABLE instance as context for name resolution etc.
984 2) The partition values, currently the DD stores them as text so it needs
985 to be converted to field images (which is now done by first parsing the
986 value text into an Item, then saving the Item result/value into a field
987 and then finally copy the field image).
988 */
990 // TODO: Remove these four variables:
991 /**
992 Filled in when reading from frm.
993 This can simply be removed when removing the .frm support,
994 since it is already stored in the new DD.
995 */
996 bool auto_partitioned{false};
997 /**
998 Storing the full partitioning clause (PARTITION BY ...) which is used
999 when creating new partition_info object for each new TABLE object by
1000 parsing this string.
1001 These two will be needed until the missing parts above is fixed.
1002 */
1003 char *partition_info_str{nullptr};
1005
1006 /**
1007 Cache the checked structure of this table.
1008
1009 The pointer data is used to describe the structure that
1010 a instance of the table must have. Each element of the
1011 array specifies a field that must exist on the table.
1012
1013 The pointer is cached in order to perform the check only
1014 once -- when the table is loaded from the disk.
1015 */
1017
1018 /** Main handler's share */
1020
1021 /** Instrumentation for this table share. */
1023
1024 /**
1025 List of tickets representing threads waiting for the share to be flushed.
1026 */
1028
1029 /**
1030 View object holding view definition read from DD. This object is not
1031 cached, and is owned by the table share. We are not able to read it
1032 on demand since we may then get a cache miss while holding LOCK_OPEN.
1033 */
1034 const dd::View *view_object{nullptr};
1035
1036 /**
1037 Data-dictionary object describing explicit temporary table represented
1038 by this share. NULL for other table types (non-temporary tables, internal
1039 temporary tables). This object is owned by TABLE_SHARE and should be
1040 deleted along with it.
1041 */
1043
1044 /// For materialized derived tables; @see add_derived_key().
1046
1047 /**
1048 Arrays with descriptions of foreign keys in which this table participates
1049 as child or parent. We only cache in them information from dd::Table object
1050 which is sufficient for use by prelocking algorithm/to check if table is
1051 referenced by a foreign key.
1052 */
1057
1058 // List of check constraint share instances.
1060
1061 /**
1062 List of trigger descriptions for the table loaded from the data-dictionary.
1063 Is nullptr if the table doesn't have triggers.
1064
1065 @note The purpose of the Trigger objects in this list is to serve as
1066 template for per-TABLE-object Trigger objects as well as to
1067 store static metadata that may be shared between Trigger instances.
1068 The triggers in this list can't be executed directly.
1069 */
1071
1072 /**
1073 Schema's read only mode - ON (true) or OFF (false). This is filled in
1074 when the share is initialized with meta data from DD. If the schema is
1075 altered, the tables and share are removed. This can be done since
1076 ALTER SCHEMA acquires exclusive meta data locks on the tables in the
1077 schema. We set this only for non-temporary tables. Otherwise, the value
1078 of the member below is 'NOT_SET'.
1079 */
1082
1083 /**
1084 Set share's table cache key and update its db and table name appropriately.
1085
1086 @param key_buff Buffer with already built table cache key to be
1087 referenced from share.
1088 @param key_length Key length.
1089
1090 @note
1091 Since 'key_buff' buffer will be referenced from share it should has same
1092 life-time as share itself.
1093 This method automatically ensures that TABLE_SHARE::table_name/db have
1094 appropriate values by using table cache key as their source.
1095 */
1096
1097 void set_table_cache_key(char *key_buff, size_t key_length) {
1098 table_cache_key.str = key_buff;
1099 table_cache_key.length = key_length;
1100 /*
1101 Let us use the fact that the key is "db/0/table_name/0" + optional
1102 part for temporary tables.
1103 */
1105 db.length = strlen(db.str);
1106 table_name.str = db.str + db.length + 1;
1107 table_name.length = strlen(table_name.str);
1108 }
1109
1110 /**
1111 Set share's table cache key and update its db and table name appropriately.
1112
1113 @param key_buff Buffer to be used as storage for table cache key
1114 (should be at least key_length bytes).
1115 @param key Value for table cache key.
1116 @param key_length Key length.
1117
1118 NOTE
1119 Since 'key_buff' buffer will be used as storage for table cache key
1120 it should has same life-time as share itself.
1121 */
1122
1123 void set_table_cache_key(char *key_buff, const char *key, size_t key_length) {
1124 memcpy(key_buff, key, key_length);
1125 set_table_cache_key(key_buff, key_length);
1126 }
1127
1129
1130 /** Returns the version of this TABLE_SHARE. */
1131 unsigned long version() const { return m_version; }
1132
1133 /**
1134 Set the version of this TABLE_SHARE to zero. This marks the
1135 TABLE_SHARE for automatic removal from the table definition cache
1136 once it is no longer referenced.
1137 */
1138 void clear_version();
1139
1140 /** Is this table share being expelled from the table definition cache? */
1141 bool has_old_version() const { return version() != refresh_version; }
1142
1143 /**
1144 Convert unrelated members of TABLE_SHARE to one enum
1145 representing its type.
1146
1147 @todo perhaps we need to have a member instead of a function.
1148 */
1150 if (is_view) return TABLE_REF_VIEW;
1151 switch (tmp_table) {
1152 case NO_TMP_TABLE:
1153 return TABLE_REF_BASE_TABLE;
1154 case SYSTEM_TMP_TABLE:
1155 return TABLE_REF_I_S_TABLE;
1156 default:
1157 return TABLE_REF_TMP_TABLE;
1158 }
1159 }
1160 /**
1161 Return a table metadata version.
1162 * for base tables and views, we return table_map_id.
1163 It is assigned from a global counter incremented for each
1164 new table loaded into the table definition cache (TDC).
1165 * for temporary tables it's table_map_id again. But for
1166 temporary tables table_map_id is assigned from
1167 thd->query_id. The latter is assigned from a thread local
1168 counter incremented for every new SQL statement. Since
1169 temporary tables are thread-local, each temporary table
1170 gets a unique id.
1171 * for everything else (e.g. information schema tables),
1172 the version id is zero.
1173
1174 This choice of version id is a large compromise
1175 to have a working prepared statement validation in 5.1. In
1176 future version ids will be persistent, as described in WL#4180.
1177
1178 Let's try to explain why and how this limited solution allows
1179 to validate prepared statements.
1180
1181 Firstly, sets (in mathematical sense) of version numbers
1182 never intersect for different table types. Therefore,
1183 version id of a temporary table is never compared with
1184 a version id of a view, and vice versa.
1185
1186 Secondly, for base tables and views, we know that each DDL flushes
1187 the respective share from the TDC. This ensures that whenever
1188 a table is altered or dropped and recreated, it gets a new
1189 version id.
1190 Unfortunately, since elements of the TDC are also flushed on
1191 LRU basis, this choice of version ids leads to false positives.
1192 E.g. when the TDC size is too small, we may have a SELECT
1193 * FROM INFORMATION_SCHEMA.TABLES flush all its elements, which
1194 in turn will lead to a validation error and a subsequent
1195 reprepare of all prepared statements. This is
1196 considered acceptable, since as long as prepared statements are
1197 automatically reprepared, spurious invalidation is only
1198 a performance hit. Besides, no better simple solution exists.
1199
1200 For temporary tables, using thd->query_id ensures that if
1201 a temporary table was altered or recreated, a new version id is
1202 assigned. This suits validation needs very well and will perhaps
1203 never change.
1204
1205 Metadata of information schema tables never changes.
1206 Thus we can safely assume 0 for a good enough version id.
1207
1208 Finally, by taking into account table type, we always
1209 track that a change has taken place when a view is replaced
1210 with a base table, a base table is replaced with a temporary
1211 table and so on.
1212
1213 @retval 0 For schema tables, DD tables and system views.
1214 non-0 For bases tables, views and temporary tables.
1215
1216 @sa Table_ref::is_table_ref_id_equal()
1217 */
1219
1220 /** Determine if the table is missing a PRIMARY KEY. */
1222 assert(primary_key <= MAX_KEY);
1223 return primary_key == MAX_KEY;
1224 }
1225
1226 uint find_first_unused_tmp_key(const Key_map &k);
1227
1228 bool visit_subgraph(Wait_for_flush *waiting_ticket,
1229 MDL_wait_for_graph_visitor *gvisitor);
1230
1231 bool wait_for_old_version(THD *thd, struct timespec *abstime,
1232 uint deadlock_weight);
1233
1234 /**
1235 The set of indexes that the optimizer may use when creating an execution
1236 plan.
1237 */
1238 Key_map usable_indexes(const THD *thd) const;
1239
1240 /** Release resources and free memory occupied by the table share. */
1241 void destroy();
1242
1243 /**
1244 How many TABLE objects use this TABLE_SHARE.
1245 @return the reference count
1246 */
1247 unsigned int ref_count() const {
1248 assert(assert_ref_count_is_locked(this));
1249 return m_ref_count;
1250 }
1251
1252 /**
1253 Increment the reference count by one.
1254 @return the new reference count
1255 */
1256 unsigned int increment_ref_count() {
1257 assert(assert_ref_count_is_locked(this));
1258 assert(!m_open_in_progress);
1259 return ++m_ref_count;
1260 }
1261
1262 /**
1263 Decrement the reference count by one.
1264 @return the new reference count
1265 */
1266 unsigned int decrement_ref_count() {
1267 assert(assert_ref_count_is_locked(this));
1268 assert(!m_open_in_progress);
1269 assert(m_ref_count > 0);
1270 return --m_ref_count;
1271 }
1272
1273 /// Does this TABLE_SHARE represent a table in a primary storage engine?
1274 bool is_primary_engine() const { return !m_secondary_engine; }
1275
1276 /// Does this TABLE_SHARE represent a table in a secondary storage engine?
1278
1279 /**
1280 Does this TABLE_SHARE represent a primary table that has a shadow
1281 copy in a secondary storage engine?
1282 */
1284 return is_primary_engine() && secondary_engine.str != nullptr;
1285 }
1286
1287 /** Returns whether this table is referenced by a foreign key. */
1289
1290 private:
1291 /// How many TABLE objects use this TABLE_SHARE.
1292 unsigned int m_ref_count{0};
1293
1294 /**
1295 TABLE_SHARE version, if changed the TABLE_SHARE must be reopened.
1296 NOTE: The TABLE_SHARE will not be reopened during LOCK TABLES in
1297 close_thread_tables!!!
1298 */
1299 unsigned long m_version{0};
1300
1301 protected: // To allow access from unit tests.
1302 /// Does this TABLE_SHARE represent a table in a secondary storage engine?
1304};
1305
1306/**
1307 Class is used as a BLOB field value storage for
1308 intermediate GROUP_CONCAT results. Used only for
1309 GROUP_CONCAT with DISTINCT or ORDER BY options.
1310 */
1311
1313 private:
1315 /**
1316 Sign that some values were cut
1317 during saving into the storage.
1318 */
1320
1321 public:
1324
1325 void reset() {
1327 truncated_value = false;
1328 }
1329 /**
1330 Function creates duplicate of 'from'
1331 string in 'storage' MEM_ROOT.
1332
1333 @param from string to copy
1334 @param length string length
1335
1336 @retval Pointer to the copied string.
1337 @retval 0 if an error occurred.
1338 */
1339 char *store(const char *from, size_t length) {
1340 return (char *)memdup_root(&storage, from, length);
1341 }
1344 }
1345 bool is_truncated_value() const { return truncated_value; }
1346};
1347
1348/**
1349 Class that represents a single change to a column value in partial
1350 update of a JSON column.
1351*/
1352class Binary_diff final {
1353 /// The offset of the start of the change.
1354 size_t m_offset;
1355
1356 /// The size of the portion that is to be replaced.
1357 size_t m_length;
1358
1359 public:
1360 /**
1361 Create a new Binary_diff object.
1362
1363 @param offset the offset of the beginning of the change
1364 @param length the length of the section that is to be replaced
1365 */
1366 Binary_diff(size_t offset, size_t length)
1368
1369 /// @return the offset of the changed data
1370 size_t offset() const { return m_offset; }
1371
1372 /// @return the length of the changed data
1373 size_t length() const { return m_length; }
1374
1375 /**
1376 Get a pointer to the start of the replacement data.
1377
1378 @param field the column that is updated
1379 @return a pointer to the start of the replacement data
1380 */
1381 const char *new_data(const Field *field) const;
1382
1383 /**
1384 Get a pointer to the start of the old data to be replaced.
1385
1386 @param field the column that is updated
1387 @return a pointer to the start of old data to be replaced.
1388 */
1389 const char *old_data(const Field *field) const;
1390};
1391
1392/**
1393 Vector of Binary_diff objects.
1394
1395 The Binary_diff objects in the vector should be ordered on offset, and none
1396 of the diffs should be overlapping or adjacent.
1397*/
1399
1400/**
1401 Flags for TABLE::m_status (maximum 8 bits).
1402 The flags define the state of the row buffer in TABLE::record[0].
1403*/
1404/**
1405 STATUS_NOT_STARTED is set when table is not accessed yet.
1406 Neither STATUS_NOT_FOUND nor STATUS_NULL_ROW can be set when this flag is set.
1407*/
1408#define STATUS_NOT_STARTED 1
1409/**
1410 Means we were searching for a row and didn't find it. This is used by
1411 storage engines (@see handler::index_read_map()) and the executor, both
1412 when doing an exact row lookup and advancing a scan (no more rows in range).
1413*/
1414#define STATUS_NOT_FOUND 2
1415/// Reserved for use by multi-table update. Means the row has been updated.
1416#define STATUS_UPDATED 16
1417/**
1418 Means that table->null_row is set. This is an artificial NULL-filled row
1419 (one example: in outer join, if no match has been found in inner table).
1420*/
1421#define STATUS_NULL_ROW 32
1422/// Reserved for use by multi-table delete. Means the row has been deleted.
1423#define STATUS_DELETED 64
1424
1425/* Information for one open table */
1427
1428/* Bitmap of table's fields */
1430
1431/*
1432 NOTE: Despite being a struct (for historical reasons), TABLE has
1433 a nontrivial destructor.
1434*/
1435struct TABLE {
1436 TABLE_SHARE *s{nullptr};
1437 handler *file{nullptr};
1438 TABLE *next{nullptr}, *prev{nullptr};
1439
1440 private:
1441 /**
1442 Links for the lists of used/unused TABLE objects for the particular
1443 table in the specific instance of Table_cache (in other words for
1444 specific Table_cache_element object).
1445 Declared as private to avoid direct manipulation with those objects.
1446 One should use methods of I_P_List template instead.
1447 */
1448 TABLE *cache_next{nullptr}, **cache_prev{nullptr};
1449
1450 /*
1451 Give Table_cache_element access to the above two members to allow
1452 using them for linking TABLE objects in a list.
1453 */
1455
1456 /**
1457 Links for the LRU list of unused TABLE objects with fully loaded triggers
1458 in the specific instance of Table_cache.
1459 */
1461
1462 /*
1463 Give Table_cache access to the above two members to allow using them
1464 for linking TABLE objects in a list.
1465 */
1466 friend class Table_cache;
1467
1468 public:
1469 // Pointer to the histograms available on the table.
1470 // Protected in the same way as the pointer to the share.
1472
1473 /**
1474 A bitmap marking the hidden generated columns that exists for functional
1475 indexes.
1476 */
1478 /**
1479 The current session using this table object.
1480 Should be NULL when object is not in use.
1481 For an internal temporary table, it is NULL when the table is closed.
1482 Used for two purposes:
1483 - Signal that the object is in use, and by which session.
1484 - Pass the thread handler to storage handlers.
1485 The field should NOT be used as a general THD reference, instead use
1486 a passed THD reference, or, if there is no such, current_thd.
1487 The reason for this is that we cannot guarantee the field is not NULL.
1488 */
1489 THD *in_use{nullptr};
1490 Field **field{nullptr}; /* Pointer to fields */
1491 /// Count of hidden fields, if internal temporary table; 0 otherwise.
1493
1494 uchar *record[2]{nullptr, nullptr}; /* Pointer to records */
1495 uchar *write_row_record{nullptr}; /* Used as optimisation in
1496 THD::write_row */
1497 uchar *insert_values{nullptr}; /* used by INSERT ... UPDATE */
1498
1499 /// Buffer for use in multi-row reads. Initially empty.
1501
1502 /*
1503 Map of keys that can be used to retrieve all data from this table needed by
1504 the query without reading the row.
1505
1506 Note that the primary clustered key is treated as any other key, so for a
1507 table t with a primary key column p and a second column c, the primary key
1508 will be marked as covering for the query "SELECT p FROM t", but will not be
1509 marked as covering for the query "SELECT p, c FROM t" (even though we can in
1510 some sense retrieve the data from the index).
1511 */
1514
1515 /* Merge keys are all keys that had a column referred to in the query */
1517
1518 /*
1519 possible_quick_keys is a superset of quick_keys to use with EXPLAIN of
1520 JOIN-less commands (single-table UPDATE and DELETE).
1521
1522 When explaining regular JOINs, we use JOIN_TAB::keys to output the
1523 "possible_keys" column value. However, it is not available for
1524 single-table UPDATE and DELETE commands, since they don't use JOIN
1525 optimizer at the top level. OTOH they directly use the range optimizer,
1526 that collects all keys usable for range access here.
1527 */
1529
1530 /*
1531 A set of keys that can be used in the query that references this
1532 table.
1533
1534 All indexes disabled on the table's TABLE_SHARE (see TABLE::s) will be
1535 subtracted from this set upon instantiation. Thus for any TABLE t it holds
1536 that t.keys_in_use_for_query is a subset of t.s.keys_in_use. Generally we
1537 must not introduce any new keys here (see setup_tables).
1538
1539 The set is implemented as a bitmap.
1540 */
1542 /* Map of keys that can be used to calculate GROUP BY without sorting */
1544 /* Map of keys that can be used to calculate ORDER BY without sorting */
1546 KEY *key_info{nullptr}; /* data of keys defined for the table */
1547 /**
1548 Key part array for generated keys, used for materialized derived tables.
1549 This is a contiguous array, with size given by s->max_tmp_key_parts.
1550 */
1552
1553 Field *next_number_field{nullptr}; /* Set if next_number is activated */
1554 Field *found_next_number_field{nullptr}; /* Set on open */
1555 /// Pointer to generated columns
1556 Field **vfield{nullptr};
1557 /// Pointer to fields having the default value generated
1559 /// Field used by unique constraint
1561 // ----------------------------------------------------------------------
1562 // The next few members are used if this (temporary) file is used solely for
1563 // the materialization/computation of an INTERSECT or EXCEPT set operation
1564 // (in addition to hash_field above used to detect duplicate rows). For
1565 // INTERSECT and EXCEPT, we always use the hash field and compute the shape
1566 // of the result set using m_set_counter. The latter is a hidden field
1567 // located between the hash field and the row proper, only present for
1568 // INTERSECT or EXCEPT materialized in a temporary result table. The
1569 // materialized table has no duplicate rows, relying instead of the embedded
1570 // counter to produce the correct number of duplicates with ALL semantics. If
1571 // we have distinct semantics, we squash duplicates. This all happens in the
1572 // reading step of the tmp table (TableScanIterator::Read),
1573 // cf. m_last_operation_is_distinct. For explanation if the logic of the set
1574 // counter, see MaterializeIterator<Profiler>::MaterializeOperand.
1575 //
1576
1577 /// A priori unlimited. We pass this on to TableScanIterator at construction
1578 /// time, q.v., to limit the number of rows out of an EXCEPT or INTERSECT.
1579 /// For these set operations, we do not know enough to enforce the limit at
1580 /// materialize time (as for UNION): only when reading the rows with
1581 /// TableScanIterator do we check the counters.
1582 /// @todo: Ideally, this limit should be communicated to TableScanIterator in
1583 /// some other way.
1585
1586 private:
1587 /// The set counter. It points to the field in the materialized table
1588 /// holding the counter used to compute INTERSECT and EXCEPT, in record[0].
1589 /// For EXCEPT [DISTINCT | ALL] and INTERSECT DISTINCT this is a simple 64
1590 /// bits counter. For INTERSECT ALL, it is subdivided into two sub counters
1591 /// cf. class HalfCounter, cf. MaterializeOperand. See set_counter().
1593
1594 /// If m_set_counter is set: true if last block has DISTINCT semantics,
1595 /// either because it is marked as such, or because we have computed this
1596 /// to give an equivalent answer. If false, we have ALL semantics.
1597 /// It will be true if any DISTINCT is given in the merged N-ary set
1598 /// operation. See is_distinct().
1600 /// If false, any de-duplication happens via an index on this table
1601 /// (e.g. SELECT DISTINCT, set operation). If true, this table represents the
1602 /// output of a set operation, and de-duplication happens via an in-memory
1603 /// hash map, in which case we do not use any index, unless we get secondary
1604 /// overflow.
1606
1607 public:
1608 /// True if character set conversions are always strict
1610
1620
1621 private:
1622 /// Holds the set operation type
1624
1625 public:
1626 /// Test if this tmp table stores the result of a UNION set operation or
1627 /// a single table.
1628 /// @return true if so, else false.
1629 bool is_union_or_table() const { return m_set_counter == nullptr; }
1630
1631 void set_use_hash_map(bool use_hash_map) {
1632 m_deduplicate_with_hash_map = use_hash_map;
1633 }
1634
1636
1637 /// Returns the set operation type
1639 if (m_set_op_type == SOT_NONE) {
1640 assert(is_union_or_table()); // EXCEPT and INTERSECT are already set up
1642 }
1643 return m_set_op_type;
1644 }
1645
1646 bool is_intersect() const {
1647 return m_set_op_type == SOT_INTERSECT_ALL ||
1649 }
1650
1651 bool is_except() const {
1652 return m_set_op_type == SOT_EXCEPT_ALL ||
1654 }
1655
1657 /**
1658 Initialize the set counter field pointer and the type of set operation
1659 *other than UNION*.
1660 @param set_counter the field in the materialized table that holds the
1661 counter we use to compute intersect or except
1662 @param except if true, EXCEPT, else INTERSECT
1663 @param distinct if true, the set operation is DISTINCT, else ALL
1664 */
1665 void set_set_op(Field_longlong *set_counter, bool except, bool distinct) {
1668 assert(m_set_op_type == SOT_NONE);
1669 m_set_op_type = except ? (distinct ? SOT_EXCEPT_DISTINCT : SOT_EXCEPT_ALL)
1670 : distinct ? SOT_INTERSECT_DISTINCT
1672 }
1673
1675 //
1676 // end of INTERSECT and EXCEPT specific members
1677 // ----------------------------------------------------------------------
1678
1679 Field *fts_doc_id_field{nullptr}; /* Set if FTS_DOC_ID field is present */
1680
1681 /* Table's triggers, 0 if there are no of them */
1683 Table_ref *pos_in_table_list{nullptr}; /* Element referring to this table */
1684 /* Position in thd->locked_table_list under LOCK TABLES */
1686 ORDER *group{nullptr};
1687 const char *alias{nullptr}; ///< alias or table name
1688 uchar *null_flags{nullptr}; ///< Pointer to the null flags of record[0]
1690 nullptr}; ///< Saved null_flags while null_row is true
1691
1692 /* containers */
1694 /*
1695 Bitmap of fields that one or more query condition refers to. Only
1696 used if optimizer_condition_fanout_filter is turned 'on'.
1697 Currently, only the WHERE clause and ON clause of inner joins is
1698 taken into account but not ON conditions of outer joins.
1699 Furthermore, HAVING conditions apply to groups and are therefore
1700 not useful as table condition filters.
1701 */
1703
1704 /**
1705 Bitmap of table fields (columns), which are explicitly set in the
1706 INSERT INTO statement. It is declared here to avoid memory allocation
1707 on MEM_ROOT).
1708
1709 @sa fields_set_during_insert.
1710 */
1712
1713 /**
1714 The read set contains the set of columns that the execution engine needs to
1715 process the query. In particular, it is used to tell the storage engine
1716 which columns are needed. For virtual generated columns, the underlying base
1717 columns are also added, since they are required in order to calculate the
1718 virtual generated columns.
1719
1720 Internal operations in the execution engine that need to move rows between
1721 buffers, such as aggregation, sorting, hash join and set operations, should
1722 rather use read_set_internal, since the virtual generated columns have
1723 already been calculated when the row was read from the storage engine.
1724
1725 Set during resolving; every field that gets resolved, sets its own bit
1726 in the read set. In some cases, we switch the read set around during
1727 various phases; note that it is a pointer.
1728
1729 In addition, for binary logging purposes, the bitmaps are set according
1730 to the settings of @@binlog_row_image. Therefore, for logging purposes,
1731 some additional fields, to those specified by the optimizer, may be
1732 flagged in the read and write sets.
1733 @c TABLE::mark_columns_per_binlog_row_image for additional details.
1734 */
1736
1738
1739 /**
1740 A bitmap of fields that are explicitly referenced by the query. This is
1741 mostly the same as read_set, but it does not include base columns of
1742 referenced virtual generated columns unless the base columns are referenced
1743 explicitly in the query.
1744
1745 This is the read set that should be used for determining which columns to
1746 store in join buffers, aggregation buffers, sort buffers, or similar
1747 operations internal to the execution engine. Both because it is unnecessary
1748 to store the implicitly read base columns in the buffer, since they won't
1749 ever be read out of the buffer anyways, and because the base columns may not
1750 even be possible to read, if a covering index scan is used and the index
1751 only contains the virtual column and not all its base columns.
1752 */
1754
1755 /**
1756 A pointer to the bitmap of table fields (columns), which are explicitly set
1757 in the INSERT INTO statement.
1758
1759 fields_set_during_insert points to def_fields_set_during_insert
1760 for base (non-temporary) tables. In other cases, it is NULL.
1761 Triggers can not be defined for temporary tables, so this bitmap does not
1762 matter for temporary tables.
1763
1764 @sa def_fields_set_during_insert.
1765 */
1767
1768 /*
1769 The ID of the query that opened and is using this table. Has different
1770 meanings depending on the table type.
1771
1772 Temporary tables:
1773
1774 table->query_id is set to thd->query_id for the duration of a statement
1775 and is reset to 0 once it is closed by the same statement. A non-zero
1776 table->query_id means that a statement is using the table even if it's
1777 not the current statement (table is in use by some outer statement).
1778
1779 Non-temporary tables:
1780
1781 Under pre-locked or LOCK TABLES mode: query_id is set to thd->query_id
1782 for the duration of a statement and is reset to 0 once it is closed by
1783 the same statement. A non-zero query_id is used to control which tables
1784 in the list of pre-opened and locked tables are actually being used.
1785 */
1787
1788 /*
1789 For each key that has quick_keys.is_set(key) == true: estimate of #records
1790 and max #key parts that range access would use.
1791 */
1793
1794 /* Bitmaps of key parts that =const for the entire join. */
1796
1799
1800 /*
1801 Estimate of number of records that satisfy SARGable part of the table
1802 condition, or table->file->records if no SARGable condition could be
1803 constructed.
1804 This value is used by join optimizer as an estimate of number of records
1805 that will pass the table condition (condition that depends on fields of
1806 this table and constants)
1807 */
1809
1810 uint lock_position{0}; /* Position in MYSQL_LOCK.table */
1811 uint lock_data_start{0}; /* Start pos. in MYSQL_LOCK.locks */
1812 uint lock_count{0}; /* Number of locks */
1813 uint db_stat{0}; /* mode of file as in handler.h */
1814 int current_lock{0}; /* Type of lock on table */
1815
1816 // List of table check constraints.
1818
1819 private:
1820 /**
1821 If true, this table is inner w.r.t. some outer join operation, all columns
1822 are nullable (in the query), and null_row may be true.
1823 */
1824 bool nullable{false};
1825
1826 uint8 m_status{0}; /* What's in record[0] */
1827 public:
1828 /*
1829 If true, the current table row is considered to have all columns set to
1830 NULL, including columns declared as "not null" (see nullable).
1831 @todo make it private, currently join buffering changes it through a pointer
1832 */
1833 bool null_row{false};
1834
1835 bool copy_blobs{false}; /* copy_blobs when storing */
1836
1837 /*
1838 TODO: Each of the following flags take up 8 bits. They can just as easily
1839 be put into one single unsigned long and instead of taking up 18
1840 bytes, it would take up 4.
1841 */
1842 bool force_index{false};
1843
1844 /**
1845 Flag set when the statement contains FORCE INDEX FOR ORDER BY
1846 See Table_ref::process_index_hints().
1847 */
1849
1850 /**
1851 Flag set when the statement contains FORCE INDEX FOR GROUP BY
1852 See Table_ref::process_index_hints().
1853 */
1855 bool const_table{false};
1856 /// True if writes to this table should not write rows and just write keys.
1857 bool no_rows{false};
1858
1859 /**
1860 If set, the optimizer has found that row retrieval should access index
1861 tree only.
1862 */
1863 bool key_read{false};
1864 /**
1865 Certain statements which need the full row, set this to ban index-only
1866 access.
1867 */
1868 bool no_keyread{false};
1869 /**
1870 If set, indicate that the table is not replicated by the server.
1871 */
1872 bool no_replicate{false};
1873 /* To signal that the table is associated with a HANDLER statement */
1874 bool open_by_handler{false};
1875 /**
1876 To indicate that value of the auto_increment field was provided
1877 explicitly by the user or from some other source (e.g. in case of
1878 INSERT ... SELECT, ALTER TABLE or LOAD DATA) and not as default
1879 or result of conversion from NULL value.
1880
1881 @note Since auto_increment fields are always non-NULL we can't find
1882 out using methods of Field class if 0 value stored in such field
1883 was provided explicitly or is result of applying default/conversion
1884 from NULL value. In the former case no new auto_increment value
1885 needs to be generated in MODE_NO_AUTO_VALUE_ON_ZERO mode, while
1886 the latter cases require new value generation. Hence the need
1887 for this flag.
1888 @note Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode and only
1889 by handler::write_row().
1890 */
1892 bool alias_name_used{false}; /* true if table_name is alias */
1893 bool get_fields_in_item_tree{false}; /* Signal to fix_field */
1894
1895 private:
1896 /**
1897 This TABLE object is invalid and cannot be reused. TABLE object might have
1898 inconsistent info or handler might not allow some operations.
1899
1900 For example, TABLE might have inconsistent info about partitioning.
1901 We also use this flag to avoid calling handler::reset() for partitioned
1902 InnoDB tables after in-place ALTER TABLE API commit phase and to force
1903 closing table after REPAIR TABLE has failed during its prepare phase as
1904 well.
1905
1906 @note This member can be set only by thread that owns/has opened the
1907 table and while holding its THD::LOCK_thd_data lock.
1908 It can be read without locking by this owner thread, or by some other
1909 thread concurrently after acquiring owner's THD::LOCK_thd_data.
1910
1911 @note The TABLE will not be reopened under LOCK TABLES in
1912 close_thread_tables().
1913 */
1914 bool m_invalid_dict{false};
1915
1916 /**
1917 This TABLE object is invalid and cannot be reused as it has outdated
1918 rec_per_key and handler stats.
1919
1920 @note This member is protected from concurrent access to it by lock of
1921 Table Cache's partition to which this TABLE object belongs,
1922 */
1923 bool m_invalid_stats{false};
1924
1925 /**
1926 For tmp tables. true <=> tmp table has been instantiated.
1927 Also indicates that table was successfully opened since
1928 we immediately delete tmp tables which we fail to open.
1929 */
1930 bool created{false};
1931
1932 public:
1933 /// For a materializable derived or SJ table: true if has been materialized
1934 bool materialized{false};
1935 struct /* field connections */
1936 {
1937 class JOIN_TAB *join_tab{nullptr};
1938 class QEP_TAB *qep_tab{nullptr};
1939 thr_lock_type lock_type{TL_UNLOCK}; /* How table is used */
1941 /*
1942 true <=> range optimizer found that there is no rows satisfying
1943 table conditions.
1944 */
1945 bool impossible_range{false};
1947
1948 /**
1949 @todo This member should not be declared in-line. That makes it
1950 impossible for any function that does memory allocation to take a const
1951 reference to a TABLE object.
1952 */
1954 /**
1955 Initialized in Item_func_group_concat::setup for appropriate
1956 temporary table if GROUP_CONCAT is used with ORDER BY | DISTINCT
1957 and BLOB field count > 0.
1958 */
1960
1961 /**
1962 Not owned by the TABLE; used only from filesort_free_buffers().
1963 See comments on SortingIterator::CleanupAfterQuery().
1964 */
1967
1968 /**
1969 The result of applying a unique operation (by row ID) to the table, if done.
1970 In particular, this is done in some forms of index merge.
1971 */
1973 partition_info *part_info{nullptr}; /* Partition related information */
1974 /* If true, all partitions have been pruned away */
1977
1978 private:
1979 /// Cost model object for operations on this table
1981
1982 /// Estimate for the amount of data to read per row fetched from this table.
1983 /// The estimate is only calculated when using the hypergraph optimizer.
1985
1986#ifndef NDEBUG
1987 /**
1988 Internal tmp table sequential number. Increased in the order of
1989 creation. Used for debugging purposes when many tmp tables are used
1990 during execution (e.g several windows with window functions)
1991 */
1993#endif
1994 public:
1995 void reset();
1996 void init(THD *thd, Table_ref *tl);
1997 bool init_tmp_table(THD *thd, TABLE_SHARE *share, MEM_ROOT *m_root,
1998 CHARSET_INFO *charset, const char *alias, Field **fld,
1999 uint *blob_fld, bool is_virtual);
2000 bool fill_item_list(mem_root_deque<Item *> *item_list) const;
2001 void clear_column_bitmaps(void);
2002 void prepare_for_position(void);
2003
2006 uint key_parts = 0) const;
2008 void mark_auto_increment_column(void);
2009 void mark_columns_needed_for_update(THD *thd, bool mark_binlog_columns);
2013 void mark_generated_columns(bool is_update);
2014 void mark_gcol_in_maps(const Field *field);
2015 void mark_check_constraint_columns(bool is_update);
2016 void column_bitmaps_set(MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg);
2017 inline void column_bitmaps_set_no_signal(MY_BITMAP *read_set_arg,
2018 MY_BITMAP *write_set_arg) {
2019 read_set = read_set_arg;
2020 write_set = write_set_arg;
2021 }
2022 inline void use_all_columns() {
2024 }
2028 }
2029 void invalidate_dict();
2030 void invalidate_stats();
2031 /**
2032 @note Can be called by thread owning table without additional locking, and
2033 by any other thread which has acquired owner's THD::LOCK_thd_data lock.
2034 */
2035 inline bool has_invalid_dict() const {
2036 assert(assert_invalid_dict_is_locked(this));
2037 return !db_stat || m_invalid_dict;
2038 }
2039 /// @note Can be called by thread owning Table_cache::m_lock
2040 inline bool has_invalid_stats() {
2041 assert(assert_invalid_stats_is_locked(this));
2042 return m_invalid_stats;
2043 }
2044 /// @returns first non-hidden column
2046 /// @returns count of visible fields
2048 bool alloc_tmp_keys(uint new_key_count, uint new_key_part_count,
2049 bool modify_share);
2050 bool add_tmp_key(Field_map *key_parts, bool invisible, bool modify_share);
2051 void move_tmp_key(int old_idx, bool modify_share);
2052 void drop_unused_tmp_keys(bool modify_share);
2053
2054 void set_keyread(bool flag);
2055
2056 /**
2057 Check whether the given index has a virtual generated columns.
2058
2059 @param index_no the given index to check
2060
2061 @returns true if if index is defined over at least one virtual generated
2062 column
2063 */
2064 inline bool index_contains_some_virtual_gcol(uint index_no) const {
2065 assert(index_no < s->keys);
2066 return key_info[index_no].flags & HA_VIRTUAL_GEN_KEY;
2067 }
2068 void update_const_key_parts(Item *conds);
2069
2070 bool check_read_removal(uint index);
2071
2072 ptrdiff_t default_values_offset() const {
2073 return (ptrdiff_t)(s->default_values - record[0]);
2074 }
2075
2076 /// @returns true if a storage engine handler object is assigned to table
2077 bool has_storage_handler() const { return file != nullptr; }
2078
2079 /// Set storage handler for temporary table
2081 // Ensure consistent call order
2082 assert((file == nullptr && file_arg != nullptr) ||
2083 (file != nullptr && file_arg == nullptr));
2084 assert(!is_created());
2085 assert(file_arg->inited == handler::NONE);
2086 file = file_arg;
2087 }
2088 /// Return true if table is instantiated, and false otherwise.
2089 bool is_created() const { return created; }
2090
2091 /**
2092 Set the table as "created", and enable flags in storage engine
2093 that could not be enabled without an instantiated table.
2094 */
2095 void set_created();
2096 /**
2097 Set the contents of table to be "deleted", ie "not created", after having
2098 deleted the contents.
2099 */
2100 void set_deleted() { created = materialized = false; }
2101 /// Set table as nullable, ie it is inner wrt some outer join
2102 void set_nullable() { nullable = true; }
2103
2104 /// Return whether table is nullable
2105 bool is_nullable() const { return nullable; }
2106
2107 /// @return true if table contains one or more generated columns
2108 bool has_gcol() const { return vfield; }
2109
2110 /**
2111 Life cycle of the row buffer is as follows:
2112 - The initial state is "not started".
2113 - When reading a row through the storage engine handler, the status is set
2114 as "has row" or "no row", depending on whether a row was found or not.
2115 The "not started" state is cleared, as well as the "null row" state,
2116 the updated state and the deleted state.
2117 - When making a row available in record[0], make sure to update row status
2118 similarly to how the storage engine handler does it.
2119 - If a NULL-extended row is needed in join execution, the "null row" state
2120 is set. Note that this can be combined with "has row" if a row was read
2121 but condition on it was evaluated to false (happens for single-row
2122 lookup), or "no row" if no more rows could be read.
2123 Note also that for the "null row" state, the NULL bits inside the
2124 row are set to one, so the row inside the row buffer is no longer usable,
2125 unless the NULL bits are saved in a separate buffer.
2126 - The "is updated" and "is deleted" states are set when row is updated or
2127 deleted, respectively.
2128 */
2129 /// Set status for row buffer as "not started"
2132 null_row = false;
2133 }
2134
2135 /// @return true if a row operation has been done
2136 bool is_started() const { return !(m_status & STATUS_NOT_STARTED); }
2137
2138 /// Set status for row buffer: contains row
2140 m_status = 0;
2141 null_row = false;
2142 }
2143
2144 /**
2145 Set status for row buffer: contains no row. This is set when
2146 - A lookup operation finds no row
2147 - A scan operation scans past the last row of the range.
2148 - An error in generating key values before calling storage engine.
2149 */
2150 void set_no_row() {
2152 null_row = false;
2153 }
2154
2155 /**
2156 Set "row found" status from handler result
2157
2158 @param status 0 if row was found, <> 0 if row was not found
2159 */
2162 null_row = false;
2163 }
2164
2165 /**
2166 Set current row as "null row", for use in null-complemented outer join.
2167 The row buffer may or may not contain a valid row.
2168 set_null_row() and reset_null_row() are used by the join executor to
2169 signal the presence or absence of a NULL-extended row for an outer joined
2170 table. Null rows may also be used to specify rows that are all NULL in
2171 grouing operations.
2172 @note this is a destructive operation since the NULL value bit vector
2173 is overwritten. Caching operations must be aware of this.
2174 */
2176 null_row = true;
2178 if (s->null_bytes > 0) memset(null_flags, 255, s->null_bytes);
2179 }
2180
2181 /// Clear "null row" status for the current row
2183 null_row = false;
2184 m_status &= ~STATUS_NULL_ROW;
2185 }
2186
2187 /// Set "updated" property for the current row
2189 assert(is_started() && has_row());
2191 }
2192
2193 /// Set "deleted" property for the current row
2195 assert(is_started() && has_row());
2197 }
2198
2199 /// @return true if there is a row in row buffer
2200 bool has_row() const { return !(m_status & STATUS_NOT_FOUND); }
2201
2202 /// @return true if current row is null-extended
2203 bool has_null_row() const { return null_row; }
2204
2205 /// @return true if current row has been updated (multi-table update)
2206 bool has_updated_row() const { return m_status & STATUS_UPDATED; }
2207
2208 /// @return true if current row has been deleted (multi-table delete)
2209 bool has_deleted_row() const { return m_status & STATUS_DELETED; }
2210
2211 /// Save the NULL flags of the current row into the designated buffer.
2212 /// This should be done before null-complementing a table accessed
2213 /// with EQRefIterator or a const table, as they need to be able to
2214 /// restore the original contents of the record buffer before
2215 /// reading the next row. This is necessary because of their special
2216 /// code for avoiding table access if the same row should be
2217 /// accessed by the next read.
2219 if (s->null_bytes > 0) memcpy(null_flags_saved, null_flags, s->null_bytes);
2220 }
2221
2222 /// Restore the NULL flags of the current row from the designated buffer
2224 if (s->null_bytes > 0) memcpy(null_flags, null_flags_saved, s->null_bytes);
2225 }
2226
2227 /// Empties internal temporary table (deletes rows, closes scan)
2228 bool empty_result_table();
2229
2230 /**
2231 Initialize the optimizer cost model.
2232
2233 This function should be called each time a new query is started.
2234
2235 @param cost_model_server the main cost model object for the query
2236 */
2237 void init_cost_model(const Cost_model_server *cost_model_server) {
2238 m_cost_model.init(cost_model_server, this);
2239 }
2240
2241 /**
2242 Return the cost model object for this table.
2243 */
2244 const Cost_model_table *cost_model() const { return &m_cost_model; }
2245
2246 /// Set the estimate for the number of bytes to read per row in this table.
2249 }
2250
2251 /// Get the estimate for the number of bytes to read per row in this table.
2253
2254 /**
2255 Bind all the table's value generator columns in all the forms:
2256 stored/virtual GC, default expressions and checked constraints.
2257
2258 @details When a table is opened from the dictionary, the Value Generator
2259 expressions are bound during opening (see fix_value_generator_fields()).
2260 After query execution, Item::cleanup() is called on them
2261 (see cleanup_value_generator_items()). When the table is opened from the
2262 table cache, the Value Generetor(s) need to be bound again and this
2263 function does that.
2264 */
2266
2267 /**
2268 Clean any state in items associated with generated columns to be ready for
2269 the next statement.
2270 */
2272
2273#ifndef NDEBUG
2274 void set_tmp_table_seq_id(uint arg) { tmp_table_seq_id = arg; }
2275#endif
2276 /**
2277 Update covering keys depending on max read key length.
2278
2279 Update available covering keys for the table, based on a constrained field
2280 and the identified covering prefix keys: If the matched part of field is
2281 longer than the index prefix,
2282 the prefix index cannot be used as a covering index.
2283
2284 @param[in] field Pointer to field object
2285 @param[in] key_read_length Max read key length
2286 @param[in] covering_prefix_keys Covering prefix keys
2287 */
2288 void update_covering_prefix_keys(Field *field, uint16 key_read_length,
2289 Key_map *covering_prefix_keys);
2290
2291 /**
2292 Returns the primary engine handler for the table.
2293 If none exist, nullptr is returned.
2294 */
2296
2297 private:
2298 /**
2299 Bitmap that tells which columns are eligible for partial update in an
2300 update statement.
2301
2302 The bitmap is lazily allocated in the TABLE's mem_root when
2303 #mark_column_for_partial_update() is called.
2304 */
2306
2307 /**
2308 Object which contains execution time state used for partial update
2309 of JSON columns.
2310
2311 It is allocated in the execution mem_root by #setup_partial_update() if
2312 there are columns that have been marked as eligible for partial update.
2313 */
2315
2316 /**
2317 This flag decides whether or not we should log the drop temporary table
2318 command.
2319 */
2321
2322 public:
2323 /**
2324 Does this table have any columns that can be updated using partial update
2325 in the current row?
2326
2327 @return whether any columns in the current row can be updated using partial
2328 update
2329 */
2330 bool has_binary_diff_columns() const;
2331
2332 /**
2333 Get the list of binary diffs that have been collected for a given column in
2334 the current row, or `nullptr` if partial update cannot be used for that
2335 column.
2336
2337 @param field the column to get binary diffs for
2338 @return the list of binary diffs for the column, or `nullptr` if the column
2339 cannot be updated using partial update
2340 */
2341 const Binary_diff_vector *get_binary_diffs(const Field *field) const;
2342
2343 /**
2344 Mark a given column as one that can potentially be updated using
2345 partial update during execution of an update statement.
2346
2347 Whether it is actually updated using partial update, is not
2348 determined until execution time, since that depends both on the
2349 data that is in the column and the new data that is written to the
2350 column.
2351
2352 This function should be called during preparation of an update
2353 statement.
2354
2355 @param field a column which is eligible for partial update
2356 @retval false on success
2357 @retval true on out-of-memory
2358 */
2360
2361 /**
2362 Has this column been marked for partial update?
2363
2364 Note that this only tells if the column satisfies the syntactical
2365 requirements for being partially updated. Use #is_binary_diff_enabled() or
2366 #is_logical_diff_enabled() instead to see if partial update should be used
2367 on the column.
2368
2369 @param field the column to check
2370 @return whether the column has been marked for partial update
2371 */
2372 bool is_marked_for_partial_update(const Field *field) const;
2373
2374 /**
2375 Does this table have any columns that were marked with
2376 #mark_column_for_partial_update()?
2377
2378 Note that this only tells if any of the columns satisfy the syntactical
2379 requirements for being partially updated. Use
2380 #has_binary_diff_columns(), #is_binary_diff_enabled() or
2381 #is_logical_diff_enabled() instead to see if partial update should be used
2382 on a column.
2383 */
2385
2386 /**
2387 Enable partial update of JSON columns in this table. It is only
2388 enabled for the columns that have previously been marked for
2389 partial update using #mark_column_for_partial_update().
2390
2391 @param logical_diffs should logical JSON diffs be collected in addition
2392 to the physical binary diffs?
2393
2394 This function should be called once per statement execution, when
2395 the update statement is optimized.
2396
2397 @retval false on success
2398 @retval true on out-of-memory
2399 */
2400 bool setup_partial_update(bool logical_diffs);
2401
2402 /**
2403 @see setup_partial_update(bool)
2404
2405 This is a wrapper that auto-computes the value of the parameter
2406 logical_diffs.
2407
2408 @retval false on success
2409 @retval true on out-of-memory
2410 */
2411 bool setup_partial_update();
2412
2413 /**
2414 Add a binary diff for a column that is updated using partial update.
2415
2416 @param field the column that is being updated
2417 @param offset the offset of the changed portion
2418 @param length the length of the changed portion
2419
2420 @retval false on success
2421 @retval true on out-of-memory
2422 */
2423 bool add_binary_diff(const Field *field, size_t offset, size_t length);
2424
2425 /**
2426 Clear the diffs that have been collected for partial update of
2427 JSON columns, and re-enable partial update for any columns where
2428 partial update was temporarily disabled for the current row.
2429 Should be called between each row that is updated.
2430 */
2432
2433 /**
2434 Clean up state used for partial update of JSON columns.
2435
2436 This function should be called at the end of each statement
2437 execution.
2438 */
2440
2441 /**
2442 Temporarily disable collection of binary diffs for a column in the current
2443 row.
2444
2445 This function is called during execution to disable partial update of a
2446 column that was previously marked as eligible for partial update with
2447 #mark_column_for_partial_update() during preparation.
2448
2449 Partial update of this column will be re-enabled when we go to the next
2450 row.
2451
2452 @param field the column to stop collecting binary diffs for
2453 */
2455
2456 /**
2457 Temporarily disable collection of Json_diff objects describing the
2458 logical changes of a JSON column in the current row.
2459
2460 Collection of logical JSON diffs is re-enabled when we go to the next row.
2461
2462 @param field the column to stop collecting logical JSON diffs for
2463 */
2465
2466 /**
2467 Get a buffer that can be used to hold the partially updated column value
2468 while performing partial update.
2469 */
2471
2472 /**
2473 Add a logical JSON diff describing a logical change to a JSON column in
2474 partial update.
2475
2476 @param field the column that is updated
2477 @param path the JSON path that is changed
2478 @param operation the operation to perform
2479 @param new_value the new value in the path
2480
2481 @throws std::bad_alloc if memory cannot be allocated
2482 */
2484 enum_json_diff_operation operation,
2485 const Json_wrapper *new_value);
2486
2487 /**
2488 Get the list of JSON diffs that have been collected for a given column in
2489 the current row, or `nullptr` if partial update cannot be used for that
2490 column.
2491
2492 @param field the column to get JSON diffs for
2493 @return the list of JSON diffs for the column, or `nullptr` if the column
2494 cannot be updated using partial update
2495 */
2497
2498 /**
2499 Is partial update using binary diffs enabled on this JSON column?
2500
2501 @param field the column to check
2502 @return whether the column can be updated with binary diffs
2503 */
2504 bool is_binary_diff_enabled(const Field *field) const;
2505
2506 /**
2507 Is partial update using logical diffs enabled on this JSON column?
2508
2509 @param field the column to check
2510 @return whether the column can be updated with JSON diffs
2511 */
2512 bool is_logical_diff_enabled(const Field *field) const;
2513
2514 /**
2515 Virtual fields of type BLOB have a flag m_keep_old_value. This flag is set
2516 to false for all such fields in this table.
2517 */
2519
2520 /**
2521 Set the variable should_binlog_drop_if_temp_flag, so that
2522 the logging of temporary tables can be decided.
2523
2524 @param should_binlog the value to set flag should_binlog_drop_if_temp_flag
2525 */
2526 void set_binlog_drop_if_temp(bool should_binlog);
2527
2528 /**
2529 @return whether should_binlog_drop_if_temp_flag flag is
2530 set or not
2531 */
2532 bool should_binlog_drop_if_temp(void) const;
2533
2534 /**
2535 Find the histogram for the given field index.
2536
2537 @note If this is called on a TABLE object that belongs to a secondary
2538 engine, it will take a round-trip through the handler in order to obtain the
2539 histogram from the TABLE object associated with the primary engine. This is
2540 done to avoid storing histograms on both the primary and secondary
2541 TABLE_SHARE.
2542
2543 @param field_index The index of the field we want to find a histogram for.
2544
2545 @retval nullptr if no histogram is found.
2546 @retval Pointer to a histogram if one is found.
2547 */
2548 const histograms::Histogram *find_histogram(uint field_index) const;
2549};
2550
2551static inline void empty_record(TABLE *table) {
2552 restore_record(table, s->default_values);
2553 if (table->s->null_bytes > 0)
2554 memset(table->null_flags, 255, table->s->null_bytes);
2555}
2556
2557#define MY_I_S_MAYBE_NULL 1
2558#define MY_I_S_UNSIGNED 2
2559
2561 /**
2562 This is used as column name.
2563 */
2564 const char *field_name;
2565 /**
2566 For string-type columns, this is the maximum number of
2567 characters. Otherwise, it is the 'display-length' for the column.
2568 For the data type MYSQL_TYPE_DATETIME this field specifies the
2569 number of digits in the fractional part of time value.
2570 */
2572 /**
2573 This denotes data type for the column. For the most part, there seems to
2574 be one entry in the enum for each SQL data type, although there seem to
2575 be a number of additional entries in the enum.
2576 */
2579 /**
2580 This is used to set column attributes. By default, columns are @c NOT
2581 @c NULL and @c SIGNED, and you can deviate from the default
2582 by setting the appropriate flags. You can use either one of the flags
2583 @c MY_I_S_MAYBE_NULL and @c MY_I_S_UNSIGNED or
2584 combine them using the bitwise or operator @c |. Both flags are
2585 defined in table.h.
2586 */
2587 uint field_flags; // Field attributes (maybe_null, signed, unsigned etc.)
2588 const char *old_name;
2589 uint open_method; // Not used
2590};
2591
2593 const char *table_name;
2595 /* Fill table with data */
2596 int (*fill_table)(THD *thd, Table_ref *tables, Item *cond);
2597 /* Handle fields for old SHOW */
2598 int (*old_format)(THD *thd, ST_SCHEMA_TABLE *schema_table);
2599 int (*process_table)(THD *thd, Table_ref *tables, TABLE *table, bool res,
2602};
2603
2604/**
2605 Strategy for how to process a view or derived table (merge or materialization)
2606*/
2612
2613enum class enum_view_type {
2614 UNDEFINED,
2615 SQL_VIEW, // Traditional SQL VIEW
2616 JSON_DUALITY_VIEW // JSON Duality view
2617};
2618
2619#define VIEW_SUID_INVOKER 0
2620#define VIEW_SUID_DEFINER 1
2621#define VIEW_SUID_DEFAULT 2
2622
2623/* view WITH CHECK OPTION parameter options */
2624#define VIEW_CHECK_NONE 0
2625#define VIEW_CHECK_LOCAL 1
2626#define VIEW_CHECK_CASCADED 2
2627
2628/* result of view WITH CHECK OPTION parameter check */
2629#define VIEW_CHECK_OK 0
2630#define VIEW_CHECK_ERROR 1
2631#define VIEW_CHECK_SKIP 2
2632
2633/** The threshold size a blob field buffer before it is freed */
2634#define MAX_TDC_BLOB_SIZE 65536
2635
2636/**
2637 Struct that describes an expression selected from a derived table or view.
2638*/
2640 /**
2641 Points to an item that represents the expression.
2642 If the item is determined to be unused, the pointer is set to NULL.
2643 */
2645 /// Name of selected expression
2646 const char *name;
2647};
2648
2649/*
2650 Column reference of a NATURAL/USING join. Since column references in
2651 joins can be both from views and stored tables, may point to either a
2652 Field (for tables), or a Field_translator (for views).
2653*/
2654
2656 public:
2657 Field_translator *view_field; /* Column reference of merge view. */
2658 Item_field *table_field; /* Column reference of table or temp view. */
2659 Table_ref *table_ref; /* Original base table/view reference. */
2660 /*
2661 True if a common join column of two NATURAL/USING join operands. Notice
2662 that when we have a hierarchy of nested NATURAL/USING joins, a column can
2663 be common at some level of nesting but it may not be common at higher
2664 levels of nesting. Thus this flag may change depending on at which level
2665 we are looking at some column.
2666 */
2668
2669 public:
2671 Natural_join_column(Item_field *field_param, Table_ref *tab);
2672 const char *name();
2673 Item_ident *create_item(THD *thd);
2674 Field *field();
2675 const char *table_name();
2676 const char *db_name();
2677 GRANT_INFO *grant();
2678};
2679
2680/**
2681 This is generic enum. It may be reused in the ACL statements
2682 for clauses that can map to the values defined in this enum.
2683*/
2685 UNCHANGED, /* The clause is not specified */
2686 DEFAULT, /* Default value of clause is specified */
2687 YES, /* Value that maps to True is specified */
2688 NO /* Value that maps to False is specified */
2689};
2690
2691struct LEX_MFA {
2698 /*
2699 The following flags are indicators for the SQL syntax used while
2700 parsing CREATE/ALTER user. While other members are self-explanatory,
2701 'uses_authentication_string_clause' signifies if the password is in
2702 hash form (if the var was set to true) or not.
2703 */
2708 /* flag set during CREATE USER .. INITIAL AUTHENTICATION BY */
2710 /* flag set during ALTER USER .. ADD nth FACTOR */
2712 /* flag set during ALTER USER .. MODIFY nth FACTOR */
2714 /* flag set during ALTER USER .. DROP nth FACTOR */
2716 /*
2717 flag used during authentication and to decide if server should
2718 be in sandbox mode or not
2719 */
2721 /* flag set during ALTER USER .. nth FACTOR UNREGISTER */
2723 /* flag set during ALTER USER .. INITIATE REGISTRATION */
2725 /* flag set during ALTER USER .. FINISH REGISTRATION */
2727
2729 void reset() {
2731 auth = NULL_CSTR;
2735 nth_factor = 1;
2739 has_password_generator = false;
2740 passwordless = false;
2741 add_factor = false;
2742 drop_factor = false;
2743 modify_factor = false;
2744 requires_registration = false;
2745 unregister = false;
2746 init_registration = false;
2747 finish_registration = false;
2748 }
2749 void copy(LEX_MFA *m, MEM_ROOT *alloc);
2750};
2751
2752/*
2753 This structure holds the specifications relating to
2754 ALTER user ... PASSWORD EXPIRE ...
2755*/
2773 /* Holds the specification of 'PASSWORD REQUIRE CURRENT' clause. */
2775 void cleanup() {
2781 account_locked = false;
2793 }
2794};
2795
2796/*
2797 This structure holds the specifications related to
2798 mysql user and the associated auth details.
2799*/
2800struct LEX_USER {
2808 /* restrict MFA methods to atmost 3 authentication plugins */
2812
2813 void init() {
2814 user = NULL_CSTR;
2815 host = NULL_CSTR;
2817 uses_replace_clause = false;
2819 discard_old_password = false;
2836 mfa_list.clear();
2837 with_initial_auth = false;
2838 }
2839
2841
2842 bool add_mfa_identifications(LEX_MFA *factor2, LEX_MFA *factor3 = nullptr);
2843
2844 /*
2845 Allocates the memory in the THD mem pool and initialize the members of
2846 this struct. It is preferable to use this method to create a LEX_USER
2847 rather allocating the memory in the THD and initializing the members
2848 explicitly.
2849 */
2850 static LEX_USER *alloc(THD *thd);
2851 static LEX_USER *alloc(THD *thd, LEX_STRING *user, LEX_STRING *host);
2852 /*
2853 Initialize the members of this struct. It is preferable to use this method
2854 to initialize a LEX_USER rather initializing the members explicitly.
2855 */
2856 static LEX_USER *init(LEX_USER *to_init, THD *thd, LEX_STRING *user,
2857 LEX_STRING *host);
2858};
2859
2860/**
2861 Derive type of metadata lock to be requested for table used by a DML
2862 statement from the type of THR_LOCK lock requested for this table.
2863*/
2864
2865inline enum enum_mdl_type mdl_type_for_dml(enum thr_lock_type lock_type) {
2866 return lock_type >= TL_WRITE_ALLOW_WRITE
2870}
2871
2872/**
2873 Type of table which can be open for an element of table list.
2874*/
2875
2881
2882/**
2883 This structure is used to keep info about possible key for the result table
2884 of a derived table/view.
2885 The 'referenced_by' is the table map of tables to which this possible
2886 key corresponds.
2887 The 'used_field' is a map of fields of which this key consists of.
2888 See also the comment for the Table_ref::update_derived_keys function.
2889*/
2890
2892 public:
2896};
2897
2898class Table_function;
2899/*
2900 Table reference in the FROM clause.
2901
2902 These table references can be of several types that correspond to
2903 different SQL elements. Below we list all types of TABLE_LISTs with
2904 the necessary conditions to determine when a Table_ref instance
2905 belongs to a certain type.
2906
2907 1) table (Table_ref::view == NULL)
2908 - base table
2909 (Table_ref::derived == NULL)
2910 - subquery - Table_ref::table is a temp table
2911 (Table_ref::derived != NULL)
2912 - information schema table
2913 (Table_ref::schema_table != NULL)
2914 NOTICE: for schema tables Table_ref::field_translation may be != NULL
2915 2) view (Table_ref::view != NULL)
2916 - merge (Table_ref::effective_algorithm == VIEW_ALGORITHM_MERGE)
2917 also (Table_ref::field_translation != NULL)
2918 - temptable(Table_ref::effective_algorithm == VIEW_ALGORITHM_TEMPTABLE)
2919 also (Table_ref::field_translation == NULL)
2920 3) nested table reference (Table_ref::nested_join != NULL)
2921 - table sequence - e.g. (t1, t2, t3)
2922 TODO: how to distinguish from a JOIN?
2923 - general JOIN
2924 TODO: how to distinguish from a table sequence?
2925 - NATURAL JOIN
2926 (Table_ref::natural_join != NULL)
2927 - JOIN ... USING
2928 (Table_ref::join_using_fields != NULL)
2929 - semi-join
2930 ;
2931*/
2932
2934 public:
2935 Table_ref() = default;
2936
2937 /**
2938 Only to be used by legacy code that temporarily needs a Table_ref,
2939 more specifically: Query_result_create::binlog_show_create_table().
2940 */
2941 explicit Table_ref(TABLE *table_arg) : table(table_arg) {}
2942
2943 /// Constructor that can be used when the strings are null terminated.
2944 Table_ref(const char *db_name, const char *table_name,
2945 enum thr_lock_type lock_type)
2946 : Table_ref(db_name, strlen(db_name), table_name, strlen(table_name),
2947 table_name, lock_type) {}
2948
2949 /**
2950 Creates a Table_ref object with pre-allocated strings for database,
2951 table and alias.
2952 */
2953 Table_ref(TABLE *table_arg, const char *db_name_arg, size_t db_length_arg,
2954 const char *table_name_arg, size_t table_name_length_arg,
2955 const char *alias_arg, enum thr_lock_type lock_type_arg)
2956 : db(db_name_arg),
2957 table_name(table_name_arg),
2958 alias(alias_arg),
2959 m_map(1),
2960 table(table_arg),
2961 m_lock_descriptor{lock_type_arg},
2962 db_length(db_length_arg),
2963 table_name_length(table_name_length_arg) {
2966 }
2967
2968 /// Constructor that can be used when the strings are null terminated.
2969 Table_ref(const char *db_name, const char *table_name, const char *alias,
2970 enum thr_lock_type lock_type)
2971 : Table_ref(db_name, strlen(db_name), table_name, strlen(table_name),
2972 alias, lock_type) {}
2973
2974 /**
2975 This constructor can be used when a Table_ref is needed for an
2976 existing temporary table. These typically have very long table names, since
2977 it is a fully qualified path. For this reason, the table is set to the
2978 alias. The database name is left blank. The lock descriptor is set to
2979 TL_READ.
2980 */
2981 Table_ref(TABLE *table_arg, const char *alias_arg)
2982 : db(""),
2983 table_name(alias_arg),
2984 alias(alias_arg),
2985 m_map(1),
2986 table(table_arg),
2988 db_length(0),
2989 table_name_length(strlen(alias_arg)) {
2992 }
2993
2994 /**
2995 Sets an explicit enum_mdl_type value, without initializing
2996 m_lock_descriptor.
2997 */
2998 Table_ref(TABLE *table_arg, const char *alias_arg, enum_mdl_type mdl_type)
2999 : db(table_arg->s->db.str),
3000 table_name(table_arg->s->table_name.str),
3001 alias(alias_arg),
3002 m_map(1),
3003 table(table_arg),
3004 db_length(table_arg->s->db.length),
3005 table_name_length(table_arg->s->table_name.length) {
3008 }
3009
3010 Table_ref(const char *db_name, const char *table_name_arg,
3011 enum thr_lock_type lock_type_arg,
3012 enum enum_mdl_type mdl_request_type)
3013 : db(db_name),
3014 table_name(table_name_arg),
3015 alias(table_name_arg),
3016 m_map(1),
3017 m_lock_descriptor{lock_type_arg},
3018 db_length(strlen(db_name)),
3019 table_name_length(strlen(table_name_arg)) {
3022 mdl_request.set_type(mdl_request_type);
3023 }
3024
3025 Table_ref(const char *db_name, size_t db_length_arg,
3026 const char *table_name_arg, size_t table_name_length_arg,
3027 enum thr_lock_type lock_type_arg,
3028 enum enum_mdl_type mdl_request_type)
3029 : db(db_name),
3030 table_name(table_name_arg),
3031 alias(table_name_arg),
3032 m_map(1),
3033 m_lock_descriptor{lock_type_arg},
3034 db_length(db_length_arg),
3035 table_name_length(table_name_length_arg) {
3038 mdl_request.set_type(mdl_request_type);
3039 }
3040
3041 Table_ref(const char *db_name, size_t db_length_arg,
3042 const char *table_name_arg, size_t table_name_length_arg,
3043 enum thr_lock_type lock_type_arg)
3044 : db(db_name),
3045 table_name(table_name_arg),
3046 alias(table_name_arg),
3047 m_map(1),
3048 m_lock_descriptor{lock_type_arg},
3049 db_length(db_length_arg),
3050 table_name_length(table_name_length_arg) {}
3051
3052 /**
3053 Sets an explicit enum_mdl_type value, without initializing
3054 m_lock_descriptor.
3055 */
3056 Table_ref(const char *db_name, size_t db_length_arg,
3057 const char *table_name_arg, size_t table_name_length_arg,
3058 const char *alias_arg, enum enum_mdl_type mdl_request_type)
3059 : db(db_name),
3060 table_name(table_name_arg),
3061 alias(alias_arg),
3062 m_map(1),
3063 db_length(db_length_arg),
3064 table_name_length(table_name_length_arg) {
3067 mdl_request.set_type(mdl_request_type);
3068 }
3069
3070 Table_ref(const char *db_name, size_t db_length_arg,
3071 const char *table_name_arg, size_t table_name_length_arg,
3072 const char *alias_arg, enum thr_lock_type lock_type_arg,
3073 enum enum_mdl_type mdl_request_type)
3074 : db(db_name),
3075 table_name(table_name_arg),
3076 alias(alias_arg),
3077 m_map(1),
3078 m_lock_descriptor{lock_type_arg},
3079 db_length(db_length_arg),
3080 table_name_length(table_name_length_arg) {
3083 mdl_request.set_type(mdl_request_type);
3084 }
3085
3086 Table_ref(const char *db_name_arg, size_t db_length_arg,
3087 const char *table_name_arg, size_t table_name_length_arg,
3088 const char *alias_arg, enum thr_lock_type lock_type_arg)
3089 : db(db_name_arg),
3090 table_name(table_name_arg),
3091 alias(alias_arg),
3092 m_map(1),
3093 m_lock_descriptor{lock_type_arg},
3094 db_length(db_length_arg),
3095 table_name_length(table_name_length_arg) {
3098 }
3099
3100 /// Create a Table_ref object representing a nested join
3101 static Table_ref *new_nested_join(MEM_ROOT *allocator, const char *alias,
3103 mem_root_deque<Table_ref *> *belongs_to,
3104 Query_block *select);
3106 Item *join_cond() const { return m_join_cond; }
3107 void set_join_cond(Item *val) {
3108 // If optimization has started, it's too late to change m_join_cond.
3109 assert(m_join_cond_optim == nullptr || m_join_cond_optim == (Item *)1);
3110 m_join_cond = val;
3111 }
3114 /*
3115 Either we are setting to "empty", or there must pre-exist a
3116 permanent condition.
3117 */
3118 assert(cond == nullptr || cond == (Item *)1 || m_join_cond != nullptr);
3119 m_join_cond_optim = cond;
3120 }
3122
3123 /// @returns true if semi-join nest
3124 bool is_sj_nest() const { return m_is_sj_or_aj_nest && !m_join_cond; }
3125 /// @returns true if anti-join nest
3126 bool is_aj_nest() const { return m_is_sj_or_aj_nest && m_join_cond; }
3127 /// @returns true if anti/semi-join nest
3128 bool is_sj_or_aj_nest() const { return m_is_sj_or_aj_nest; }
3129 /// Makes the next a semi/antijoin nest
3131 assert(!m_is_sj_or_aj_nest);
3132 m_is_sj_or_aj_nest = true;
3133 }
3134
3135 /// Merge tables from a query block into a nested join structure
3137
3138 /// Reset table
3139 void reset();
3140
3141 /// Evaluate the check option of a view
3142 int view_check_option(THD *thd) const;
3143
3144 /// Produce a textual identification of this object
3145 void print(const THD *thd, String *str, enum_query_type query_type) const;
3146
3147 /// Check which single table inside a view that matches a table map
3148 bool check_single_table(Table_ref **table_ref, table_map map);
3149
3150 /// Allocate a buffer for inserted column values
3152
3154 /**
3155 Retrieve the last (right-most) leaf in a nested join tree with
3156 respect to name resolution.
3157
3158
3159 Given that 'this' is a nested table reference, recursively walk
3160 down the right-most children of 'this' until we reach a leaf
3161 table reference with respect to name resolution.
3162
3163 The right-most child of a nested table reference is the first
3164 element in the list of children because the children are inserted
3165 in reverse order.
3166
3167 @return
3168 - If 'this' is a nested table reference - the right-most child
3169 of the tree rooted in 'this',
3170 - else - 'this'
3171 */
3173 bool is_leaf_for_name_resolution() const;
3174
3175 /// Return the outermost view this table belongs to, or itself
3176 inline const Table_ref *top_table() const {
3177 return belong_to_view ? belong_to_view : this;
3178 }
3179
3181 return const_cast<Table_ref *>(
3182 const_cast<const Table_ref *>(this)->top_table());
3183 }
3184
3185 /// Prepare check option for a view
3186 bool prepare_check_option(THD *thd, bool is_cascaded = false);
3187
3188 /// Merge WHERE condition of view or derived table into outer query
3189 bool merge_where(THD *thd);
3190
3191 /// Prepare replace filter for a view (used for REPLACE command)
3192 bool prepare_replace_filter(THD *thd);
3193
3194 /// Return true if this represents a named view
3195 bool is_view() const { return view != nullptr; }
3196
3197 /// Return true if this represents a derived table (an unnamed view)
3198 bool is_derived() const { return derived != nullptr && view == nullptr; }
3199
3200 /// Return true if this represents a named view or a derived table
3201 bool is_view_or_derived() const { return derived != nullptr; }
3202
3203 /// Return true if this represents a non-materialized view or a derived table
3206 }
3207
3208 /// Return true if this represents a table function
3209 bool is_table_function() const { return table_function != nullptr; }
3210 /**
3211 @returns true if this is a recursive reference inside the definition of a
3212 recursive CTE.
3213 @note that it starts its existence as a dummy derived table, until the
3214 end of resolution when it's not a derived table anymore, just a reference
3215 to the materialized temporary table. Whereas a non-recursive
3216 reference to the recursive CTE is a derived table.
3217 */
3219
3220 /// @returns true if this is a base table (permanent or temporary)
3221 bool is_base_table() const {
3222 return !(is_view_or_derived() || is_table_function() ||
3224 }
3225 /**
3226 @see is_recursive_reference().
3227 @returns true if error
3228 */
3230
3231 /**
3232 @returns true for a table that represents an optimizer internal table,
3233 is a derived table, a recursive reference, a table function.
3234 Internal tables are only visible inside a query expression, and is hence
3235 not visible in any schema, or need any kind of privilege checking.
3236 */
3237 bool is_internal() const {
3239 }
3240
3241 /**
3242 @returns true for a table that is a placeholder, ie a derived table,
3243 a view, a recursive reference, a table function or a schema table.
3244 A table is also considered to be a placeholder if it does not have a
3245 TABLE object for some other reason.
3246 */
3247 bool is_placeholder() const {
3249 is_table_function() || schema_table || table == nullptr;
3250 }
3251
3252 /// Return true if view or derived table and can be merged
3253 bool is_mergeable() const;
3254
3255 /**
3256 Checks if this is a table that contains zero rows or one row, and that can
3257 be materialized during optimization.
3258
3259 @returns true if materializable table contains one or zero rows, and
3260 materialization during optimization is permitted
3261
3262 Returning true, if the hypergraph optimizer is not active, implies that the
3263 table is materialized during optimization, so it need not be optimized
3264 during execution. The hypergraph optimizer does not care about const tables,
3265 so such tables are not executed during optimization time when it is active.
3266 */
3267 bool materializable_is_const(THD *thd) const;
3268
3269 /// @returns true if this is a derived table containing a stored function.
3270 bool has_stored_program() const;
3271
3272 /// Return true if this is a derived table or view that is merged
3274
3275 /// Set table to be merged
3276 void set_merged() {
3279 }
3280
3281 /// Return true if this is a materializable derived table/view
3284 }
3285
3286 /// Set table to be materialized
3288 // @todo We should do this only once, but currently we cannot:
3289 // assert(effective_algorithm == VIEW_ALGORITHM_UNDEFINED);
3292 }
3293
3294 /// Return true if table is updatable
3295 bool is_updatable() const { return m_updatable; }
3296
3297 /// Set table as updatable. (per default, a table is non-updatable)
3298 void set_updatable() { m_updatable = true; }
3299
3300 /// Return true if table is insertable-into
3301 bool is_insertable() const { return m_insertable; }
3302
3303 /// Set table as insertable-into. (per default, a table is not insertable)
3304 void set_insertable() { m_insertable = true; }
3305
3306 /// Return true if table is being updated
3307 bool is_updated() const { return m_updated; }
3308
3309 /// Set table and all referencing views as being updated
3311 for (Table_ref *tr = this; tr != nullptr; tr = tr->referencing_view)
3312 tr->m_updated = true;
3313 }
3314
3315 /// Return true if table is being inserted into
3316 bool is_inserted() const { return m_inserted; }
3317
3318 /// Set table and all referencing views as being inserted into
3320 for (Table_ref *tr = this; tr != nullptr; tr = tr->referencing_view)
3321 tr->m_inserted = true;
3322 }
3323
3324 /// Return true if table is being deleted from
3325 bool is_deleted() const { return m_deleted; }
3326
3327 /// Set table and all referencing views as being deleted from
3329 for (Table_ref *tr = this; tr != nullptr; tr = tr->referencing_view)
3330 tr->m_deleted = true;
3331 }
3332
3333 /// Set table as full-text search (default is not fulltext searched)
3335
3336 /// Returns true if a MATCH function references this table.
3338
3339 /// Is this table only available in an external storage engine?
3340 bool is_external() const;
3341
3342 /**
3343 Set table as readonly, ie it is neither updatable, insertable nor
3344 deletable during this statement.
3345 */
3347 m_updatable = false;
3348 m_insertable = false;
3349 }
3350
3351 /**
3352 Return true if this is a view or derived table that is defined over
3353 more than one base table, and false otherwise.
3354 */
3355 bool is_multiple_tables() const {
3356 if (is_view_or_derived()) {
3357 assert(is_merged()); // Cannot be a materialized view
3358 return leaf_tables_count() > 1;
3359 } else {
3360 assert(nested_join == nullptr); // Must be a base table
3361 return false;
3362 }
3363 }
3364
3365 /// Return no. of base tables a merged view or derived table is defined over.
3366 uint leaf_tables_count() const;
3367
3368 /// Return first leaf table of a base table or a view/derived table
3370 Table_ref *tr = this;
3371 while (tr->merge_underlying_list) tr = tr->merge_underlying_list;
3372 return tr;
3373 }
3374
3375 /// Return any leaf table that is not an inner table of an outer join
3376 /// @todo WL#6570 with prepare-once, replace with first_leaf_table()
3377 /// when WL#6059 is merged in (it really converts RIGHT JOIN to
3378 /// LEFT JOIN so the first leaf is part of a LEFT JOIN,
3379 /// guaranteed).
3381 Table_ref *tr = this;
3382 while (tr->merge_underlying_list) {
3383 tr = tr->merge_underlying_list;
3384 /*
3385 "while" is used, however, an "if" might be sufficient since there is
3386 no more than one inner table in a join nest (with outer_join true).
3387 */
3388 while (tr->outer_join) tr = tr->next_local;
3389 }
3390 return tr;
3391 }
3392 /**
3393 Set the LEX object of a view (will also define this as a view).
3394 @note: The value 1 is used to indicate a view but without a valid
3395 query object. Use only if the LEX object is not going to
3396 be used in later processing.
3397 */
3398 void set_view_query(LEX *lex) { view = lex; }
3399
3400 /// Return the valid LEX object for a view.
3401 LEX *view_query() const {
3402 assert(view != nullptr && view != (LEX *)1);
3403 return view;
3404 }
3405
3406 /**
3407 Set the query expression of a derived table or view.
3408 (Will also define this as a derived table, unless it is a named view.)
3409 */
3411 derived = query_expr;
3412 }
3413
3414 /// Return the query expression of a derived table or view.
3416 assert(derived);
3417 return derived;
3418 }
3419
3420 /// Resolve a derived table or view reference
3421 bool resolve_derived(THD *thd, bool apply_semijoin);
3422
3423 /// Optimize the query expression representing a derived table/view
3424 bool optimize_derived(THD *thd);
3425
3426 /// Create result table for a materialized derived table/view
3427 bool create_materialized_table(THD *thd);
3428
3429 /// Materialize derived table
3430 bool materialize_derived(THD *thd);
3431
3432 /// Check if we can push outer where condition to this derived table
3434
3435 /// Return the number of hidden fields added for the temporary table
3436 /// created for this derived table.
3438
3439 /// Prepare security context for a view
3440 bool prepare_security(THD *thd);
3441
3444
3445 /**
3446 Compiles the tagged hints list and fills up TABLE::keys_in_use_for_query,
3447 TABLE::keys_in_use_for_group_by, TABLE::keys_in_use_for_order_by,
3448 TABLE::force_index and TABLE::covering_keys.
3449 */
3450 bool process_index_hints(const THD *thd, TABLE *table);
3451
3452 /**
3453 Compare the version of metadata from the previous execution
3454 (if any) with values obtained from the current table
3455 definition cache element.
3456
3457 @sa check_and_update_table_version()
3458 */
3460 return (m_table_ref_type == s->get_table_ref_type() &&
3462 }
3463
3464 /**
3465 Record the value of metadata version of the corresponding
3466 table definition cache element in this parse tree node.
3467
3468 @sa check_and_update_table_version()
3469 */
3472 }
3473
3474 void set_table_ref_id(enum_table_ref_type table_ref_type_arg,
3475 ulonglong table_ref_version_arg) {
3476 m_table_ref_type = table_ref_type_arg;
3477 m_table_ref_version = table_ref_version_arg;
3478 }
3479
3480 /**
3481 If a derived table, returns query block id of first underlying query block.
3482 Zero if not derived.
3483 */
3484 uint query_block_id() const;
3485
3486 /**
3487 This is for showing in EXPLAIN.
3488 If a derived table, returns query block id of first underlying query block
3489 of first materialized Table_ref instance. Zero if not derived.
3490 */
3491 uint query_block_id_for_explain() const;
3492
3493 /**
3494 @brief Returns the name of the database that the referenced table belongs
3495 to.
3496 */
3497 const char *get_db_name() const { return db; }
3498
3499 /**
3500 @brief Returns the name of the table that this Table_ref represents.
3501
3502 @details The unqualified table name or view name for a table or view,
3503 respectively.
3504 */
3505 const char *get_table_name() const { return table_name; }
3507 ha_rows fallback_estimate = PLACEHOLDER_TABLE_ROW_ESTIMATE);
3508 bool update_derived_keys(THD *, Field *, Item **, uint, bool *);
3509 bool generate_keys(THD *thd);
3510
3511 /// Setup a derived table to use materialization
3514
3515 /// Setup a table function to use materialization
3516 bool setup_table_function(THD *thd);
3517
3518 bool create_field_translation(THD *thd);
3519
3520 /**
3521 @brief Returns the outer join nest that this Table_ref belongs to, if
3522 any.
3523
3524 @details There are two kinds of join nests, outer-join nests and semi-join
3525 nests. This function returns non-NULL in the following cases:
3526 @li 1. If this table/nest is embedded in a nest and this nest IS NOT a
3527 semi-join nest. (In other words, it is an outer-join nest.)
3528 @li 2. If this table/nest is embedded in a nest and this nest IS a
3529 semi-join nest, but this semi-join nest is embedded in another
3530 nest. (This other nest will be an outer-join nest, since all inner
3531 joined nested semi-join nests have been merged in
3532 @c simplify_joins() ).
3533 Note: This function assumes that @c simplify_joins() has been performed.
3534 Before that, join nests will be present for all types of join.
3535
3536 @return outer join nest, or NULL if none.
3537 */
3538
3540 if (!embedding) return nullptr;
3541 if (embedding->is_sj_nest()) return embedding->embedding;
3542 return embedding;
3543 }
3544 /**
3545 Return true if this table is an inner table of some outer join.
3546
3547 Examine all the embedding join nests of the table.
3548 @note This function works also before redundant join nests have been
3549 eliminated.
3550
3551 @return true if table is an inner table of some outer join, false otherwise.
3552 */
3553
3555 if (outer_join) return true;
3556 for (Table_ref *emb = embedding; emb; emb = emb->embedding) {
3557 if (emb->outer_join) return true;
3558 }
3559 return false;
3560 }
3561
3562 /**
3563 Return the base table entry of an updatable table.
3564 In DELETE and UPDATE, a view used as a target table must be mergeable,
3565 updatable and defined over a single table.
3566 */
3568 const Table_ref *tbl = this;
3569 // For JDVs we return the root (outermost) base table
3570 if (tbl->is_json_duality_view()) {
3571 return jdv_root_base_table(tbl);
3572 }
3573 assert(tbl->is_updatable() && !tbl->is_multiple_tables());
3574 while (tbl->is_view_or_derived()) {
3575 tbl = tbl->merge_underlying_list;
3576 assert(tbl->is_updatable() && !tbl->is_multiple_tables());
3577 }
3578 return tbl;
3579 }
3580
3582 return const_cast<Table_ref *>(
3583 static_cast<const Table_ref *>(this)->updatable_base_table());
3584 }
3585
3586 /**
3587 Mark that there is a NATURAL JOIN or JOIN ... USING between two tables.
3588
3589 This function marks that table b should be joined with a either via
3590 a NATURAL JOIN or via JOIN ... USING. Both join types are special
3591 cases of each other, so we treat them together. The function
3592 setup_conds() creates a list of equal condition between all fields
3593 of the same name for NATURAL JOIN or the fields in
3594 Table_ref::join_using_fields for JOIN ... USING.
3595 The list of equality conditions is stored
3596 either in b->join_cond(), or in JOIN::conds, depending on whether there
3597 was an outer join.
3598
3599 EXAMPLE
3600 @verbatim
3601 SELECT * FROM t1 NATURAL LEFT JOIN t2
3602 <=>
3603 SELECT * FROM t1 LEFT JOIN t2 ON (t1.i=t2.i and t1.j=t2.j ... )
3604
3605 SELECT * FROM t1 NATURAL JOIN t2 WHERE <some_cond>
3606 <=>
3607 SELECT * FROM t1, t2 WHERE (t1.i=t2.i and t1.j=t2.j and <some_cond>)
3608
3609 SELECT * FROM t1 JOIN t2 USING(j) WHERE <some_cond>
3610 <=>
3611 SELECT * FROM t1, t2 WHERE (t1.j=t2.j and <some_cond>)
3612 @endverbatim
3613
3614 @param b Right join argument.
3615 */
3617
3618 /**
3619 Set granted privileges for a table.
3620
3621 Can be used when generating temporary tables that are also used in
3622 resolver process, such as when generating a UNION table
3623
3624 @param privilege Privileges granted for this table.
3625 */
3627 grant.privilege |= privilege;
3628 }
3629
3630 bool save_properties();
3631 void restore_properties();
3632
3633 /*
3634 List of tables local to a subquery or the top-level SELECT (used by
3635 SQL_I_List). Considers views as leaves (unlike 'next_leaf' below).
3636 Created at parse time in Query_block::add_table_to_list() ->
3637 table_list.link_in_list().
3638 */
3640 /* link in a global list of all queries tables */
3641 Table_ref *next_global{nullptr}, **prev_global{nullptr};
3642 const char *db{nullptr}, *table_name{nullptr}, *alias{nullptr};
3643 /*
3644 Target tablespace name: When creating or altering tables, this
3645 member points to the tablespace_name in the HA_CREATE_INFO struct.
3646 */
3648 char *option{nullptr}; /* Used by cache index */
3649
3650 /** Table level optimizer hints for this table. */
3652 /* Hints for query block of this table. */
3654
3655 void set_lock(const Lock_descriptor &descriptor) {
3656 m_lock_descriptor = descriptor;
3657 }
3658
3660
3662
3663 private:
3664 /**
3665 The members below must be kept aligned so that (1 << m_tableno) == m_map.
3666 A table that takes part in a join operation must be assigned a unique
3667 table number.
3668 */
3669 uint m_tableno{0}; ///< Table number within query block
3670 table_map m_map{0}; ///< Table map, derived from m_tableno
3671 /**
3672 If this table or join nest is the Y in "X [LEFT] JOIN Y ON C", this
3673 member points to C. May also be generated from JOIN ... USING clause.
3674 It may be modified only by permanent transformations (permanent = done
3675 once for all executions of a prepared statement).
3676 */
3679
3680 public:
3681 /*
3682 (Valid only for semi-join nests) Bitmap of tables that are within the
3683 semi-join (this is different from bitmap of all nest's children because
3684 tables that were pulled out of the semi-join nest remain listed as
3685 nest's children).
3686 */
3688
3689 /*
3690 During parsing - left operand of NATURAL/USING join where 'this' is
3691 the right operand. After parsing (this->natural_join == this) iff
3692 'this' represents a NATURAL or USING join operation. Thus after
3693 parsing 'this' is a NATURAL/USING join iff (natural_join != NULL).
3694 */
3696 /*
3697 True if 'this' represents a nested join that is a NATURAL JOIN.
3698 For one of the operands of 'this', the member 'natural_join' points
3699 to the other operand of 'this'.
3700 */
3701 bool is_natural_join{false};
3702 /* Field names in a USING clause for JOIN ... USING. */
3704 /*
3705 Explicitly store the result columns of either a NATURAL/USING join or
3706 an operand of such a join.
3707 */
3709 /* true if join_columns contains all columns of this table reference. */
3711
3712 /*
3713 List of nodes in a nested join tree, that should be considered as
3714 leaves with respect to name resolution. The leaves are: views,
3715 top-most nodes representing NATURAL/USING joins, subqueries, and
3716 base tables. All of these Table_ref instances contain a
3717 materialized list of columns. The list is local to a subquery.
3718 */
3720 /* Index names in a "... JOIN ... USE/IGNORE INDEX ..." clause. */
3722 TABLE *table{nullptr}; /* opened table */
3724 table_id{}; /* table id (from binlog) for opened table */
3725 /*
3726 Query_result for derived table to pass it from table creation to table
3727 filling procedure
3728 */
3730 /*
3731 Reference from aux_tables to local list entry of main select of
3732 multi-delete statement:
3733 delete t1 from t2,t1 where t1.a<'B' and t2.b=t1.b;
3734 here it will be reference of first occurrence of t1 to second (as you
3735 can see this lists can't be merged)
3736 */
3738
3739 /*
3740 Holds the function used as the table function
3741 */
3743
3745
3746 /**
3747 For a view or derived table: Add materialize_path and table_path to
3748 m_materialized_path_cache.
3749 */
3750 void AddMaterializedPathToCache(THD *thd, AccessPath *materialize_path,
3751 const AccessPath *table_path);
3752
3753 /**
3754 Search m_materialized_path_cache for a materialization path for
3755 'table_path'. Return that materialization path, or nullptr if none
3756 is found.
3757 */
3759
3760 /// Empty m_materialized_path_cache.
3762
3763 private:
3764 /// Sampling information.
3767
3769
3770 /**
3771 This field is set to non-null for derived tables and views. It points
3772 to the Query_expression representing the derived table/view.
3773 E.g. for a query
3774 @verbatim SELECT * FROM (SELECT a FROM t1) b @endverbatim
3775 */
3776 Query_expression *derived{nullptr}; /* Query_expression of derived table */
3777
3778 /// If non-NULL, the CTE which this table is derived from.
3780 /**
3781 If the user has specified column names with the syntaxes "table name
3782 parenthesis column names":
3783 WITH qn(column names) AS (select...)
3784 or
3785 FROM (select...) dt(column names)
3786 or
3787 CREATE VIEW v(column_names) AS ...
3788 then this points to the list of column names. NULL otherwise.
3789 */
3791
3792 /**
3793 If we've previously made an access path for “derived”, it is cached here.
3794 This is useful if we need to plan the query block twice (the hypergraph
3795 optimizer can do so, with and without in2exists predicates), both saving
3796 work and avoiding issues when we try to throw away the old items_to_copy
3797 for a new (identical) one.
3798 */
3800
3801 public:
3802 ST_SCHEMA_TABLE *schema_table{nullptr}; /* Information_schema table */
3804 /*
3805 True when the view field translation table is used to convert
3806 schema table fields for backwards compatibility with SHOW command.
3807 */
3809 /* link to query_block where this table was used */
3811
3812 private:
3813 LEX *view{nullptr}; /* link on VIEW lex for merging */
3814
3815 /// m_mv_se_materialized true indicates that the view is a materialized view
3816 /// that is materialized by a storage engine directly.
3818 /// m_mv_se_name is the name of the storage engine that might do the
3819 /// materialization.
3820 LEX_CSTRING m_mv_se_name{.str = nullptr, .length = 0};
3821 /// m_mv_se_available indicates that the current Table_ref is using
3822 /// the materialized view. A Table_ref can be a materialized view (as
3823 /// indicated by m_mv_se_materialized), which is determined by its definition,
3824 /// yet the materialization might not be used during the current lifetime of
3825 /// this object, if the SE does not make it available for some reason.
3827
3828 public:
3829 /// Array of selected expressions from a derived table or view.
3831
3832 /// pointer to element after last one in translation table above
3834 /*
3835 List (based on next_local) of underlying tables of this view. I.e. it
3836 does not include the tables of subqueries used in the view. Is set only
3837 for merged views.
3838 */
3840 /*
3841 - 0 for base tables
3842 - in case of the view it is the list of all (not only underlying
3843 tables but also used in subquery ones) tables of the view.
3844 */
3846 /* most upper view this table belongs to */
3848 /*
3849 The view directly referencing this table
3850 (non-zero only for merged underlying tables of a view).
3851 */
3853 /* Ptr to parent MERGE table list item. See top comment in ha_myisammrg.cc */
3855 /*
3856 Security context (non-zero only for tables which belong
3857 to view with SQL SECURITY DEFINER)
3858 */
3860 /*
3861 This view security context (non-zero only for views with
3862 SQL SECURITY DEFINER)
3863 */
3865 /*
3866 List of all base tables local to a subquery including all view
3867 tables. Unlike 'next_local', this in this list views are *not*
3868 leaves. Created in setup_tables() -> make_leaf_tables().
3869 */
3871 Item *derived_where_cond{nullptr}; ///< WHERE condition from derived table
3872 Item *check_option{nullptr}; ///< WITH CHECK OPTION condition
3873 Item *replace_filter{nullptr}; ///< Filter for REPLACE command
3874 LEX_STRING select_stmt{nullptr, 0}; ///< text of (CREATE/SELECT) statement
3875 LEX_STRING source{nullptr, 0}; ///< source of CREATE VIEW
3876 LEX_STRING timestamp{nullptr, 0}; ///< GMT time stamp of last operation
3877 LEX_USER definer; ///< definer of view
3878 void set_tablesample(tablesample_type sampling_type_arg,
3879 Item *sampling_percentage_arg) {
3880 sampling_type = sampling_type_arg;
3881 sampling_percentage = sampling_percentage_arg;
3882 }
3883
3884 bool has_tablesample() const {
3886 }
3887
3889
3890 double get_sampling_percentage() const;
3891
3893
3895
3896 /**
3897 @note: This field is currently not reliable when read from dictionary:
3898 If an underlying view is changed, updatable_view is not changed,
3899 due to lack of dependency checking in dictionary implementation.
3900 Prefer to use is_updatable() during preparation and optimization.
3901 */
3902 ulonglong updatable_view{0}; ///< VIEW can be updated
3903
3904 bool is_mv_se_available() const { return m_mv_se_available; }
3905
3906 void set_mv_se_available(bool mv_available) {
3907 m_mv_se_available = mv_available;
3908 }
3909
3911
3912 void set_mv_se_materialized(bool is_mv) { m_mv_se_materialized = is_mv; }
3913
3914 const LEX_CSTRING &get_mv_se_name() const { return m_mv_se_name; }
3915
3916 void set_mv_se_name(const char *engine_name) {
3917 m_mv_se_name.str = engine_name;
3918 m_mv_se_name.length = strlen(engine_name);
3919 }
3920
3921 void set_mv_se_name(const LEX_CSTRING &engine_name) {
3922 m_mv_se_name = engine_name;
3923 }
3924
3925 /**
3926 @brief The declared algorithm, if this is a view.
3927 @details One of
3928 - VIEW_ALGORITHM_UNDEFINED
3929 - VIEW_ALGORITHM_TEMPTABLE
3930 - VIEW_ALGORITHM_MERGE
3931 @todo Replace with an enum
3932 */
3934 ulonglong view_suid{0}; ///< view is suid (true by default)
3935 ulonglong with_check{0}; ///< WITH CHECK OPTION
3936
3937 private:
3938 /// The view algorithm that is actually used, if this is a view.
3941
3942 public:
3944
3945 public:
3946 /// True if right argument of LEFT JOIN; false in other cases (i.e. if left
3947 /// argument of LEFT JOIN, if argument of INNER JOIN; RIGHT JOINs are
3948 /// converted to LEFT JOIN during contextualization).
3949 bool outer_join{false};
3950 /// True if was originally the left argument of a RIGHT JOIN, before we
3951 /// made it the right argument of a LEFT JOIN.
3953 uint shared{0}; /* Used in multi-upd */
3954 size_t db_length{0};
3956
3957 private:
3958 /// True if VIEW/TABLE is updatable, based on analysis of query (SQL rules).
3959 bool m_updatable{false};
3960 /// True if VIEW/TABLE is insertable, based on analysis of query (SQL rules).
3961 bool m_insertable{false};
3962 /// True if table is target of UPDATE statement, or updated in IODKU stmt.
3963 bool m_updated{false};
3964 /// True if table is target of INSERT statement.
3965 bool m_inserted{false};
3966 /// True if table is target of DELETE statement, or deleted in REPLACE stmt.
3967 bool m_deleted{false};
3968 bool m_fulltext_searched{false}; ///< True if fulltext searched
3969 public:
3970 bool straight{false}; /* optimize with prev table */
3971 /**
3972 True for tables and views being changed in a data change statement.
3973 Also true for tables subject to a SELECT ... FOR UPDATE.
3974 Also used by replication to filter out statements that can be ignored,
3975 especially important for multi-table UPDATE and DELETE.
3976 */
3977 bool updating{false};
3978 /// preload only non-leaf nodes (IS THIS USED???)
3979 bool ignore_leaves{false};
3980 /**
3981 The set of tables in the query block that this table depends on.
3982 Can be set due to outer join, join order hints or NOT EXISTS relationship.
3983 */
3985 /// The outer tables that an outer join's join condition depends on
3987 /**
3988 Is non-NULL if this table reference is a nested join, ie it represents
3989 the inner tables of an outer join, the tables contained in the
3990 parentheses of an inner join (eliminated during resolving), the tables
3991 referenced in a derived table or view, in a semi-join nest, the tables
3992 from the subquery.
3993 */
3995 /// The nested join containing this table reference.
3997 /// The join list immediately containing this table reference
3999 /// stop PS caching
4000 bool cacheable_table{false};
4001 /**
4002 Specifies which kind of table should be open for this element
4003 of table list.
4004 */
4006 /* true if this merged view contain auto_increment field */
4008 /// true <=> VIEW CHECK OPTION condition is processed (also for prep. stmts)
4010 /// true <=> Filter condition is processed
4012
4014 char timestamp_buffer[20]{0}; /* buffer for timestamp (19+1) */
4015 /*
4016 This Table_ref object is just placeholder for prelocking, it will be
4017 used for implicit LOCK TABLES only and won't be used in real statement.
4018 */
4020 /**
4021 Indicates that if Table_ref object corresponds to the table/view
4022 which requires special handling.
4023 */
4024 enum {
4025 /* Normal open. */
4027 /* Associate a table share only if the the table exists. */
4029 /*
4030 Associate a table share only if the the table exists.
4031 Also upgrade metadata lock to exclusive if table doesn't exist.
4032 */
4034 /* Don't associate a table share. */
4035 OPEN_STUB
4036 } open_strategy{OPEN_NORMAL};
4038 /** true if an alias for this table was specified in the SQL. */
4039 bool is_alias{false};
4040 /** true if the table is referred to in the statement using a fully
4041 qualified name (@<db_name@>.@<table_name@>).
4042 */
4043 bool is_fqtn{false};
4044 /**
4045 If true, this table is a derived (materialized) table which was created
4046 from a scalar subquery, cf.
4047 Query_block::transform_scalar_subqueries_to_join_with_derived
4048 */
4050
4051 /* View creation context. */
4052
4054
4055 /*
4056 Attributes to save/load view creation context in/from frm-file.
4057
4058 They are required only to be able to use existing parser to load
4059 view-definition file. As soon as the parser parsed the file, view
4060 creation context is initialized and the attributes become redundant.
4061
4062 These attributes MUST NOT be used for any purposes but the parsing.
4063 */
4064
4067
4068 /*
4069 View definition (SELECT-statement) in the UTF-form.
4070 */
4071
4073
4074 // True, If this is a system view
4075 bool is_system_view{false};
4076
4077 /// If view, then type of a view.
4079
4080 /// If json duality view, then represents duality view content tree node.
4082
4083 /*
4084 Set to 'true' if this is a DD table being opened in the context of a
4085 dictionary operation. Note that when 'false', this may still be a DD
4086 table when opened in a non-DD context, e.g. as part of an I_S view
4087 query.
4088 */
4089 bool is_dd_ctx_table{false};
4090
4091 /* End of view definition context. */
4092
4093 /* List of possible keys. Valid only for materialized derived tables/views. */
4095
4096 /**
4097 Indicates what triggers we need to pre-load for this Table_ref
4098 when opening an associated TABLE. This is filled after
4099 the parsed tree is created.
4100 */
4103
4105
4106 /// if true, EXPLAIN can't explain view due to insufficient rights.
4107 bool view_no_explain{false};
4108
4109 /* List to carry partition names from PARTITION (...) clause in statement */
4111
4112 /// Set table number
4114 assert(tableno < MAX_TABLES);
4116 m_map = (table_map)1 << tableno;
4117 }
4118 /// Return table number
4119 uint tableno() const { return m_tableno; }
4120
4121 /// Return table map derived from table number
4122 table_map map() const {
4123 assert(((table_map)1 << m_tableno) == m_map);
4124 return m_map;
4125 }
4126
4127 /// If non-NULL, the CTE which this table is derived from.
4130 /// @see m_derived_column_names
4133 }
4136 }
4137
4138 /**
4139 * @brief If view, then check if view is JSON duality view.
4140 *
4141 * @return true If view is JSON duality view.
4142 * @return false Otherwise.
4143 */
4146 }
4147
4148 private:
4149 /*
4150 A group of members set and used only during JOIN::optimize().
4151 */
4152 /**
4153 Optimized copy of m_join_cond (valid for one single
4154 execution). Initialized by Query_block::get_optimizable_conditions().
4155 */
4157
4158 public:
4159 COND_EQUAL *cond_equal{nullptr}; ///< Used with outer join
4160 /// true <=> this table is a const one and was optimized away.
4161
4162 bool optimized_away{false};
4163 /**
4164 true <=> all possible keys for a derived table were collected and
4165 could be re-used while statement re-execution.
4166 */
4167
4169
4170 private:
4171 /// If a recursive reference inside the definition of a CTE.
4173 // End of group for optimization
4174
4175 /** See comments for set_metadata_id() */
4177 /** See comments for TABLE_SHARE::get_table_ref_version() */
4179
4180 /*
4181 All members whose names are suffixed with "_saved" are duplicated in
4182 class TABLE but actually belong in this class. They are saved from class
4183 TABLE when preparing a statement and restored when executing the statement.
4184 They are not required for a regular (non-prepared) statement.
4185 */
4191 bool nullable_saved{false};
4199};
4200
4201/*
4202 Iterator over the fields of a generic table reference.
4203*/
4204
4206 public:
4207 virtual ~Field_iterator() = default;
4208 virtual void set(Table_ref *) = 0;
4209 virtual void next() = 0;
4210 virtual bool end_of_fields() = 0; /* Return 1 at end of list */
4211 virtual const char *name() = 0;
4212 virtual Item_ident *create_item(THD *) = 0;
4213 virtual Field *field() = 0;
4214};
4215
4216/*
4217 Iterator over the fields of a base table, view with temporary
4218 table, or subquery.
4219*/
4220
4223
4224 public:
4226 void set(Table_ref *table) override { ptr = table->table->field; }
4227 void set_table(TABLE *table) { ptr = table->field; }
4228 void next() override { ptr++; }
4229 bool end_of_fields() override { return *ptr == nullptr; }
4230 const char *name() override;
4231 Item_ident *create_item(THD *thd) override;
4232 Field *field() override { return *ptr; }
4233};
4234
4235/**
4236 Iterator over the fields of a merged derived table or view.
4237*/
4238
4242
4243 public:
4245 void set(Table_ref *table) override;
4246 void next() override { ptr++; }
4247 bool end_of_fields() override { return ptr == array_end; }
4248 const char *name() override;
4249 Item_ident *create_item(THD *thd) override;
4250 Item **item_ptr() { return &ptr->item; }
4251 Field *field() override { return nullptr; }
4252 inline Item *item() { return ptr->item; }
4254};
4255
4256/*
4257 Field_iterator interface to the list of materialized fields of a
4258 NATURAL/USING join.
4259*/
4260
4264
4265 public:
4267 ~Field_iterator_natural_join() override = default;
4268 void set(Table_ref *table) override;
4269 void next() override;
4270 bool end_of_fields() override { return !cur_column_ref; }
4271 const char *name() override { return cur_column_ref->name(); }
4272 Item_ident *create_item(THD *thd) override {
4273 return cur_column_ref->create_item(thd);
4274 }
4275 Field *field() override { return cur_column_ref->field(); }
4277};
4278
4279/**
4280 Generic iterator over the fields of an arbitrary table reference.
4281
4282 This class unifies the various ways of iterating over the columns
4283 of a table reference depending on the type of SQL entity it
4284 represents. If such an entity represents a nested table reference,
4285 this iterator encapsulates the iteration over the columns of the
4286 members of the table reference.
4287
4288 The implementation assumes that all underlying NATURAL/USING table
4289 references already contain their result columns and are linked into
4290 the list Table_ref::next_name_resolution_table.
4291*/
4292
4299 void set_field_iterator();
4300
4301 public:
4303 void set(Table_ref *table) override;
4304 void next() override;
4305 bool end_of_fields() override {
4306 return (table_ref == last_leaf && field_it->end_of_fields());
4307 }
4308 const char *name() override { return field_it->name(); }
4309 const char *get_table_name();
4310 const char *get_db_name();
4311 GRANT_INFO *grant();
4312 Item_ident *create_item(THD *thd) override {
4313 return field_it->create_item(thd);
4314 }
4315 Field *field() override { return field_it->field(); }
4317 Table_ref *parent_table_ref);
4319};
4320
4323 char *db, *table;
4325};
4326
4328 MY_BITMAP *bitmap) {
4329 my_bitmap_map *old = bitmap->bitmap;
4330 bitmap->bitmap = table->s->all_set.bitmap; // does not repoint last_word_ptr
4331 return old;
4332}
4333
4334static inline void tmp_restore_column_map(MY_BITMAP *bitmap,
4335 my_bitmap_map *old) {
4336 bitmap->bitmap = old;
4337}
4338
4339/* The following is only needed for debugging */
4340
4342 [[maybe_unused]],
4343 MY_BITMAP *bitmap
4344 [[maybe_unused]]) {
4345#ifndef NDEBUG
4346 return tmp_use_all_columns(table, bitmap);
4347#else
4348 return nullptr;
4349#endif
4350}
4351
4352static inline void dbug_tmp_restore_column_map(MY_BITMAP *bitmap
4353 [[maybe_unused]],
4354 my_bitmap_map *old
4355 [[maybe_unused]]) {
4356#ifndef NDEBUG
4357 tmp_restore_column_map(bitmap, old);
4358#endif
4359}
4360
4361/*
4362 Variant of the above : handle both read and write sets.
4363 Provide for the possibility of the read set being the same as the write set
4364*/
4365static inline void dbug_tmp_use_all_columns(
4366 TABLE *table [[maybe_unused]], my_bitmap_map **save [[maybe_unused]],
4367 MY_BITMAP *read_set [[maybe_unused]],
4368 MY_BITMAP *write_set [[maybe_unused]]) {
4369#ifndef NDEBUG
4370 save[0] = read_set->bitmap;
4371 save[1] = write_set->bitmap;
4372 (void)tmp_use_all_columns(table, read_set);
4373 (void)tmp_use_all_columns(table, write_set);
4374#endif
4375}
4376
4378 MY_BITMAP *read_set [[maybe_unused]], MY_BITMAP *write_set [[maybe_unused]],
4379 my_bitmap_map **old [[maybe_unused]]) {
4380#ifndef NDEBUG
4381 tmp_restore_column_map(read_set, old[0]);
4382 tmp_restore_column_map(write_set, old[1]);
4383#endif
4384}
4385
4386void init_mdl_requests(Table_ref *table_list);
4387
4388/**
4389 Unpacks the definition of a value generator in all its forms: generated
4390 column, default expression or checked constraint.
4391 The function parses the text definition of this expression, resolves its
4392 items and runs validation and calculates the base_columns_map which is used
4393 for tracking the columns the expression depends on.
4394
4395 @param[in] thd Thread handler
4396 @param[in] table Table having the value generator to be unpacked
4397 @param[in,out] val_generator Contains the expression in string format, and,
4398 if successful will be replaced by the parser
4399 with a new one having the unpacked expression.
4400 @param[in] source Source of value generator(a generated column,
4401 a regular column with generated default value or
4402 a check constraint).
4403 @param[in] source_name Name of the source (generated column, a regular
4404 column with generated default value or a check
4405 constraint).
4406 @param[in] field The column the value generator depends on. Can
4407 be null for checked constraints which do not
4408 depend on a single column.
4409 @param[in] is_create_table Indicates that table is opened as part
4410 of CREATE or ALTER and does not yet exist in SE
4411 @param[out] error_reported updated flag for the caller that no other error
4412 messages are to be generated.
4413
4414 @retval true Failure.
4415 @retval false Success.
4416*/
4417
4419 Value_generator **val_generator,
4421 const char *source_name, Field *field,
4422 bool is_create_table, bool *error_reported);
4423
4424/**
4425 Unpack the partition expression. Parse the partition expression
4426 to produce an Item.
4427
4428 @param[in] thd Thread handler
4429 @param[in] outparam Table object
4430 @param[in] share TABLE_SHARE object
4431 @param[in] engine_type Engine type of the partitions.
4432 @param[in] is_create_table Indicates that table is opened as part of
4433 CREATE or ALTER and does not yet exist in SE
4434
4435 @retval true Failure.
4436 @retval false Success.
4437*/
4438
4439bool unpack_partition_info(THD *thd, TABLE *outparam, TABLE_SHARE *share,
4440 handlerton *engine_type, bool is_create_table);
4441
4442int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
4443 uint db_stat, uint prgflag, uint ha_open_flags,
4444 TABLE *outparam, bool is_create_table,
4445 const dd::Table *table_def_param);
4446TABLE_SHARE *alloc_table_share(const char *db, const char *table_name,
4447 const char *key, size_t key_length,
4448 bool open_secondary);
4449void init_tmp_table_share(THD *thd, TABLE_SHARE *share, const char *key,
4450 size_t key_length, const char *table_name,
4451 const char *path, MEM_ROOT *mem_root);
4454Ident_name_check check_db_name(const char *name, size_t length);
4456 bool preserve_lettercase);
4457bool check_column_name(const Name_string &namestring);
4458Ident_name_check check_table_name(const char *name, size_t length);
4459int rename_file_ext(const char *from, const char *to, const char *ext);
4460char *get_field(MEM_ROOT *mem, Field *field);
4461bool get_field(MEM_ROOT *mem, Field *field, class String *res);
4462
4463int closefrm(TABLE *table, bool free_share);
4464void free_blobs(TABLE *table);
4466int set_zone(int nr, int min_zone, int max_zone);
4467void append_unescaped(String *res, const char *pos, size_t length);
4468char *fn_rext(char *name);
4470 const LEX_CSTRING &name);
4471
4472/* performance schema */
4474
4477
4478/* information schema */
4480
4481/* mysql schema name and DD ID */
4483static const uint MYSQL_SCHEMA_DD_ID = 1;
4484
4485/* mysql tablespace name and DD ID */
4487static const uint MYSQL_TABLESPACE_DD_ID = 1;
4488
4489/* replication's tables */
4493
4494inline bool is_infoschema_db(const char *name, size_t len) {
4495 return (
4498}
4499
4500inline bool is_infoschema_db(const char *name) {
4502}
4503
4504inline bool is_perfschema_db(const char *name, size_t len) {
4505 return (PERFORMANCE_SCHEMA_DB_NAME.length == len &&
4507 name));
4508}
4509
4510inline bool is_perfschema_db(const char *name) {
4512 name);
4513}
4514
4515/**
4516 Check if the table belongs to the P_S, excluding setup and threads tables.
4517
4518 @note Performance Schema tables must be accessible independently of the
4519 LOCK TABLE mode. This function is needed to handle the special case
4520 of P_S tables being used under LOCK TABLE mode.
4521*/
4522inline bool belongs_to_p_s(Table_ref *tl) {
4523 return (!strcmp("performance_schema", tl->db) &&
4524 strcmp(tl->table_name, "threads") &&
4525 strstr(tl->table_name, "setup_") == nullptr);
4526}
4527
4528/**
4529 return true if the table was created explicitly.
4530*/
4532 const char *name = table->s->table_name.str;
4534}
4535
4536bool is_simple_order(ORDER *order);
4537
4538uint add_pk_parts_to_sk(KEY *sk, uint sk_n, KEY *pk, uint pk_n,
4539 TABLE_SHARE *share, handler *handler_file,
4540 uint *usable_parts, bool use_extended_sk);
4541void setup_key_part_field(TABLE_SHARE *share, handler *handler_file,
4542 uint primary_key_n, KEY *keyinfo, uint key_n,
4543 uint key_part_n, uint *usable_parts,
4544 bool part_of_key_not_extended);
4545
4546const uchar *get_field_name(const uchar *arg, size_t *length);
4547
4548void repoint_field_to_record(TABLE *table, uchar *old_rec, uchar *new_rec);
4551 uint active_index = MAX_KEY);
4552
4553/**
4554 Check if a Table_ref instance represents a pre-opened temporary table.
4555*/
4556
4557inline bool is_temporary_table(const Table_ref *tl) {
4558 if (tl->is_view() || tl->schema_table) return false;
4559
4560 if (!tl->table) return false;
4561
4562 /*
4563 NOTE: 'table->s' might be NULL for specially constructed TABLE
4564 instances. See SHOW TRIGGERS for example.
4565 */
4566
4567 if (!tl->table->s) return false;
4568
4569 return tl->table->s->tmp_table != NO_TMP_TABLE;
4570}
4571
4572/**
4573 After parsing, a Common Table Expression is accessed through a
4574 Table_ref. This class contains all information about the CTE which the
4575 Table_ref needs.
4576
4577 @note that before and during parsing, the CTE is described by a
4578 PT_common_table_expr.
4579*/
4581 public:
4584 TABLE *clone_tmp_table(THD *thd, Table_ref *tl);
4586 /// Remove one table reference.
4587 void remove_table(Table_ref *tr);
4588 /// Empties the materialized CTE and informs all of its clones.
4589 bool clear_all_references();
4590 /**
4591 All references to this CTE in the statement, except those inside the
4592 query expression defining this CTE.
4593 In other words, all non-recursive references.
4594 */
4596 /// True if it's a recursive CTE
4598 /**
4599 List of all TABLE_LISTSs reading/writing to the tmp table created to
4600 materialize this CTE. Due to shared materialization, only the first one
4601 has a TABLE generated by create_tmp_table(); other ones have a TABLE
4602 generated by open_table_from_share().
4603 */
4605 /// Name of the WITH block. Used only for EXPLAIN FORMAT=tree.
4607};
4608
4609/**
4610 This iterates on those references to a derived table / view / CTE which are
4611 materialized. If a recursive CTE, this includes recursive references.
4612 Upon construction it is passed a non-recursive materialized reference
4613 to the derived table (Table_ref*).
4614 For a CTE it may return more than one reference; for a derived table or a
4615 view, there is only one (as references to a same view are treated as
4616 independent objects).
4617 References are returned as TABLE*.
4618*/
4620 const Table_ref *start; ///< The reference provided in construction.
4621 size_t ref_idx{0}; ///< Current index in cte->tmp_tables
4622 bool m_is_first{true}; ///< True when at first reference in list
4623 public:
4624 explicit Derived_refs_iterator(const Table_ref *start_arg)
4625 : start(start_arg) {}
4628 m_is_first = ref_idx == 0;
4629 // Derived tables and views have a single reference.
4630 if (cte == nullptr) {
4631 return ref_idx++ == 0 ? start->table : nullptr;
4632 }
4633 /*
4634 CTEs may have multiple references. Return the next one, but notice that
4635 some references may have been deleted.
4636 */
4637 while (ref_idx < cte->tmp_tables.size()) {
4638 TABLE *table = cte->tmp_tables[ref_idx++]->table;
4639 if (table != nullptr) return table;
4640 }
4641 return nullptr;
4642 }
4643 void rewind() {
4644 ref_idx = 0;
4645 m_is_first = true;
4646 }
4647 /// @returns true if the last get_next() returned the first element.
4648 bool is_first() const {
4649 // Call after get_next() has been called:
4650 assert(ref_idx > 0);
4651 return m_is_first;
4652 }
4653};
4654
4655/**
4656 RAII class to reset TABLE::autoinc_field_has_explicit_non_null_value after
4657 processing individual row in INSERT or LOAD DATA statements.
4658*/
4660 public:
4662 : m_table(table) {}
4665 }
4666
4667 private:
4669};
4670
4671// Whether we can ask the storage engine for the row ID of the last row read.
4672//
4673// Some operations needs a row ID to operate correctly (i.e. weedout). Normally,
4674// the row ID is provided by the storage engine by calling handler::position().
4675// But there are cases when position() should not be called:
4676//
4677// 1. If we have a const table (rows are fetched during optimization), we
4678// should not call position().
4679// 2. If we have a NULL-complemented row, calling position() would give a
4680// random row ID back, as there has not been any row read.
4681//
4682// Operations that needs the row ID must also check the value of
4683// QEP_TAB::rowid_status to see whether they actually need a row ID.
4684// See QEP_TAB::rowid_status for more details.
4685inline bool can_call_position(const TABLE *table) {
4686 return !table->const_table && !(table->is_nullable() && table->null_row);
4687}
4688
4689//////////////////////////////////////////////////////////////////////////
4690
4691/*
4692 NOTE:
4693 These structures are added to read .frm file in upgrade scenario.
4694
4695 They should not be used any where else in the code.
4696 They will be removed in future release.
4697 Any new code should not be added in this section.
4698*/
4699
4700/**
4701 These members were removed from TABLE_SHARE as they are not used in
4702 in the code. open_binary_frm() uses these members while reading
4703 .frm files.
4704*/
4706 public:
4709 null_field_first(false),
4710 stored_fields(0),
4712 frm_version(0),
4713 fieldnames() {}
4714
4717 uint stored_fields; /* Number of stored fields
4718 (i.e. without generated-only ones) */
4719
4720 enum utype {
4733 EMPTY_VAL, // EMPTY_VAL rather than EMPTY since EMPTY can conflict with
4734 // system headers.
4746 GENERATED_FIELD = 128
4748
4749 /**
4750 For shares representing views File_parser object with view
4751 definition read from .FRM file.
4752 */
4755 TYPELIB fieldnames; /* Pointer to fieldnames */
4756};
4757
4758/**
4759 Create TABLE_SHARE from .frm file.
4760
4761 FRM_context object is used to store the value removed from
4762 TABLE_SHARE. These values are used only for .frm file parsing.
4763
4764 @param[in] thd Thread handle.
4765 @param[in] path Path of the frm file.
4766 @param[out] share TABLE_SHARE to be populated.
4767 @param[out] frm_context FRM_context object.
4768 @param[in] db Database name.
4769 @param[in] table Table name.
4770 @param[in] is_fix_view_cols_and_deps Fix view column data, table
4771 and routine dependency.
4772
4773 @retval 0 ON SUCCESS
4774 @retval -1 ON FAILURE
4775 @retval -2 ON LESS SEVER FAILURE (see read_frm_file)
4776*/
4777int create_table_share_for_upgrade(THD *thd, const char *path,
4778 TABLE_SHARE *share, FRM_context *frm_context,
4779 const char *db, const char *table,
4780 bool is_fix_view_cols_and_deps);
4781//////////////////////////////////////////////////////////////////////////
4782
4783/**
4784 Create a copy of the key_info from TABLE_SHARE object to TABLE object.
4785
4786 Wherever prefix key is present, allocate a new Field object, having its
4787 field_length set to the prefix key length, and point the table's matching
4788 key_part->field to this new Field object.
4789
4790 This ensures that unpack_partition_info() reads the correct prefix length of
4791 partitioned fields
4792
4793 @param table Table for which key_info is to be allocated
4794 @param root MEM_ROOT in which to allocate key_info
4795
4796 @retval false Success
4797 @retval true Failed to allocate memory for table.key_info in root
4798*/
4799
4801
4802#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:148
Per internal table ACL access rules.
Definition: auth_common.h:110
RAII class to reset TABLE::autoinc_field_has_explicit_non_null_value after processing individual row ...
Definition: table.h:4659
Autoinc_field_has_explicit_non_null_value_reset_guard(TABLE *table)
Definition: table.h:4661
~Autoinc_field_has_explicit_non_null_value_reset_guard()
Definition: table.h:4663
Class that represents a single change to a column value in partial update of a JSON column.
Definition: table.h:1352
const char * old_data(const Field *field) const
Get a pointer to the start of the old data to be replaced.
Definition: table.cc:8070
size_t length() const
Definition: table.h:1373
size_t m_length
The size of the portion that is to be replaced.
Definition: table.h:1357
const char * new_data(const Field *field) const
Get a pointer to the start of the replacement data.
Definition: table.cc:8061
Binary_diff(size_t offset, size_t length)
Create a new Binary_diff object.
Definition: table.h:1366
size_t m_offset
The offset of the start of the change.
Definition: table.h:1354
size_t offset() const
Definition: table.h:1370
Definition: sql_bitmap.h:154
Class is used as a BLOB field value storage for intermediate GROUP_CONCAT results.
Definition: table.h:1312
bool truncated_value
Sign that some values were cut during saving into the storage.
Definition: table.h:1319
Blob_mem_storage()
Definition: table.cc:4170
void reset()
Definition: table.h:1325
void set_truncated_value(bool is_truncated_value)
Definition: table.h:1342
MEM_ROOT storage
Definition: table.h:1314
~Blob_mem_storage()
Definition: table.cc:4174
bool is_truncated_value() const
Definition: table.h:1345
char * store(const char *from, size_t length)
Function creates duplicate of 'from' string in 'storage' MEM_ROOT.
Definition: table.h:1339
After parsing, a Common Table Expression is accessed through a Table_ref.
Definition: table.h:4580
Common_table_expr(MEM_ROOT *mem_root)
Definition: table.h:4582
LEX_STRING name
Name of the WITH block. Used only for EXPLAIN FORMAT=tree.
Definition: table.h:4606
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:4597
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:4595
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:4604
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:2891
table_map referenced_by
Definition: table.h:2893
Field_map used_fields
Definition: table.h:2894
uint key_part_count
Definition: table.h:2895
This iterates on those references to a derived table / view / CTE which are materialized.
Definition: table.h:4619
bool is_first() const
Definition: table.h:4648
TABLE * get_next()
Definition: table.h:4626
Derived_refs_iterator(const Table_ref *start_arg)
Definition: table.h:4624
const Table_ref * start
The reference provided in construction.
Definition: table.h:4620
bool m_is_first
True when at first reference in list.
Definition: table.h:4622
size_t ref_idx
Current index in cte->tmp_tables.
Definition: table.h:4621
void rewind()
Definition: table.h:4643
These members were removed from TABLE_SHARE as they are not used in in the code.
Definition: table.h:4705
utype
Definition: table.h:4720
@ CASEUP
Definition: table.h:4725
@ NO
Definition: table.h:4730
@ NONE
Definition: table.h:4721
@ REL
Definition: table.h:4731
@ NEXT_NUMBER
Definition: table.h:4737
@ DATE
Definition: table.h:4722
@ PNR
Definition: table.h:4726
@ BIT_FIELD
Definition: table.h:4739
@ TIMESTAMP_OLD_FIELD
Definition: table.h:4740
@ GENERATED_FIELD
Definition: table.h:4746
@ INTERVAL_FIELD
Definition: table.h:4738
@ TIMESTAMP_UN_FIELD
Definition: table.h:4744
@ NOEMPTY
Definition: table.h:4724
@ CHECK
Definition: table.h:4732
@ YES
Definition: table.h:4729
@ TIMESTAMP_DNUN_FIELD
Definition: table.h:4745
@ BLOB_FIELD
Definition: table.h:4742
@ UNKNOWN_FIELD
Definition: table.h:4735
@ CASEDN
Definition: table.h:4736
@ TIMESTAMP_DN_FIELD
Definition: table.h:4743
@ PGNR
Definition: table.h:4728
@ EMPTY_VAL
Definition: table.h:4733
@ CAPITALIZE
Definition: table.h:4741
@ SHIELD
Definition: table.h:4723
@ BGNR
Definition: table.h:4727
bool null_field_first
Definition: table.h:4716
uchar frm_version
Definition: table.h:4754
handlerton * default_part_db_type
Definition: table.h:4715
TYPELIB fieldnames
Definition: table.h:4755
const File_parser * view_def
For shares representing views File_parser object with view definition read from .FRM file.
Definition: table.h:4753
uint stored_fields
Definition: table.h:4717
FRM_context()
Definition: table.h:4707
Definition: table.h:4261
~Field_iterator_natural_join() override=default
Natural_join_column * column_ref()
Definition: table.h:4276
void next() override
Definition: table.cc:5228
void set(Table_ref *table) override
Definition: table.cc:5222
Natural_join_column * cur_column_ref
Definition: table.h:4263
Field_iterator_natural_join()
Definition: table.h:4266
const char * name() override
Definition: table.h:4271
Item_ident * create_item(THD *thd) override
Definition: table.h:4272
List_iterator_fast< Natural_join_column > column_ref_it
Definition: table.h:4262
bool end_of_fields() override
Definition: table.h:4270
Field * field() override
Definition: table.h:4275
Generic iterator over the fields of an arbitrary table reference.
Definition: table.h:4293
Field_iterator * field_it
Definition: table.h:4298
Field_iterator_view view_field_it
Definition: table.h:4296
Table_ref * table_ref
Definition: table.h:4294
const char * get_table_name()
Definition: table.cc:5301
Field * field() override
Definition: table.h:4315
const char * get_db_name()
Definition: table.cc:5308
Field_iterator_table_ref()
Definition: table.h:4302
void set(Table_ref *table) override
Definition: table.cc:5278
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:5369
Table_ref * first_leaf
Definition: table.h:4294
GRANT_INFO * grant()
Definition: table.cc:5328
void next() override
Definition: table.cc:5287
Field_iterator_table table_field_it
Definition: table.h:4295
Table_ref * last_leaf
Definition: table.h:4294
const char * name() override
Definition: table.h:4308
Natural_join_column * get_natural_column_ref()
Return an existing reference to a column of a natural/using join.
Definition: table.cc:5449
void set_field_iterator()
Definition: table.cc:5235
Item_ident * create_item(THD *thd) override
Definition: table.h:4312
bool end_of_fields() override
Definition: table.h:4305
Field_iterator_natural_join natural_join_it
Definition: table.h:4297
Definition: table.h:4221
Item_ident * create_item(THD *thd) override
Definition: table.cc:5148
const char * name() override
Definition: table.cc:5146
Field ** ptr
Definition: table.h:4222
void set_table(TABLE *table)
Definition: table.h:4227
void next() override
Definition: table.h:4228
Field_iterator_table()
Definition: table.h:4225
bool end_of_fields() override
Definition: table.h:4229
void set(Table_ref *table) override
Definition: table.h:4226
Field * field() override
Definition: table.h:4232
Iterator over the fields of a merged derived table or view.
Definition: table.h:4239
void next() override
Definition: table.h:4246
Item_ident * create_item(THD *thd) override
Definition: table.cc:5166
Item * item()
Definition: table.h:4252
Table_ref * view
Definition: table.h:4241
Field_iterator_view()
Definition: table.h:4244
Field_translator * field_translator()
Definition: table.h:4253
Item ** item_ptr()
Definition: table.h:4250
void set(Table_ref *table) override
Definition: table.cc:5139
Field * field() override
Definition: table.h:4251
Field_translator * array_end
Definition: table.h:4240
const char * name() override
Definition: table.cc:5164
Field_translator * ptr
Definition: table.h:4240
bool end_of_fields() override
Definition: table.h:4247
Definition: table.h:4205
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:3835
Definition: field.h:2391
Definition: field.h:570
Definition: parse_file.h:87
Definition: sql_auth_cache.h:476
Base class to be used by handlers different shares.
Definition: handler.h:4285
Intrusive parameterized list.
Definition: sql_plist.h:75
Definition: sql_lex.h:506
Definition: item.h:4466
Definition: item.h:4195
A wrapper Item that normally returns its parameter, but becomes NULL when processing rows for rollup.
Definition: item_func.h:1753
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:928
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:1225
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:7593
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:432
Storage for name strings.
Definition: item.h:296
Definition: table.h:2655
Item_field * table_field
Definition: table.h:2658
Field_translator * view_field
Definition: table.h:2657
Natural_join_column(Field_translator *field_param, Table_ref *tab)
Definition: table.cc:5068
const char * name()
Definition: table.cc:5091
Table_ref * table_ref
Definition: table.h:2659
bool is_common
Definition: table.h:2667
const char * db_name()
Definition: table.cc:5123
GRANT_INFO * grant()
Definition: table.cc:5137
Field * field()
Definition: table.cc:5110
const char * table_name()
Definition: table.cc:5118
Item_ident * create_item(THD *thd)
Definition: table.cc:5100
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:3837
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:2933
bool m_inserted
True if table is target of INSERT statement.
Definition: table.h:3965
LEX_STRING view_body_utf8
Definition: table.h:4072
bool force_index_group_saved
Definition: table.h:4194
bool view_no_explain
if true, EXPLAIN can't explain view due to insufficient rights.
Definition: table.h:4107
AccessPath * GetCachedMaterializedPath(const AccessPath *table_path)
Search m_materialized_path_cache for a materialization path for 'table_path'.
Definition: table.cc:7673
Common_table_expr * m_common_table_expr
If non-NULL, the CTE which this table is derived from.
Definition: table.h:3779
bool is_base_table() const
Definition: table.h:3221
bool m_is_sj_or_aj_nest
Definition: table.h:3678
const char * get_table_name() const
Returns the name of the table that this Table_ref represents.
Definition: table.h:3505
Key_map keys_in_use_for_group_by_saved
Definition: table.h:4189
List< String > * join_using_fields
Definition: table.h:3703
void set_privileges(Access_bitmask privilege)
Set granted privileges for a table.
Definition: table.h:3626
Item * derived_where_cond
WHERE condition from derived table.
Definition: table.h:3871
char timestamp_buffer[20]
Definition: table.h:4014
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:6453
MY_BITMAP read_set_saved
Definition: table.h:4196
bool is_updatable() const
Return true if table is updatable.
Definition: table.h:3295
ulonglong with_check
WITH CHECK OPTION.
Definition: table.h:3935
bool generate_keys(THD *thd)
Generate keys for a materialized derived table/view.
Definition: table.cc:7112
void set_lock(const Lock_descriptor &descriptor)
Definition: table.h:3655
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:2981
Lock_descriptor m_lock_descriptor
Definition: table.h:3940
bool prepare_replace_filter(THD *thd)
Prepare replace filter for a view (used for REPLACE command)
Definition: table.cc:4791
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:4159
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:6605
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:3126
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:3820
bool is_non_materialized_view_or_derived() const
Return true if this represents a non-materialized view or a derived table.
Definition: table.h:3204
table_map sj_inner_tables
Definition: table.h:3687
LEX * view_query() const
Return the valid LEX object for a view.
Definition: table.h:3401
Table_ref * first_leaf_table()
Return first leaf table of a base table or a view/derived table.
Definition: table.h:3369
table_map m_map
Table map, derived from m_tableno.
Definition: table.h:3670
const Create_col_name_list * derived_column_names() const
Definition: table.h:4131
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:4929
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:3790
Field_translator * field_translation
Array of selected expressions from a derived table or view.
Definition: table.h:3830
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:3952
void set_mv_se_materialized(bool is_mv)
Definition: table.h:3912
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:2953
void set_mv_se_available(bool mv_available)
Definition: table.h:3906
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:3355
ulonglong m_table_ref_version
See comments for TABLE_SHARE::get_table_ref_version()
Definition: table.h:4178
Table_ref * outer_join_nest() const
Returns the outer join nest that this Table_ref belongs to, if any.
Definition: table.h:3539
bool has_tablesample() const
Definition: table.h:3884
double sampling_percentage_val
Definition: table.h:3768
void set_updatable()
Set table as updatable. (per default, a table is non-updatable)
Definition: table.h:3298
bool prepare_security(THD *thd)
Prepare security context for a view.
Definition: table.cc:5045
void set_deleted()
Set table and all referencing views as being deleted from.
Definition: table.h:3328
bool check_option_processed
true <=> VIEW CHECK OPTION condition is processed (also for prep. stmts)
Definition: table.h:4009
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:4857
bool is_external() const
Is this table only available in an external storage engine?
Definition: table.cc:7520
void set_derived_query_expression(Query_expression *query_expr)
Set the query expression of a derived table or view.
Definition: table.h:3410
Query_block * schema_query_block
Definition: table.h:3803
ST_SCHEMA_TABLE * schema_table
Definition: table.h:3802
enum_table_ref_type m_table_ref_type
See comments for set_metadata_id()
Definition: table.h:4176
ulonglong updatable_view
VIEW can be updated.
Definition: table.h:3902
table_map map() const
Return table map derived from table number.
Definition: table.h:4122
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:3677
bool cacheable_table
stop PS caching
Definition: table.h:4000
bool is_derived_unfinished_materialization() const
Definition: table.cc:7510
void set_derived_column_names(const Create_col_name_list *d)
Definition: table.h:4134
Table_ref * embedding
The nested join containing this table reference.
Definition: table.h:3996
bool is_placeholder() const
Definition: table.h:3247
bool schema_table_filled
Definition: table.h:4102
void set_updated()
Set table and all referencing views as being updated.
Definition: table.h:3310
void set_uses_materialization()
Set table to be materialized.
Definition: table.h:3287
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:3070
Field_translator * field_translation_end
pointer to element after last one in translation table above
Definition: table.h:3833
Security_context * find_view_security_context(THD *thd)
Find security context of current view.
Definition: table.cc:5014
Key_map merge_keys_saved
Definition: table.h:4187
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:3998
bool is_mergeable() const
Return true if view or derived table and can be merged.
Definition: table.cc:6585
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:3817
mem_root_deque< Table_ref * > * view_tables
Definition: table.h:3845
uint m_tableno
The members below must be kept aligned so that (1 << m_tableno) == m_map.
Definition: table.h:3669
void print(const THD *thd, String *str, enum_query_type query_type) const
Produce a textual identification of this object.
Definition: sql_lex.cc:2946
Table_ref * referencing_view
Definition: table.h:3852
void set_fulltext_searched()
Set table as full-text search (default is not fulltext searched)
Definition: table.h:3334
Table_ref * correspondent_table
Definition: table.h:3737
bool is_view() const
Return true if this represents a named view.
Definition: table.h:3195
List< Natural_join_column > * join_columns
Definition: table.h:3708
int view_check_option(THD *thd) const
Evaluate the check option of a view.
Definition: table.cc:4834
const char * get_db_name() const
Returns the name of the database that the referenced table belongs to.
Definition: table.h:3497
bool updating
True for tables and views being changed in a data change statement.
Definition: table.h:3977
bool m_insertable
True if VIEW/TABLE is insertable, based on analysis of query (SQL rules).
Definition: table.h:3961
bool is_mv_se_available() const
Definition: table.h:3904
void set_readonly()
Set table as readonly, ie it is neither updatable, insertable nor deletable during this statement.
Definition: table.h:3346
bool is_updated() const
Return true if table is being updated.
Definition: table.h:3307
bool m_updatable
True if VIEW/TABLE is updatable, based on analysis of query (SQL rules).
Definition: table.h:3959
void set_tableno(uint tableno)
Set table number.
Definition: table.h:4113
enum_view_algorithm effective_algorithm
The view algorithm that is actually used, if this is a view.
Definition: table.h:3939
bool is_inner_table_of_outer_join() const
Return true if this table is an inner table of some outer join.
Definition: table.h:3554
Table_ref * belong_to_view
Definition: table.h:3847
LEX * view
Definition: table.h:3813
bool set_insert_values(MEM_ROOT *mem_root)
Allocate a buffer for inserted column values.
Definition: table.cc:4878
MY_BITMAP read_set_internal_saved
Definition: table.h:4198
bool is_derived() const
Return true if this represents a derived table (an unnamed view)
Definition: table.h:3198
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:4168
const Table_ref * updatable_base_table() const
Return the base table entry of an updatable table.
Definition: table.h:3567
enum_view_type view_type
If view, then type of a view.
Definition: table.h:4078
void restore_properties()
Restore persistent properties into TABLE from Table_ref.
Definition: table.cc:4562
Table_ref ** prev_global
Definition: table.h:3641
Query_block * query_block
Definition: table.h:3810
const Table_ref * top_table() const
Return the outermost view this table belongs to, or itself.
Definition: table.h:3176
void set_merged()
Set table to be merged.
Definition: table.h:3276
void set_insertable()
Set table as insertable-into. (per default, a table is not insertable)
Definition: table.h:3304
const LEX_CSTRING & get_mv_se_name() const
Definition: table.h:3914
uint tableno() const
Return table number.
Definition: table.h:4119
size_t db_length
Definition: table.h:3954
List< Index_hint > * index_hints
Definition: table.h:3721
LEX_STRING select_stmt
text of (CREATE/SELECT) statement
Definition: table.h:3874
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:3086
bool is_natural_join
Definition: table.h:3701
Query_expression * derived
This field is set to non-null for derived tables and views.
Definition: table.h:3776
MY_BITMAP lock_partitions_saved
Definition: table.h:4195
bool is_fulltext_searched() const
Returns true if a MATCH function references this table.
Definition: table.h:3337
Table_ref * natural_join
Definition: table.h:3695
bool outer_join
True if right argument of LEFT JOIN; false in other cases (i.e.
Definition: table.h:3949
Table_ref * parent_l
Definition: table.h:3854
bool is_table_function() const
Return true if this represents a table function.
Definition: table.h:3209
bool m_updated
True if table is target of UPDATE statement, or updated in IODKU stmt.
Definition: table.h:3963
bool optimized_away
true <=> this table is a const one and was optimized away.
Definition: table.h:4162
bool is_insertable() const
Return true if table is insertable-into.
Definition: table.h:3301
bool is_alias
true if an alias for this table was specified in the SQL.
Definition: table.h:4039
Table_ref()=default
bool straight
Definition: table.h:3970
int fetch_number_of_rows(ha_rows fallback_estimate=PLACEHOLDER_TABLE_ROW_ESTIMATE)
Retrieve number of rows in the table.
Definition: table.cc:6651
void set_join_cond(Item *val)
Definition: table.h:3107
bool is_system_view
Definition: table.h:4075
uint8 trg_event_map
Indicates what triggers we need to pre-load for this Table_ref when opening an associated TABLE.
Definition: table.h:4101
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:4945
bool schema_table_reformed
Definition: table.h:3808
bool is_sj_or_aj_nest() const
Definition: table.h:3128
Key_map keys_in_use_for_query_saved
Definition: table.h:4188
MY_BITMAP write_set_saved
Definition: table.h:4197
List< String > * partition_names
Definition: table.h:4110
bool force_index_order_saved
Definition: table.h:4193
Query_expression * derived_query_expression() const
Return the query expression of a derived table or view.
Definition: table.h:3415
bool ignore_leaves
preload only non-leaf nodes (IS THIS USED???)
Definition: table.h:3979
Table_ref * next_leaf
Definition: table.h:3870
bool is_leaf_for_name_resolution() const
Test if this is a leaf with respect to name resolution.
Definition: table.cc:4906
Table_ref * next_local
Definition: table.h:3639
Table_ref * merge_underlying_list
Definition: table.h:3839
LEX_CSTRING target_tablespace_name
Definition: table.h:3647
dd::enum_table_type required_type
Definition: table.h:4013
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:4434
bool m_was_scalar_subquery
If true, this table is a derived (materialized) table which was created from a scalar subquery,...
Definition: table.h:4049
bool is_recursive_reference() const
Definition: table.h:3218
GRANT_INFO grant
Definition: table.h:3943
Table_ref * top_table()
Definition: table.h:3180
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:3459
void set_sj_or_aj_nest()
Makes the next a semi/antijoin nest.
Definition: table.h:3130
bool validate_tablesample_clause(THD *thd)
Definition: table.cc:7534
void set_table_ref_id(enum_table_ref_type table_ref_type_arg, ulonglong table_ref_version_arg)
Definition: table.h:3474
void set_tablesample(tablesample_type sampling_type_arg, Item *sampling_percentage_arg)
Definition: table.h:3878
bool is_internal() const
Definition: table.h:3237
void set_mv_se_name(const char *engine_name)
Definition: table.h:3916
bool prepare_view_security_context(THD *thd)
Load security context information for this view.
Definition: table.cc:4969
const Lock_descriptor & lock_descriptor() const
Definition: table.h:3659
bool nullable_saved
Definition: table.h:4191
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:3994
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:2998
const char * db
Definition: table.h:3642
Security_context * security_ctx
Definition: table.h:3859
bool is_inserted() const
Return true if table is being inserted into.
Definition: table.h:3316
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:3025
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:3799
Security_context * view_sctx
Definition: table.h:3864
bool merge_where(THD *thd)
Merge WHERE condition of view or derived table into outer query.
Definition: table.cc:4598
ulonglong view_suid
view is suid (true by default)
Definition: table.h:3934
ulonglong algorithm
The declared algorithm, if this is a view.
Definition: table.h:3933
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:7515
List< Derived_key > derived_key_list
Definition: table.h:4094
bool prepare_check_option(THD *thd, bool is_cascaded=false)
Prepare check option for a view.
Definition: table.cc:4732
void set_common_table_expr(Common_table_expr *c)
Definition: table.h:4129
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:3641
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:3876
bool replace_filter_processed
true <=> Filter condition is processed
Definition: table.h:4011
tablesample_type sampling_type
Sampling information.
Definition: table.h:3765
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:3010
mysql::binlog::event::Table_id table_id
Definition: table.h:3724
enum_open_type open_type
Specifies which kind of table should be open for this element of table list.
Definition: table.h:4005
@ OPEN_IF_EXISTS
Definition: table.h:4028
@ OPEN_STUB
Definition: table.h:4035
@ OPEN_FOR_CREATE
Definition: table.h:4033
Item * m_join_cond_optim
Optimized copy of m_join_cond (valid for one single execution).
Definition: table.h:4156
table_map join_cond_dep_tables
The outer tables that an outer join's join condition depends on.
Definition: table.h:3986
Table_ref * updatable_base_table()
Definition: table.h:3581
Item * replace_filter
Filter for REPLACE command.
Definition: table.h:3873
bool merge_underlying_tables(Query_block *select)
Merge tables from a query block into a nested join structure.
Definition: table.cc:4470
Common_table_expr * common_table_expr() const
If non-NULL, the CTE which this table is derived from.
Definition: table.h:4128
bool internal_tmp_table
Definition: table.h:4037
LEX_STRING source
source of CREATE VIEW
Definition: table.h:3875
bool update_sampling_percentage()
Definition: table.cc:7566
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:3041
LEX_CSTRING view_connection_cl_name
Definition: table.h:4066
bool has_stored_program() const
Definition: table.cc:6600
LEX_CSTRING view_client_cs_name
Definition: table.h:4065
bool save_properties()
Save persistent properties from TABLE into Table_ref.
Definition: table.cc:4531
bool is_join_columns_complete
Definition: table.h:3710
bool m_is_recursive_reference
If a recursive reference inside the definition of a CTE.
Definition: table.h:4172
bool is_deleted() const
Return true if table is being deleted from.
Definition: table.h:3325
bool prelocking_placeholder
Definition: table.h:4019
LEX_USER definer
definer of view
Definition: table.h:3877
bool is_json_duality_view() const
If view, then check if view is JSON duality view.
Definition: table.h:4144
const char * table_name
Definition: table.h:3642
jdv::Content_tree_node * jdv_content_tree
If json duality view, then represents duality view content tree node.
Definition: table.h:4081
Item * sampling_percentage
Definition: table.h:3744
uint shared
Definition: table.h:3953
Item ** join_cond_optim_ref()
Definition: table.h:3121
bool create_field_translation(THD *thd)
Create field translation for merged derived table/view.
Definition: table.cc:4635
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:6398
Opt_hints_table * opt_hints_table
Table level optimizer hints for this table.
Definition: table.h:3651
tablesample_type get_sampling_type() const
Definition: table.h:3894
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:3380
View_creation_ctx * view_creation_ctx
Definition: table.h:4053
char * option
Definition: table.h:3648
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:7681
double get_sampling_percentage() const
Definition: table.cc:7582
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:3056
TABLE * table
Definition: table.h:3722
void set_view_query(LEX *lex)
Set the LEX object of a view (will also define this as a view).
Definition: table.h:3398
void set_inserted()
Set table and all referencing views as being inserted into.
Definition: table.h:3319
bool update_derived_keys(THD *, Field *, Item **, uint, bool *)
Update derived table's list of possible keys.
Definition: table.cc:6975
uint query_block_id() const
If a derived table, returns query block id of first underlying query block.
Definition: table.cc:6393
bool m_fulltext_searched
True if fulltext searched.
Definition: table.h:3968
Item * join_cond() const
Definition: table.h:3106
Table_ref * next_name_resolution_table
Definition: table.h:3719
bool is_view_or_derived() const
Return true if this represents a named view or a derived table.
Definition: table.h:3201
bool is_merged() const
Return true if this is a derived table or view that is merged.
Definition: table.h:3273
void set_join_cond_optim(Item *cond)
Definition: table.h:3113
table_map dep_tables
The set of tables in the query block that this table depends on.
Definition: table.h:3984
size_t table_name_length
Definition: table.h:3955
bool uses_materialization() const
Return true if this is a materializable derived table/view.
Definition: table.h:3282
void add_join_natural(Table_ref *b)
Mark that there is a NATURAL JOIN or JOIN ... USING between two tables.
Definition: table.h:3616
bool is_sj_nest() const
Definition: table.h:3124
bool contain_auto_increment
Definition: table.h:4007
bool m_mv_se_available
m_mv_se_available indicates that the current Table_ref is using the materialized view.
Definition: table.h:3826
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:4186
bool is_mv_se_materialized() const
Definition: table.h:3910
uint leaf_tables_count() const
Return no. of base tables a merged view or derived table is defined over.
Definition: table.cc:6619
const char * alias
Definition: table.h:3642
Item * join_cond_optim() const
Definition: table.h:3112
bool set_recursive_reference()
Definition: table.cc:7503
Opt_hints_qb * opt_hints_qb
Definition: table.h:3653
bool is_dd_ctx_table
Definition: table.h:4089
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:2941
bool is_fqtn
true if the table is referred to in the statement using a fully qualified name (<db_name>.
Definition: table.h:4043
void set_mv_se_name(const LEX_CSTRING &engine_name)
Definition: table.h:3921
bool force_index_saved
Definition: table.h:4192
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:2944
Item ** join_cond_ref()
Definition: table.h:3105
void ClearMaterializedPathCache()
Empty m_materialized_path_cache.
Definition: table.h:3761
Key_map keys_in_use_for_order_by_saved
Definition: table.h:4190
Table_function * table_function
Definition: table.h:3742
bool m_deleted
True if table is target of DELETE statement, or deleted in REPLACE stmt.
Definition: table.h:3967
MDL_request mdl_request
Definition: table.h:4104
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:2969
Item * check_option
WITH CHECK OPTION condition.
Definition: table.h:3872
Query_result_union * derived_result
Definition: table.h:3729
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:3470
void reset()
Reset table.
Definition: table.cc:4485
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:478
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:3975
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:3979
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:4741
enum handler::@60 inited
@ NONE
Definition: handler.h:4828
Histogram base class.
Definition: histogram.h:314
Definition: content_tree.h:118
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:111
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:48
constexpr const LEX_CSTRING NULL_CSTR
Definition: lex_string.h:47
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:1574
#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:553
ulong key_part_map
Definition: my_base.h:1084
my_off_t ha_rows
Definition: my_base.h:1217
#define HA_POS_ERROR
Definition: my_base.h:1219
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:1078
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:43
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:468
enum_stats_auto_recalc
Definition: handler.h:3338
row_type
Definition: handler.h:691
void free_blobs(TABLE *table)
Definition: table.cc:3439
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:7438
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:2876
@ OT_TEMPORARY_OR_BASE
Definition: table.h:2877
@ OT_TEMPORARY_ONLY
Definition: table.h:2878
@ OT_BASE_ONLY
Definition: table.h:2879
static my_bitmap_map * tmp_use_all_columns(TABLE *table, MY_BITMAP *bitmap)
Definition: table.h:4327
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:2595
static void tmp_restore_column_map(MY_BITMAP *bitmap, my_bitmap_map *old)
Definition: table.h:4334
static void empty_record(TABLE *table)
Definition: table.h:2551
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:8400
static my_bitmap_map * dbug_tmp_use_all_columns(TABLE *table, MY_BITMAP *bitmap)
Definition: table.h:4341
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:7281
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:2865
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:2820
bool is_user_table(TABLE *table)
return true if the table was created explicitly.
Definition: table.h:4531
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:8387
void update_create_info_from_table(HA_CREATE_INFO *info, TABLE *form)
Definition: table.cc:3612
enum_view_algorithm
Strategy for how to process a view or derived table (merge or materialization)
Definition: table.h:2607
@ VIEW_ALGORITHM_TEMPTABLE
Definition: table.h:2609
@ VIEW_ALGORITHM_UNDEFINED
Definition: table.h:2608
@ VIEW_ALGORITHM_MERGE
Definition: table.h:2610
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:4494
enum_view_type
Definition: table.h:2613
bool update_generated_read_fields(uchar *buf, TABLE *table, uint active_index=MAX_KEY)
Evaluate necessary virtual generated columns.
Definition: table.cc:7376
bool is_perfschema_db(const char *name, size_t len)
Definition: table.h:4504
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:3740
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:3369
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:4557
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:3806
#define STATUS_DELETED
Reserved for use by multi-table delete. Means the row has been deleted.
Definition: table.h:1423
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:4685
#define STATUS_UPDATED
Reserved for use by multi-table update. Means the row has been updated.
Definition: table.h:1416
#define tmp_file_prefix
Prefix for tmp tables.
Definition: table.h:169
Lex_acl_attrib_udyn
This is generic enum.
Definition: table.h:2684
static const uint MYSQL_SCHEMA_DD_ID
Definition: table.h:4483
Bitmap< MAX_FIELDS > Field_map
Definition: table.h:1429
index_hint_type
Definition: table.h:1426
@ INDEX_HINT_FORCE
Definition: table.h:1426
@ INDEX_HINT_IGNORE
Definition: table.h:1426
@ INDEX_HINT_USE
Definition: table.h:1426
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:8293
void append_unescaped(String *res, const char *pos, size_t length)
Store an SQL quoted string.
Definition: table.cc:3575
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:3779
char * get_field(MEM_ROOT *mem, Field *field)
Allocate string field in MEM_ROOT and return it as NULL-terminated string.
Definition: table.cc:3674
LEX_CSTRING MYSQL_TABLESPACE_NAME
Definition: table.cc:147
static const uint MYSQL_TABLESPACE_DD_ID
Definition: table.h:4487
#define STATUS_NOT_STARTED
Flags for TABLE::m_status (maximum 8 bits).
Definition: table.h:1408
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:6573
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:4377
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:7296
#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:3460
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:2728
#define STATUS_NOT_FOUND
Means we were searching for a row and didn't find it.
Definition: table.h:1414
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:2905
LEX_CSTRING PERFORMANCE_SCHEMA_DB_NAME
Definition: table.cc:140
#define STATUS_NULL_ROW
Means that table->null_row is set.
Definition: table.h:1421
ulong refresh_version
Definition: mysqld.cc:1397
static void dbug_tmp_restore_column_map(MY_BITMAP *bitmap, my_bitmap_map *old)
Definition: table.h:4352
#define restore_record(A, B)
Definition: table.h:164
int set_zone(int nr, int min_zone, int max_zone)
Definition: table.cc:3557
Ident_name_check check_db_name(const char *name, size_t length)
Check if database name is valid.
Definition: table.cc:3704
int rename_file_ext(const char *from, const char *to, const char *ext)
Definition: table.cc:3631
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:4522
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:8412
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:2856
Struct that describes an expression selected from a derived table or view.
Definition: table.h:2639
Item * item
Points to an item that represents the expression.
Definition: table.h:2644
const char * name
Name of selected expression.
Definition: table.h:2646
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:3347
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:707
char name[NAME_CHAR_LEN]
Definition: table.h:708
Definition: table.h:2756
bool use_default_password_lifetime
Definition: table.h:2759
bool update_password_expired_column
Definition: table.h:2758
bool update_failed_login_attempts
Definition: table.h:2770
uint32 password_reuse_interval
Definition: table.h:2766
bool use_default_password_reuse_interval
Definition: table.h:2767
Lex_acl_attrib_udyn update_password_require_current
Definition: table.h:2774
uint failed_login_attempts
Definition: table.h:2769
bool update_password_reuse_interval
Definition: table.h:2768
bool update_password_history
Definition: table.h:2765
int password_lock_time
Definition: table.h:2771
bool update_account_locked_column
Definition: table.h:2761
bool update_password_expired_fields
Definition: table.h:2757
bool use_default_password_history
Definition: table.h:2764
bool update_password_lock_time
Definition: table.h:2772
bool account_locked
Definition: table.h:2762
void cleanup()
Definition: table.h:2775
uint16 expire_after_days
Definition: table.h:2760
uint32 password_history_length
Definition: table.h:2763
Definition: table.h:2691
bool modify_factor
Definition: table.h:2713
LEX_CSTRING generated_password
Definition: table.h:2694
LEX_CSTRING auth
Definition: table.h:2693
bool uses_identified_with_clause
Definition: table.h:2706
bool uses_authentication_string_clause
Definition: table.h:2705
bool finish_registration
Definition: table.h:2726
LEX_CSTRING plugin
Definition: table.h:2692
LEX_CSTRING client_plugin
Definition: table.h:2696
void copy(LEX_MFA *m, MEM_ROOT *alloc)
Definition: table.cc:7693
bool uses_identified_by_clause
Definition: table.h:2704
bool drop_factor
Definition: table.h:2715
bool init_registration
Definition: table.h:2724
uint nth_factor
Definition: table.h:2697
bool requires_registration
Definition: table.h:2720
LEX_CSTRING challenge_response
Definition: table.h:2695
bool add_factor
Definition: table.h:2711
bool has_password_generator
Definition: table.h:2707
LEX_MFA()
Definition: table.h:2728
bool unregister
Definition: table.h:2722
void reset()
Definition: table.h:2729
bool passwordless
Definition: table.h:2709
Definition: table.h:2800
bool retain_current_password
Definition: table.h:2805
LEX_ALTER alter_status
Definition: table.h:2807
List< LEX_MFA > mfa_list
Definition: table.h:2810
bool uses_replace_clause
Definition: table.h:2804
LEX_CSTRING host
Definition: table.h:2802
static LEX_USER * alloc(THD *thd)
Definition: table.cc:7729
void init()
Definition: table.h:2813
LEX_CSTRING current_auth
Definition: table.h:2803
bool with_initial_auth
Definition: table.h:2811
LEX_CSTRING user
Definition: table.h:2801
LEX_MFA first_factor_auth_info
Definition: table.h:2809
LEX_USER()
Definition: table.h:2840
bool discard_old_password
Definition: table.h:2806
bool add_mfa_identifications(LEX_MFA *factor2, LEX_MFA *factor3=nullptr)
Definition: table.cc:7736
The LEX object currently serves three different purposes:
Definition: sql_lex.h:3999
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:413
Definition: table.h:4321
uint32 locked
Definition: table.h:4324
char * table
Definition: table.h:4323
OPEN_TABLE_LIST * next
Definition: table.h:4322
uint32 in_use
Definition: table.h:4324
char * db
Definition: table.h:4323
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:7784
Definition: table.h:2560
int value
Definition: table.h:2578
const char * field_name
This is used as column name.
Definition: table.h:2564
enum_field_types field_type
This denotes data type for the column.
Definition: table.h:2577
const char * old_name
Definition: table.h:2588
uint open_method
Definition: table.h:2589
uint field_flags
This is used to set column attributes.
Definition: table.h:2587
uint field_length
For string-type columns, this is the maximum number of characters.
Definition: table.h:2571
Definition: table.h:2592
int(* process_table)(THD *thd, Table_ref *tables, TABLE *table, bool res, LEX_CSTRING db_name, LEX_CSTRING table_name)
Definition: table.h:2599
int(* fill_table)(THD *thd, Table_ref *tables, Item *cond)
Definition: table.h:2596
ST_FIELD_INFO * fields_info
Definition: table.h:2594
int(* old_format)(THD *thd, ST_SCHEMA_TABLE *schema_table)
Definition: table.h:2598
bool hidden
Definition: table.h:2601
const char * table_name
Definition: table.h:2593
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:716
ulong stored_rec_length
Definition: table.h:817
uint next_number_index
Definition: table.h:935
Key_map keys_in_use
The set of indexes that are not disabled for this table.
Definition: table.h:808
TABLE_SHARE_FOREIGN_KEY_PARENT_INFO * foreign_key_parent
Definition: table.h:1056
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:3993
Table_cache_element ** cache_element
Array of table_cache_instances pointers to elements of table caches respresenting this table in each ...
Definition: table.h:761
MEM_ROOT mem_root
Definition: table.h:742
bool is_primary_engine() const
Does this TABLE_SHARE represent a table in a primary storage engine?
Definition: table.h:1274
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:1054
bool is_secondary_engine() const
Does this TABLE_SHARE represent a table in a secondary storage engine?
Definition: table.h:1277
uint stats_sample_pages
Definition: table.h:854
bool is_mv_se_materialized
Materialized view, materialized directly by a storage engine.
Definition: table.h:949
handlerton * db_type() const
Definition: table.h:822
Table_histograms_collection * m_histograms
Definition: table.h:737
LEX_STRING comment
Definition: table.h:770
Handler_share * ha_share
Main handler's share.
Definition: table.h:1019
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:747
enum_stats_auto_recalc stats_auto_recalc
Definition: table.h:857
const char * tablespace
Definition: table.h:969
partition_info * m_part_info
Partition meta data.
Definition: table.h:989
LEX_STRING compress
Definition: table.h:771
const TABLE_FIELD_DEF * table_field_def_cache
Cache the checked structure of this table.
Definition: table.h:1016
uint column_bitmap_size
Definition: table.h:939
ulong mysql_version
Definition: table.h:815
uint max_tmp_key_parts
For materialized derived tables: allocated size of base_key_parts array of all TABLE objects.
Definition: table.h:895
uint total_key_length
Definition: table.h:869
TYPELIB keynames
Definition: table.h:749
uchar * default_values
Definition: table.h:769
LEX_STRING encrypt_type
Definition: table.h:772
PSI_table_share * m_psi
Instrumentation for this table share.
Definition: table.h:1022
bool is_missing_primary_key() const
Determine if the table is missing a PRIMARY KEY.
Definition: table.h:1221
bool db_low_byte_first
Definition: table.h:945
Schema_read_only
Schema's read only mode - ON (true) or OFF (false).
Definition: table.h:1080
LEX_CSTRING table_cache_key
Definition: table.h:793
unsigned int m_ref_count
How many TABLE objects use this TABLE_SHARE.
Definition: table.h:1292
unsigned long version() const
Returns the version of this TABLE_SHARE.
Definition: table.h:1131
uint max_unique_length
Definition: table.h:868
tmp_table_type tmp_table
Definition: table.h:836
unsigned long m_version
TABLE_SHARE version, if changed the TABLE_SHARE must be reopened.
Definition: table.h:1299
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:6117
int cached_row_logging_check
Definition: table.h:959
ulong reclength
Definition: table.h:816
uint varchar_fields
Definition: table.h:881
uint next_number_keypart
Definition: table.h:937
bool secondary_load
Secondary engine load status.
Definition: table.h:777
uint tmp_handler_count
Only for internal temporary tables.
Definition: table.h:843
Field ** field
Definition: table.h:764
ulong avg_row_length
Definition: table.h:814
plugin_ref db_plugin
Definition: table.h:821
LEX_CSTRING table_name
Definition: table.h:795
const dd::View * view_object
View object holding view definition read from DD.
Definition: table.h:1034
uint db_create_options
Bitmap with flags representing some of table options/attributes.
Definition: table.h:921
uint rec_buff_length
Definition: table.h:862
uint blob_fields
Definition: table.h:880
uint max_tmp_keys
For materialized derived tables: allocated size of key_info array.
Definition: table.h:890
LEX_STRING connect_string
Definition: table.h:798
Field ** found_next_number_field
Definition: table.h:765
ha_rows min_rows
Definition: table.h:813
bool is_referenced_by_foreign_key() const
Returns whether this table is referenced by a foreign key.
Definition: table.h:1288
uint foreign_keys
Arrays with descriptions of foreign keys in which this table participates as child or parent.
Definition: table.h:1053
Schema_read_only schema_read_only
Definition: table.h:1081
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:4087
uint fields
Definition: table.h:861
uint tmp_open_count
Only for internal temporary tables.
Definition: table.h:849
Key_name * key_names
Array of names for generated keys, used for materialized derived tables.
Definition: table.h:900
Key_map keys_for_keyread
Definition: table.h:812
char * partition_info_str
Storing the full partitioning clause (PARTITION BY ...) which is used when creating new partition_inf...
Definition: table.h:1003
TABLE_SHARE(unsigned long version, bool secondary)
Create a new TABLE_SHARE with the given version number.
Definition: table.h:725
uint null_bytes
Definition: table.h:860
bool system
Definition: table.h:944
bool is_view
Definition: table.h:947
ulonglong get_table_ref_version() const
Return a table metadata version.
Definition: table.cc:4160
uint rowid_field_offset
Definition: table.h:931
uint max_key_length
Definition: table.h:867
ulong * base_rec_per_key
Records per key array, used for materialized derived tables.
Definition: table.h:906
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:1283
List< Trigger > * triggers
List of trigger descriptions for the table loaded from the data-dictionary.
Definition: table.h:1070
bool is_distinct
Whether this is a temporary table that already has a UNIQUE index (removing duplicate rows on insert)...
Definition: table.h:877
dd::Table * tmp_table_def
Data-dictionary object describing explicit temporary table represented by this share.
Definition: table.h:1042
TABLE_SHARE * next
Definition: table.h:752
LEX_STRING path
Definition: table.h:796
bool m_open_in_progress
Definition: table.h:950
uint next_number_key_offset
Definition: table.h:936
uint keys
Definition: table.h:863
Key_map visible_indexes
The set of visible and enabled indexes for this table.
Definition: table.h:811
uint foreign_key_parents
Definition: table.h:1055
bool has_old_version() const
Is this table share being expelled from the table definition cache?
Definition: table.h:1141
mysql_mutex_t LOCK_ha_data
Definition: table.h:751
Wait_for_flush_list m_flush_tickets
List of tickets representing threads waiting for the share to be flushed.
Definition: table.h:1027
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:943
MY_BITMAP all_set
Definition: table.h:782
unsigned int ref_count() const
How many TABLE objects use this TABLE_SHARE.
Definition: table.h:1247
uint last_null_bit_pos
Definition: table.h:860
TABLE_CATEGORY table_category
Category of this table.
Definition: table.h:740
bool error
Definition: table.h:938
unsigned int decrement_ref_count()
Decrement the reference count by one.
Definition: table.h:1266
const CHARSET_INFO * table_charset
Definition: table.h:779
unsigned int increment_ref_count()
Increment the reference count by one.
Definition: table.h:1256
mysql::binlog::event::Table_id table_map_id
Definition: table.h:951
bool auto_partitioned
Filled in when reading from frm.
Definition: table.h:996
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:1123
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:1097
ulonglong autoextend_size
Definition: table.h:819
uint primary_key
Definition: table.h:934
ha_storage_media default_storage_media
Definition: table.h:966
rec_per_key_t * base_rec_per_key_float
Records per key array, float rep., used for materialized derived tables.
Definition: table.h:912
bool m_secondary_engine
Does this TABLE_SHARE represent a table in a secondary storage engine?
Definition: table.h:1303
std::uint32_t key_block_size
Definition: table.h:853
bool crashed
Definition: table.h:946
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:797
uint key_parts
Definition: table.h:864
uint vfields
Number of generated fields.
Definition: table.h:941
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:1149
uint db_options_in_use
Bitmap with flags representing some of table options/attributes which are in use by storage engine.
Definition: table.h:930
ha_rows max_rows
Definition: table.h:813
ulonglong get_table_def_version() const
Definition: table.h:1128
TYPELIB * intervals
Definition: table.h:750
uint first_unused_tmp_key
For materialized derived tables;.
Definition: table.h:886
TABLE_SHARE ** prev
Definition: table.h:752
uint null_fields
Definition: table.h:879
LEX_CSTRING secondary_engine
Secondary storage engine.
Definition: table.h:775
KEY * key_info
Definition: table.h:766
uint partition_info_str_len
Definition: table.h:1004
LEX_CSTRING db
Definition: table.h:794
LEX_CSTRING engine_attribute
Definition: table.h:800
LEX_CSTRING secondary_engine_attribute
Definition: table.h:801
uint * blob_field
Definition: table.h:767
enum row_type real_row_type
Real row format used for the table by the storage engine.
Definition: table.h:835
TABLE_SHARE()=default
Sql_check_constraint_share_list * check_constraint_share_list
Definition: table.h:1059
Query_block * owner_of_possible_tmp_keys
For materialized derived tables;.
Definition: table.h:1045
Definition: table.h:1435
void mark_columns_used_by_index(uint index)
Definition: table.cc:5571
bool materialized
For a materializable derived or SJ table: true if has been materialized.
Definition: table.h:1934
void mark_generated_columns(bool is_update)
Update the write/read_set for generated columns when doing update and insert operation.
Definition: table.cc:6303
class QEP_TAB * qep_tab
Definition: table.h:1938
bool m_invalid_dict
This TABLE object is invalid and cannot be reused.
Definition: table.h:1914
query_id_t query_id
Definition: table.h:1786
bool force_index_order
Flag set when the statement contains FORCE INDEX FOR ORDER BY See Table_ref::process_index_hints().
Definition: table.h:1848
void column_bitmaps_set_no_signal(MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg)
Definition: table.h:2017
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:5739
const char * alias
alias or table name
Definition: table.h:1687
partition_info * part_info
Definition: table.h:1973
uint8 m_status
Definition: table.h:1826
bool key_read
If set, the optimizer has found that row retrieval should access index tree only.
Definition: table.h:1863
bool no_replicate
If set, indicate that the table is not replicated by the server.
Definition: table.h:1872
class JOIN_TAB * join_tab
Definition: table.h:1937
void set_no_row()
Set status for row buffer: contains no row.
Definition: table.h:2150
const BytesPerTableRow * m_bytes_per_row
Estimate for the amount of data to read per row fetched from this table.
Definition: table.h:1984
void mark_columns_needed_for_insert(THD *thd)
Definition: table.cc:6247
Field ** vfield
Pointer to generated columns.
Definition: table.h:1556
void clear_column_bitmaps(void)
Definition: table.cc:5471
uint tmp_table_seq_id
Internal tmp table sequential number.
Definition: table.h:1992
TABLE ** cache_prev
Definition: table.h:1448
Key_map covering_keys
Definition: table.h:1512
uchar * null_flags
Pointer to the null flags of record[0].
Definition: table.h:1688
Key_map keys_in_use_for_group_by
Definition: table.h:1543
Key_map keys_in_use_for_query
Definition: table.h:1541
Field_longlong * set_counter()
Definition: table.h:1674
void set_storage_handler(handler *file_arg)
Set storage handler for temporary table.
Definition: table.h:2080
bool has_null_row() const
Definition: table.h:2203
TABLE ** triggers_lru_prev
Definition: table.h:1460
Record_buffer m_record_buffer
Buffer for use in multi-row reads. Initially empty.
Definition: table.h:1500
void set_deleted()
Set the contents of table to be "deleted", ie "not created", after having deleted the contents.
Definition: table.h:2100
Set_operator_type m_set_op_type
Holds the set operation type.
Definition: table.h:1623
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:6234
void use_all_columns()
Definition: table.h:2022
bool has_updated_row() const
Definition: table.h:2206
TABLE * cache_next
Links for the lists of used/unused TABLE objects for the particular table in the specific instance of...
Definition: table.h:1448
Set_operator_type set_op_type()
Returns the set operation type.
Definition: table.h:1638
void blobs_need_not_keep_old_value()
Virtual fields of type BLOB have a flag m_keep_old_value.
Definition: table.cc:8316
Table_ref * pos_in_table_list
Definition: table.h:1683
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:1665
ORDER * group
Definition: table.h:1686
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:7905
void set_use_hash_map(bool use_hash_map)
Definition: table.h:1631
void mark_columns_per_binlog_row_image(THD *thd)
Definition: table.cc:5811
ha_rows quick_condition_rows
Definition: table.h:1808
THD * in_use
The current session using this table object.
Definition: table.h:1489
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:8140
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:1766
void mark_columns_needed_for_delete(THD *thd)
Definition: table.cc:5662
ha_rows quick_rows[MAX_KEY]
Definition: table.h:1792
thr_lock_type lock_type
Definition: table.h:1939
bool null_row
Definition: table.h:1833
uint lock_data_start
Definition: table.h:1811
bool const_table
Definition: table.h:1855
MY_BITMAP read_set_internal
A bitmap of fields that are explicitly referenced by the query.
Definition: table.h:1753
bool is_marked_for_partial_update(const Field *field) const
Has this column been marked for partial update?
Definition: table.cc:7899
bool force_index_group
Flag set when the statement contains FORCE INDEX FOR GROUP BY See Table_ref::process_index_hints().
Definition: table.h:1854
bool has_storage_handler() const
Definition: table.h:2077
bool open_by_handler
Definition: table.h:1874
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:4351
Table_ref * pos_in_locked_tables
Definition: table.h:1685
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:7887
void set_keyread(bool flag)
Definition: table.cc:6223
bool index_contains_some_virtual_gcol(uint index_no) const
Check whether the given index has a virtual generated columns.
Definition: table.h:2064
uint db_stat
Definition: table.h:1813
bool is_logical_diff_enabled(const Field *field) const
Is partial update using logical diffs enabled on this JSON column?
Definition: table.cc:8118
bool has_invalid_dict() const
Definition: table.h:2035
bool has_invalid_stats()
Definition: table.h:2040
uchar * insert_values
Definition: table.h:1497
ptrdiff_t default_values_offset() const
Definition: table.h:2072
uchar * record[2]
Definition: table.h:1494
void invalidate_dict()
Definition: table.cc:8363
void mark_auto_increment_column(void)
Mark auto-increment fields as used fields in both read and write maps.
Definition: table.cc:5631
bool alias_name_used
Definition: table.h:1892
bool fill_item_list(mem_root_deque< Item * > *item_list) const
Create Item_field for each column in the table.
Definition: table.cc:4408
bool impossible_range
Definition: table.h:1945
bool is_binary_diff_enabled(const Field *field) const
Is partial update using binary diffs enabled on this JSON column?
Definition: table.cc:8112
void invalidate_stats()
Definition: table.cc:8374
Cost_model_table m_cost_model
Cost model object for operations on this table.
Definition: table.h:1980
bool should_binlog_drop_if_temp_flag
This flag decides whether or not we should log the drop temporary table command.
Definition: table.h:2320
void cleanup_value_generator_items()
Clean any state in items associated with generated columns to be ready for the next statement.
Definition: table.cc:4377
bool m_deduplicate_with_hash_map
If false, any de-duplication happens via an index on this table (e.g.
Definition: table.h:1605
Field_longlong * m_set_counter
The set counter.
Definition: table.h:1592
void init_cost_model(const Cost_model_server *cost_model_server)
Initialize the optimizer cost model.
Definition: table.h:2237
bool not_exists_optimize
Definition: table.h:1940
bool force_index
Definition: table.h:1842
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:4187
bool is_except() const
Definition: table.h:1651
MY_BITMAP * read_set
The read set contains the set of columns that the execution engine needs to process the query.
Definition: table.h:1735
bool should_binlog_drop_if_temp(void) const
Definition: table.cc:8331
bool get_fields_in_item_tree
Definition: table.h:1893
uint visible_field_count() const
Definition: table.h:2047
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:7996
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:6363
int current_lock
Definition: table.h:1814
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:6140
uint quick_n_ranges[MAX_KEY]
Definition: table.h:1798
TABLE * next
Definition: table.h:1438
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:8001
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:1923
bool empty_result_table()
Empties internal temporary table (deletes rows, closes scan)
Definition: table.cc:8335
void cleanup_partial_update()
Clean up state used for partial update of JSON columns.
Definition: table.cc:7966
uint lock_position
Definition: table.h:1810
Key_map quick_keys
Definition: table.h:1513
struct TABLE::@193 reginfo
void restore_null_flags()
Restore the NULL flags of the current row from the designated buffer.
Definition: table.h:2223
Table_trigger_dispatcher * triggers
Definition: table.h:1682
bool no_keyread
Certain statements which need the full row, set this to ban index-only access.
Definition: table.h:1868
bool is_intersect() const
Definition: table.h:1646
void set_tmp_table_seq_id(uint arg)
Definition: table.h:2274
Partial_update_info * m_partial_update_info
Object which contains execution time state used for partial update of JSON columns.
Definition: table.h:2314
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:8327
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:7458
void set_deleted_row()
Set "deleted" property for the current row.
Definition: table.h:2194
void reset_null_row()
Clear "null row" status for the current row.
Definition: table.h:2182
Field ** gen_def_fields_ptr
Pointer to fields having the default value generated.
Definition: table.h:1558
MY_BITMAP fields_for_functional_indexes
A bitmap marking the hidden generated columns that exists for functional indexes.
Definition: table.h:1477
void set_not_started()
Life cycle of the row buffer is as follows:
Definition: table.h:2130
const histograms::Histogram * find_histogram(uint field_index) const
Find the histogram for the given field index.
Definition: table.cc:8152
SortingIterator * sorting_iterator
Not owned by the TABLE; used only from filesort_free_buffers().
Definition: table.h:1965
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:1599
key_part_map const_key_parts[MAX_KEY]
Definition: table.h:1795
Field ** field
Definition: table.h:1490
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:5893
MEM_ROOT mem_root
Definition: table.h:1953
void column_bitmaps_set(MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg)
Definition: table.cc:7488
bool uses_hash_map() const
Definition: table.h:1635
uint hidden_field_count
Count of hidden fields, if internal temporary table; 0 otherwise.
Definition: table.h:1492
bool is_nullable() const
Return whether table is nullable.
Definition: table.h:2105
MY_BITMAP tmp_set
Definition: table.h:1693
MDL_ticket * mdl_ticket
Definition: table.h:1976
bool has_gcol() const
Definition: table.h:2108
bool all_partitions_pruned_away
Definition: table.h:1975
MY_BITMAP def_read_set
Definition: table.h:1693
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:7972
bool setup_partial_update()
Definition: table.cc:7937
bool m_charset_conversion_is_strict
True if character set conversions are always strict.
Definition: table.h:1609
bool has_deleted_row() const
Definition: table.h:2209
bool check_read_removal(uint index)
Read removal is possible if the selected quick read method is using full unique index.
Definition: table.cc:7250
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:8106
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:2247
KEY_PART_INFO * base_key_parts
Key part array for generated keys, used for materialized derived tables.
Definition: table.h:1551
bool is_started() const
Definition: table.h:2136
Set_operator_type
Definition: table.h:1611
@ SOT_EXCEPT_DISTINCT
Definition: table.h:1618
@ SOT_NONE
Definition: table.h:1612
@ SOT_UNION_ALL
Definition: table.h:1613
@ SOT_INTERSECT_ALL
Definition: table.h:1615
@ SOT_INTERSECT_DISTINCT
Definition: table.h:1616
@ SOT_UNION_DISTINCT
Definition: table.h:1614
@ SOT_EXCEPT_ALL
Definition: table.h:1617
MY_BITMAP cond_set
Definition: table.h:1702
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:5609
void reset()
Reset state of fields after optimization and execution.
Definition: table.cc:4257
MY_BITMAP pack_row_tmp_set
Definition: table.h:1693
void default_column_bitmaps()
Definition: table.h:2025
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:6197
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:7977
void set_null_row()
Set current row as "null row", for use in null-complemented outer join.
Definition: table.h:2175
handler * get_primary_handler() const
Returns the primary engine handler for the table.
Definition: table.cc:7495
Sql_table_check_constraint_list * table_check_constraint_list
Definition: table.h:1817
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:1460
Key_map possible_quick_keys
Definition: table.h:1528
bool created
For tmp tables.
Definition: table.h:1930
bool has_row() const
Definition: table.h:2200
const Cost_model_table * cost_model() const
Return the cost model object for this table.
Definition: table.h:2244
Field * next_number_field
Definition: table.h:1553
void update_const_key_parts(Item *conds)
Update TABLE::const_key_parts for single table UPDATE/DELETE query.
Definition: table.cc:7220
void save_null_flags()
Save the NULL flags of the current row into the designated buffer.
Definition: table.h:2218
Field * found_next_number_field
Definition: table.h:1554
Key_map keys_in_use_for_order_by
Definition: table.h:1545
void set_row_status_from_handler(int status)
Set "row found" status from handler result.
Definition: table.h:2160
Field ** visible_field_ptr() const
Definition: table.h:2045
uchar * null_flags_saved
Saved null_flags while null_row is true.
Definition: table.h:1689
uchar * write_row_record
Definition: table.h:1495
ha_rows m_limit_rows
A priori unlimited.
Definition: table.h:1584
MY_BITMAP def_write_set
Definition: table.h:1693
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:1629
uint lock_count
Definition: table.h:1812
Field * hash_field
Field used by unique constraint.
Definition: table.h:1560
MY_BITMAP def_fields_set_during_insert
Bitmap of table fields (columns), which are explicitly set in the INSERT INTO statement.
Definition: table.h:1711
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:7872
Field * fts_doc_id_field
Definition: table.h:1679
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:1891
KEY * key_info
Definition: table.h:1546
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:4301
void set_found_row()
Set status for row buffer: contains row.
Definition: table.h:2139
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:5528
const BytesPerTableRow * bytes_per_row() const
Get the estimate for the number of bytes to read per row in this table.
Definition: table.h:2252
void set_nullable()
Set table as nullable, ie it is inner wrt some outer join.
Definition: table.h:2102
Blob_mem_storage * blob_storage
Initialized in Item_func_group_concat::setup for appropriate temporary table if GROUP_CONCAT is used ...
Definition: table.h:1959
void set_updated_row()
Set "updated" property for the current row.
Definition: table.h:2188
TABLE * prev
Definition: table.h:1438
void prepare_for_position(void)
Tell handler we are going to call position() and rnd_pos() later.
Definition: table.cc:5503
TABLE_SHARE * s
Definition: table.h:1436
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:7957
MY_BITMAP * m_partial_update_columns
Bitmap that tells which columns are eligible for partial update in an update statement.
Definition: table.h:2305
bool copy_blobs
Definition: table.h:1835
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:8076
bool is_distinct() const
Definition: table.h:1656
bool add_tmp_key(Field_map *key_parts, bool invisible, bool modify_share)
Add one key to a materialized derived table.
Definition: table.cc:6008
SortingIterator * duplicate_removal_iterator
Definition: table.h:1966
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:8347
bool nullable
If true, this table is inner w.r.t.
Definition: table.h:1824
Key_map merge_keys
Definition: table.h:1516
Sort_result unique_result
The result of applying a unique operation (by row ID) to the table, if done.
Definition: table.h:1972
bool is_created() const
Return true if table is instantiated, and false otherwise.
Definition: table.h:2089
uint quick_key_parts[MAX_KEY]
Definition: table.h:1797
MY_BITMAP * write_set
Definition: table.h:1737
bool no_rows
True if writes to this table should not write rows and just write keys.
Definition: table.h:1857
Definition: typelib.h:35
Definition: table.h:682
LEX_CSTRING referenced_table_db
Definition: table.h:683
dd::Foreign_key::enum_rule delete_rule
Definition: table.h:690
LEX_CSTRING unique_constraint_name
Name of unique key matching FK in parent table, "" if there is no unique key.
Definition: table.h:689
LEX_CSTRING * column_name
Arrays with names of referencing columns of the FK.
Definition: table.h:695
uint columns
Definition: table.h:691
dd::Foreign_key::enum_rule update_rule
Definition: table.h:690
LEX_CSTRING referenced_table_name
Definition: table.h:684
dd::Foreign_key::enum_rule delete_rule
Definition: table.h:701
dd::Foreign_key::enum_rule update_rule
Definition: table.h:701
LEX_CSTRING referencing_table_name
Definition: table.h:700
LEX_CSTRING referencing_table_db
Definition: table.h:699
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