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