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