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