MySQL 8.0.39
Source Code Documentation
row0mysql.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2000, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/row0mysql.h
29 Interface between Innobase row operations and MySQL.
30 Contains also create table and other data dictionary operations.
31
32 Created 9/17/2000 Heikki Tuuri
33 *******************************************************/
34
35#ifndef row0mysql_h
36#define row0mysql_h
37
38#ifndef UNIV_HOTBACKUP
39#include "ha_prototypes.h"
40#endif /* !UNIV_HOTBACKUP */
41
42#include <stddef.h>
43#include <sys/types.h>
44#include <algorithm>
45
46#include "btr0pcur.h"
47#include "data0data.h"
48#include "data0type.h"
49#include "db0err.h"
50#include "dict0types.h"
51#include "fts0fts.h"
52#include "gis0type.h"
53#include "lob0undo.h"
54#include "lock0types.h"
55#include "mem0mem.h"
56#include "my_compiler.h"
57#include "my_inttypes.h"
58#include "que0types.h"
59#include "rem0types.h"
60#include "row0types.h"
61#include "sess0sess.h"
62#include "sql_cmd.h"
63#include "trx0types.h"
64#include "univ.i"
65#include "ut0bool_scope_guard.h"
66
67// Forward declarations
68class THD;
69class ha_innobase;
71namespace dd {
72class Table;
73}
74struct TABLE;
75struct btr_pcur_t;
76struct dfield_t;
77struct dict_field_t;
78struct dict_foreign_t;
79struct dict_index_t;
80struct dict_table_t;
81struct dict_v_col_t;
82struct dtuple_t;
83struct ins_node_t;
84struct mtr_t;
85struct que_fork_t;
86struct que_thr_t;
87struct trx_t;
88struct upd_node_t;
89struct upd_t;
90
91#ifndef UNIV_HOTBACKUP
92extern bool row_rollback_on_timeout;
93
94struct row_prebuilt_t;
95
96/** Frees the blob heap in prebuilt when no longer needed. */
98 row_prebuilt_t *prebuilt); /*!< in: prebuilt struct of a
99 ha_innobase:: table handle */
100/** Stores a >= 5.0.3 format true VARCHAR length to dest, in the MySQL row
101 format.
102 @return pointer to the data, we skip the 1 or 2 bytes at the start
103 that are used to store the len */
105 byte *dest, /*!< in: where to store */
106 ulint len, /*!< in: length, must fit in two bytes */
107 ulint lenlen); /*!< in: storage length of len: either 1 or 2 bytes */
108/** Reads a >= 5.0.3 format true VARCHAR length, in the MySQL row format, and
109 returns a pointer to the data.
110 @return pointer to the data, we skip the 1 or 2 bytes at the start
111 that are used to store the len */
113 ulint *len, /*!< out: variable-length field length */
114 const byte *field, /*!< in: field in the MySQL format */
115 ulint lenlen); /*!< in: storage length of len: either 1
116 or 2 bytes */
117
118/** Stores a reference to a BLOB in the MySQL format.
119@param[in] dest Where to store
120@param[in,out] col_len Dest buffer size: determines into how many bytes the blob
121length is stored, the space for the length may vary from 1 to 4 bytes
122@param[in] data Blob data; if the value to store is sql null this should be null
123pointer
124@param[in] len Blob length; if the value to store is sql null this should be 0;
125remember also to set the null bit in the mysql record header! */
126void row_mysql_store_blob_ref(byte *dest, ulint col_len, const void *data,
127 ulint len);
128
129/** Reads a reference to a BLOB in the MySQL format.
130@param[out] len BLOB length.
131@param[in] ref BLOB reference in the MySQL format.
132@param[in] col_len BLOB reference length (not BLOB length).
133@return pointer to BLOB data */
134const byte *row_mysql_read_blob_ref(ulint *len, const byte *ref, ulint col_len);
135
136/** Converts InnoDB geometry data format to MySQL data format. */
138 byte *dest, /*!< in/out: where to store */
139 ulint dest_len, /*!< in: dest buffer size: determines into
140 how many bytes the geometry length is stored,
141 the space for the length may vary from 1
142 to 4 bytes */
143 const byte *src, /*!< in: geometry data; if the value to store
144 is SQL NULL this should be NULL pointer */
145 ulint src_len); /*!< in: geometry length; if the value to store
146 is SQL NULL this should be 0; remember
147 also to set the NULL bit in the MySQL record
148 header! */
149
150/** Pad a column with spaces.
151@param[in] mbminlen Minimum size of a character, in bytes
152@param[out] pad Padded buffer
153@param[in] len Number of bytes to pad */
154void row_mysql_pad_col(ulint mbminlen, byte *pad, ulint len);
155
156/** Stores a non-SQL-NULL field given in the MySQL format in the InnoDB format.
157 The counterpart of this function is row_sel_field_store_in_mysql_format() in
158 row0sel.cc.
159 @return up to which byte we used buf in the conversion */
161 dfield_t *dfield, /*!< in/out: dfield where dtype
162 information must be already set when
163 this function is called! */
164 byte *buf, /*!< in/out: buffer for a converted
165 integer value; this must be at least
166 col_len long then! NOTE that dfield
167 may also get a pointer to 'buf',
168 therefore do not discard this as long
169 as dfield is used! */
170 bool row_format_col, /*!< true if the mysql_data is from
171 a MySQL row, false if from a MySQL
172 key value;
173 in MySQL, a true VARCHAR storage
174 format differs in a row and in a
175 key value: in a key value the length
176 is always stored in 2 bytes! */
177 const byte *mysql_data, /*!< in: MySQL column value, not
178 SQL NULL; NOTE that dfield may also
179 get a pointer to mysql_data,
180 therefore do not discard this as long
181 as dfield is used! */
182 ulint col_len, /*!< in: MySQL column length; NOTE that
183 this is the storage length of the
184 column in the MySQL format row, not
185 necessarily the length of the actual
186 payload data; if the column is a true
187 VARCHAR then this is irrelevant */
188 ulint comp); /*!< in: nonzero=compact format */
189/** Handles user errors and lock waits detected by the database engine.
190 @return true if it was a lock wait and we should continue running the
191 query thread */
193 dberr_t *new_err, /*!< out: possible new error encountered in
194 rollback, or the old error which was
195 during the function entry */
196 trx_t *trx, /*!< in: transaction */
197 que_thr_t *thr, /*!< in: query thread, or NULL */
198 trx_savept_t *savept); /*!< in: savepoint, or NULL */
199/** Create a prebuilt struct for a MySQL table handle.
200 @return own: a prebuilt struct */
202 dict_table_t *table, /*!< in: Innobase table handle */
203 ulint mysql_row_len); /*!< in: length in bytes of a row in
204 the MySQL format */
205
206/** Free a prebuilt struct for a MySQL table handle.
207@param[in,out] prebuilt Prebuilt struct
208@param[in] dict_locked True=data dictionary locked */
209void row_prebuilt_free(row_prebuilt_t *prebuilt, bool dict_locked);
210
211/** Updates the transaction pointers in query graphs stored in the prebuilt
212struct.
213@param[in,out] prebuilt Prebuilt struct in MySQL handle.
214@param[in,out] trx Transaction handle. */
216
217/** Sets an AUTO_INC type lock on the table mentioned in prebuilt. The
218 AUTO_INC lock gives exclusive access to the auto-inc counter of the
219 table. The lock is reserved only for the duration of an SQL statement.
220 It is not compatible with another AUTO_INC or exclusive lock on the
221 table.
222 @return error code or DB_SUCCESS */
224 row_prebuilt_t *prebuilt); /*!< in: prebuilt struct in the MySQL
225 table handle */
226
227/** Sets a table lock on the table mentioned in prebuilt.
228@param[in,out] prebuilt table handle
229@return error code or DB_SUCCESS */
231
232/** Does an insert for MySQL.
233@param[in] mysql_rec row in the MySQL format
234@param[in,out] prebuilt prebuilt struct in MySQL handle
235@return error code or DB_SUCCESS*/
236[[nodiscard]] dberr_t row_insert_for_mysql(const byte *mysql_rec,
237 row_prebuilt_t *prebuilt);
238
239/** Builds a dummy query graph used in selects. */
240void row_prebuild_sel_graph(row_prebuilt_t *prebuilt); /*!< in: prebuilt struct
241 in MySQL handle */
242/** Gets pointer to a prebuilt update vector used in updates. If the update
243 graph has not yet been built in the prebuilt struct, then this function
244 first builds it.
245 @return prebuilt update vector */
247 row_prebuilt_t *prebuilt); /*!< in: prebuilt struct in MySQL
248 handle */
249/** Checks if a table is such that we automatically created a clustered
250 index on it (on row id).
251 @return true if the clustered index was generated automatically */
253 const dict_table_t *table); /*!< in: table */
254
255/** Does an update or delete of a row for MySQL.
256@param[in] mysql_rec row in the MySQL format
257@param[in,out] prebuilt prebuilt struct in MySQL handle
258@return error code or DB_SUCCESS */
259[[nodiscard]] dberr_t row_update_for_mysql(const byte *mysql_rec,
260 row_prebuilt_t *prebuilt);
261
262/** Delete all rows for the given table by freeing/truncating indexes.
263@param[in,out] table table handler */
265
266#endif /* !UNIV_HOTBACKUP */
267
268/** Checks if a table name contains the string "/#sql" which denotes temporary
269 tables in MySQL.
270 @return true if temporary table */
271[[nodiscard]] bool row_is_mysql_tmp_table_name(const char *name);
272/*!< in: table name in the form
273'database/tablename' */
274
275#ifndef UNIV_HOTBACKUP
276/** Creates an query graph node of 'update' type to be used in the MySQL
277 interface.
278 @return own: update node */
280 dict_table_t *table, /*!< in: table to update */
281 mem_heap_t *heap); /*!< in: mem heap from which allocated */
282/** Does a cascaded delete or set null in a foreign key operation.
283 @return error code or DB_SUCCESS */
285 que_thr_t *thr, /*!< in: query thread */
286 upd_node_t *node, /*!< in: update node used in the cascade
287 or set null operation */
288 dict_table_t *table) /*!< in: table where we do the operation */
289 MY_ATTRIBUTE((nonnull));
290
291/** Locks the data dictionary exclusively for performing a table create or other
292 data dictionary modification operation.
293@param[in,out] trx Transaction
294@param[in] location Location */
296
297/** Unlocks the data dictionary exclusive lock. */
298void row_mysql_unlock_data_dictionary(trx_t *trx); /*!< in/out: transaction */
299
300/** Locks the data dictionary in shared mode from modifications, for performing
301 foreign key check, rollback, or other operation invisible to MySQL.
302@param[in,out] trx Transaction
303@param[in] location Location */
305
306/** Unlocks the data dictionary shared lock. */
307void row_mysql_unfreeze_data_dictionary(trx_t *trx); /*!< in/out: transaction */
308
309/** Creates a table for MySQL. On success the in-memory table could be
310kept in non-LRU list while on failure the 'table' object will be freed.
311@param[in,out] table table definition(will be freed, or on
312 DB_SUCCESS added to the data dictionary cache)
313@param[in] compression compression algorithm to use, can be nullptr
314@param[in] create_info HA_CREATE_INFO object
315@param[in,out] trx transaction
316@param[in] heap temp memory heap or nullptr
317@return error code or DB_SUCCESS */
319 dict_table_t *&table, const char *compression,
320 const HA_CREATE_INFO *create_info, trx_t *trx, mem_heap_t *heap);
321
322/** Does an index creation operation for MySQL. TODO: currently failure
323 to create an index results in dropping the whole table! This is no problem
324 currently as all indexes must be created at the same time as the table.
325 @return error number or DB_SUCCESS */
327 dict_index_t *index, /*!< in, own: index definition
328 (will be freed) */
329 trx_t *trx, /*!< in: transaction handle */
330 const ulint *field_lengths, /*!< in: if not NULL, must contain
331 dict_index_get_n_fields(index)
332 actual field lengths for the
333 index columns, which are
334 then checked for not being too
335 large. */
336 dict_table_t *handler); /* ! in/out: table handler. */
337
338/** Loads foreign key constraints for the table being created. This
339 function should be called after the indexes for a table have been
340 created. Each foreign key constraint must be accompanied with indexes
341 in both participating tables. The indexes are allowed to contain more
342 fields than mentioned in the constraint.
343
344 @param[in] trx transaction
345 @param[in] name table full name in normalized form
346 @param[in] dd_table MySQL dd::Table for the table
347 @return error code or DB_SUCCESS */
349 trx_t *trx, const char *name, const dd::Table *dd_table);
350
351/** The master thread in srv0srv.cc calls this regularly to drop tables which
352 we must drop in background after queries to them have ended. Such lazy
353 dropping of tables is needed in ALTER TABLE on Unix.
354 @return how many tables dropped + remaining tables in list */
356
357/** Sets an exclusive lock on a table.
358 @return error code or DB_SUCCESS */
359[[nodiscard]] dberr_t row_mysql_lock_table(
360 trx_t *trx, /*!< in/out: transaction */
361 dict_table_t *table, /*!< in: table to lock */
362 enum lock_mode mode, /*!< in: LOCK_X or LOCK_S */
363 const char *op_info); /*!< in: string for trx->op_info */
364
365/** Drop a tablespace as part of dropping or renaming a table.
366This deletes the fil_space_t if found and the file on disk.
367@param[in] space_id Tablespace ID
368@param[in] filepath File path of tablespace to delete
369@return error code or DB_SUCCESS */
370dberr_t row_drop_tablespace(space_id_t space_id, const char *filepath);
371
372/** Drop a table for MySQL. If the data dictionary was not already locked
373by the transaction, the transaction will be committed. Otherwise, the
374data dictionary will remain locked.
375@param[in] name Table name
376@param[in] trx Transaction handle
377@param[in] nonatomic Whether it is permitted to release
378and reacquire dict_operation_lock
379@param[in,out] handler Table handler or NULL
380@return error code or DB_SUCCESS */
381dberr_t row_drop_table_for_mysql(const char *name, trx_t *trx, bool nonatomic,
382 dict_table_t *handler = nullptr);
383/** Drop a table for MySQL. If the data dictionary was not already locked
384by the transaction, the transaction will be committed. Otherwise, the
385data dictionary will remain locked.
386@param[in] name table name
387@param[in,out] trx data dictionary transaction
388@return error code or DB_SUCCESS */
390 return (row_drop_table_for_mysql(name, trx, true, nullptr));
391}
392
393/** Discards the tablespace of a table which stored in an .ibd file. Discarding
394 means that this function deletes the .ibd file and assigns a new table id for
395 the table. Also the flag table->ibd_file_missing is set true.
396 @return error code or DB_SUCCESS */
398 const char *name, /*!< in: table name */
399 trx_t *trx); /*!< in: transaction handle */
400
401/** Drop a database for MySQL.
402@param[in] name database name which ends at '/'
403@param[in] trx transaction handle
404@param[out] found number of dropped tables
405@return error code or DB_SUCCESS */
407
408/** Renames a table for MySQL.
409@param[in] old_name old table name
410@param[in] new_name new table name
411@param[in] dd_table dd::Table for new table
412@param[in,out] trx transaction
413@param[in] replay whether in replay stage
414@return error code or DB_SUCCESS */
415[[nodiscard]] dberr_t row_rename_table_for_mysql(const char *old_name,
416 const char *new_name,
417 const dd::Table *dd_table,
418 trx_t *trx, bool replay);
419
420/** Read the total number of records in a consistent view.
421@param[in,out] trx Covering transaction.
422@param[in] indexes Indexes to scan.
423@param[in] max_threads Maximum number of threads to use.
424@param[out] n_rows Number of rows seen.
425@return DB_SUCCESS or error code. */
427 trx_t *trx, std::vector<dict_index_t *> &indexes, size_t max_threads,
428 ulint *n_rows);
429
430/** Scans an index for either COUNT(*) or CHECK TABLE.
431If CHECK TABLE; Checks that the index contains entries in an ascending order,
432unique constraint is not broken, and calculates the number of index entries
433in the read view of the current transaction.
434@param[in,out] prebuilt Prebuilt struct in MySQL handle.
435@param[in,out] index Index to scan.
436@param[in] n_threads Number of threads to use for the scan
437@param[in] check_keys True if called form check table.
438@param[out] n_rows Number of entries seen in the consistent read.
439@return DB_SUCCESS or other error */
440[[nodiscard]] dberr_t row_scan_index_for_mysql(row_prebuilt_t *prebuilt,
442 size_t n_threads,
443 bool check_keys, ulint *n_rows);
444/** Initialize this module */
445void row_mysql_init(void);
446
447/** Close this module */
448void row_mysql_close(void);
449
450/* A struct describing a place for an individual column in the MySQL
451row format which is presented to the table handler in ha_innobase.
452This template struct is used to speed up row transformations between
453Innobase and MySQL. */
454
456 ulint col_no; /*!< column number of the column */
457 ulint rec_field_no; /*!< field number of the column in an
458 Innobase record in the current index;
459 not defined if template_type is
460 ROW_MYSQL_WHOLE_ROW */
461 ulint clust_rec_field_no; /*!< field number of the column in an
462 Innobase record in the clustered index;
463 not defined if template_type is
464 ROW_MYSQL_WHOLE_ROW */
465 ulint icp_rec_field_no; /*!< field number of the column in an
466 Innobase record in the current index;
467 only defined for columns that could be
468 used to evaluate a pushed down index
469 condition and/or end-range condition */
470 ulint mysql_col_offset; /*!< offset of the column in the MySQL
471 row format */
472 ulint mysql_col_len; /*!< length of the column in the MySQL
473 row format */
474 ulint mysql_mvidx_len; /*!< index length on multi-value array */
475 ulint mysql_null_byte_offset; /*!< MySQL NULL bit byte offset in a
476 MySQL record */
477 ulint mysql_null_bit_mask; /*!< bit mask to get the NULL bit,
478 zero if column cannot be NULL */
479 ulint type; /*!< column type in Innobase mtype
480 numbers DATA_CHAR... */
481 ulint mysql_type; /*!< MySQL type code; this is always
482 < 256 */
483 ulint mysql_length_bytes; /*!< if mysql_type
484 == DATA_MYSQL_TRUE_VARCHAR, this tells
485 whether we should use 1 or 2 bytes to
486 store the MySQL true VARCHAR data
487 length at the start of row in the MySQL
488 format (NOTE that the MySQL key value
489 format always uses 2 bytes for the data
490 len) */
491 ulint charset; /*!< MySQL charset-collation code
492 of the column, or zero */
493 ulint mbminlen; /*!< minimum length of a char, in bytes,
494 or zero if not a char type */
495 ulint mbmaxlen; /*!< maximum length of a char, in bytes,
496 or zero if not a char type */
497 ulint is_unsigned; /*!< if a column type is an integer
498 type and this field is != 0, then
499 it is an unsigned integer type */
500 ulint is_virtual; /*!< if a column is a virtual column */
501 ulint is_multi_val; /*!< if a column is a Multi-Value Array virtual
502 column */
503};
504
505constexpr uint32_t MYSQL_FETCH_CACHE_SIZE = 8;
506/* After fetching this many rows, we start caching them in fetch_cache */
507constexpr uint32_t MYSQL_FETCH_CACHE_THRESHOLD = 4;
508
509constexpr uint32_t ROW_PREBUILT_ALLOCATED = 78540783;
510constexpr uint32_t ROW_PREBUILT_FREED = 26423527;
511
512/** A struct for (sometimes lazily) prebuilt structures in an Innobase table
513handle used within MySQL; these are used to save CPU time. */
514
516 ulint magic_n; /*!< this magic number is set to
517 ROW_PREBUILT_ALLOCATED when created,
518 or ROW_PREBUILT_FREED when the
519 struct has been freed */
520 dict_table_t *table; /*!< Innobase table handle */
521 dict_index_t *index; /*!< current index for a search, if
522 any */
523 trx_t *trx; /*!< current transaction handle */
524 unsigned sql_stat_start : 1; /*!< true when we start processing of
525 an SQL statement: we may have to set
526 an intention lock on the table,
527 create a consistent read view etc. */
529 /*!< if the user did not define a
530 primary key in MySQL, then Innobase
531 automatically generated a clustered
532 index where the ordering column is
533 the row id: in this case this flag
534 is set to true */
535 unsigned index_usable : 1; /*!< caches the value of
536 index->is_usable(trx) */
537 unsigned read_just_key : 1; /*!< set to 1 when MySQL calls
538 ha_innobase::extra with the
539 argument HA_EXTRA_KEYREAD; it is enough
540 to read just columns defined in
541 the index (i.e., no read of the
542 clustered index record necessary) */
543 unsigned used_in_HANDLER : 1; /*!< true if we have been using this
544 handle in a MySQL HANDLER low level
545 index cursor command: then we must
546 store the pcur position even in a
547 unique search from a clustered index,
548 because HANDLER allows NEXT and PREV
549 in such a situation */
550 unsigned template_type : 2; /*!< ROW_MYSQL_WHOLE_ROW,
551 ROW_MYSQL_REC_FIELDS,
552 ROW_MYSQL_DUMMY_TEMPLATE, or
553 ROW_MYSQL_NO_TEMPLATE */
554 unsigned n_template : 10; /*!< number of elements in the
555 template */
556 unsigned null_bitmap_len : 10; /*!< number of bytes in the SQL NULL
557 bitmap at the start of a row in the
558 MySQL format */
559 unsigned need_to_access_clustered : 1; /*!< if we are fetching
560 columns through a secondary index
561 and at least one column is not in
562 the secondary index, then this is
563 set to true */
564 unsigned templ_contains_blob : 1; /*!< true if the template contains
565 a column with DATA_LARGE_MTYPE(
566 get_innobase_type_from_mysql_type())
567 is true;
568 not to be confused with InnoDB
569 externally stored columns
570 (VARCHAR can be off-page too) */
571 unsigned templ_contains_fixed_point : 1; /*!< true if the
572 template contains a column with
573 DATA_POINT. Since InnoDB regards
574 DATA_POINT as non-BLOB type, the
575 templ_contains_blob can't tell us
576 if there is DATA_POINT */
577
578 /** 1 if extra(HA_EXTRA_INSERT_WITH_UPDATE) was requested, which happens
579 when ON DUPLICATE KEY UPDATE clause is present, 0 otherwise */
581
582 /** 1 if extra(HA_EXTRA_WRITE_CAN_REPLACE) was requested, which happen when
583 REPLACE is done instead of regular INSERT, 0 otherwise */
584 unsigned replace : 1;
585
586 /** template used to transform rows fast between MySQL and Innobase formats;
587 memory for this template is not allocated from 'heap' */
589
590 /** memory heap from which these auxiliary structures are allocated when
591 needed */
593
594 /** memory heap from which innodb_api_buf is allocated per session */
596
597 /** Innobase SQL insert node used to perform inserts to the table */
599
600 /** buffer for storing data converted to the Innobase format from the MySQL
601 format */
603
604 /* buffer for converting data format for multi-value virtual columns */
606 const byte *default_rec; /*!< the default values of all columns
607 (a "default row") in MySQL format */
609 /*!< normally this is set to 0; if this
610 is set to ROW_RETRIEVE_PRIMARY_KEY,
611 then we should at least retrieve all
612 columns in the primary key; if this
613 is set to ROW_RETRIEVE_ALL_COLS, then
614 we must retrieve all columns in the
615 key (if read_just_key == 1), or all
616 columns in the table */
617 upd_node_t *upd_node; /*!< Innobase SQL update node used
618 to perform updates and deletes */
619 trx_id_t trx_id; /*!< The table->def_trx_id when
620 ins_graph was built */
621 que_fork_t *ins_graph; /*!< Innobase SQL query graph used
622 in inserts. Will be rebuilt on
623 trx_id or n_indexes mismatch. */
624 que_fork_t *upd_graph; /*!< Innobase SQL query graph used
625 in updates or deletes */
626 btr_pcur_t *pcur; /*!< persistent cursor used in selects
627 and updates */
628 btr_pcur_t *clust_pcur; /*!< persistent cursor used in
629 some selects and updates */
630 que_fork_t *sel_graph; /*!< dummy query graph used in
631 selects */
632 dtuple_t *search_tuple; /*!< prebuilt dtuple used in selects */
633
634 /** prebuilt dtuple used in selects where the end of range is known */
636
637 /** Set to true in row_search_mvcc when a row matching exactly the length and
638 value of stop_tuple was found, so that the next iteration of row_search_mvcc
639 knows it can simply return DB_RECORD_NOT_FOUND. If true, then for sure, at
640 least one such matching row was seen. If false, it might be false negative, as
641 not all control paths lead to setting this field to true in case a matching
642 row is visited. */
644
645 private:
646 /** Set to true iff we are inside read_range_first() or read_range_next() */
648
649 public:
650 bool is_reading_range() const { return m_is_reading_range; }
651
653 public:
656 };
657
659 /* We implement row_is_reading_range_guard_t as a simple bool_scope_guard_t
660 because we trust that scopes are never nested and thus we don't need to
661 count their "openings" and "closings", so we assert that.*/
663 return row_is_reading_range_guard_t(*this);
664 }
665
667 /*!< if the clustered index was
668 generated, the row id of the
669 last row fetched is stored
670 here */
671 doc_id_t fts_doc_id; /* if the table has an FTS index on
672 it then we fetch the doc_id.
673 FTS-FIXME: Currently we fetch it always
674 but in the future we must only fetch
675 it when FTS columns are being
676 updated */
677 dtuple_t *clust_ref; /*!< prebuilt dtuple used in
678 sel/upd/del */
679 ulint select_lock_type; /*!< LOCK_NONE, LOCK_S, or LOCK_X */
680 enum select_mode select_mode; /*!< SELECT_ORDINARY,
681 SELECT_SKIP_LOKCED, or SELECT_NO_WAIT */
682 ulint row_read_type; /*!< ROW_READ_WITH_LOCKS if row locks
683 should be the obtained for records
684 under an UPDATE or DELETE cursor.
685 If trx_t::allow_semi_consistent()
686 returns true, this can be set to
687 ROW_READ_TRY_SEMI_CONSISTENT, so that
688 if the row under an UPDATE or DELETE
689 cursor was locked by another
690 transaction, InnoDB will resort
691 to reading the last committed value
692 ('semi-consistent read'). Then,
693 this field will be set to
694 ROW_READ_DID_SEMI_CONSISTENT to
695 indicate that. If the row does not
696 match the WHERE condition, MySQL will
697 invoke handler::unlock_row() to
698 clear the flag back to
699 ROW_READ_TRY_SEMI_CONSISTENT and
700 to simply skip the row. If
701 the row matches, the next call to
702 row_search_for_mysql() will lock
703 the row.
704 This eliminates lock waits in some
705 cases; note that this breaks
706 serializability. */
707
708 /** byte offset of the end of the last requested column*/
710
711 /** length in bytes of a row in the MySQL format */
713
714 /** number of rows fetched after positioning the current cursor */
716
717 /** ROW_SEL_NEXT or ROW_SEL_PREV */
719
721 /*!< a cache for fetched rows if we
722 fetch many rows from the same cursor:
723 it saves CPU time to fetch them in a
724 batch; we reserve mysql_row_len
725 bytes for each such row; these
726 pointers point 4 bytes past the
727 allocated mem buf start, because
728 there is a 4 byte magic number at the
729 start and at the end */
730 ulint fetch_cache_first; /*!< position of the first not yet
731 fetched row in fetch_cache */
732 ulint n_fetch_cached; /*!< number of not yet fetched rows
733 in fetch_cache */
734 mem_heap_t *blob_heap; /*!< in SELECTS BLOB fields are copied
735 to this heap */
736 mem_heap_t *old_vers_heap; /*!< memory heap where a previous
737 version is built in consistent read */
738 enum {
742 };
743 /** normally false;
744 if session is using READ COMMITTED or READ UNCOMMITTED isolation level, set in
745 row_search_for_mysql() if we set a new record lock on the secondary or
746 clustered index;
747 this is used in row_try_unlock() when releasing the lock under the cursor if
748 we determine after retrieving the row that it does not need to be locked
749 ('mini-rollback')
750
751 [LOCK_PCUR] corresponds to pcur, the first index we looked up
752 (can be secondary or clustered!)
753
754 [LOCK_CLUST_PCUR] corresponds to clust_pcur, which if used at all, is always
755 the clustered index.
756
757 The meaning of these booleans is:
758 true = we've created a rec lock, which we might release as we "own" it
759 false = we should not release any lock for this index as we either reused
760 some existing lock, or there is some other reason, we should keep it
761 */
762 std::bitset<LOCK_COUNT> new_rec_lock;
763 bool keep_other_fields_on_keyread; /*!< when using fetch
764 cache with HA_EXTRA_KEYREAD, don't
765 overwrite other fields in mysql row
766 row buffer.*/
767 bool in_fts_query; /*!< Whether we are in a FTS query */
768 bool fts_doc_id_in_read_set; /*!< true if table has externally
769 defined FTS_DOC_ID coulmn. */
770 /*----------------------*/
772 /*!< last value of AUTO-INC interval */
773 ulonglong autoinc_increment; /*!< The increment step of the auto
774 increment column. Value must be
775 greater than or equal to 1. Required to
776 calculate the next value */
777 ulonglong autoinc_offset; /*!< The offset passed to
778 get_auto_increment() by MySQL. Required
779 to calculate the next value */
780 dberr_t autoinc_error; /*!< The actual error code encountered
781 while trying to init or read the
782 autoinc value from the table. We
783 store it here so that we can return
784 it to MySQL */
785 /*----------------------*/
786 bool idx_cond; /*!< True if index condition pushdown
787 is used, false otherwise. */
788 ulint idx_cond_n_cols; /*!< Number of fields in idx_cond_cols.
789 0 if and only if idx_cond == false. */
790 /*----------------------*/
791 unsigned innodb_api : 1; /*!< whether this is a InnoDB API
792 query */
793 const rec_t *innodb_api_rec; /*!< InnoDB API search result */
794 void *innodb_api_buf; /*!< Buffer holding copy of the physical
795 Innodb API search record */
796 ulint innodb_api_rec_size; /*!< Size of the Innodb API record */
797 /*----------------------*/
798
799 /*----------------------*/
800 rtr_info_t *rtr_info; /*!< R-tree Search Info */
801 /*----------------------*/
802
803 ulint magic_n2; /*!< this should be the same as
804 magic_n */
805
806 bool ins_sel_stmt; /*!< if true then ins_sel_statement. */
807
808 innodb_session_t *session; /*!< InnoDB session handler. */
809 byte *srch_key_val1; /*!< buffer used in converting
810 search key values from MySQL format
811 to InnoDB format.*/
812 byte *srch_key_val2; /*!< buffer used in converting
813 search key values from MySQL format
814 to InnoDB format.*/
815 uint srch_key_val_len; /*!< Size of search key */
816 /** Disable prefetch. */
818
819 /** true, if server has called ha_extra(HA_EXTRA_NO_READ_LOCKING) */
821
822 /** true, if we were asked to skip AUTOINC locking for the table. */
824
825 /** Return materialized key for secondary index scan */
827
828 /** Whether this is a temporary(intrinsic) table read to keep the position
829 for this MySQL TABLE object */
831
832 /** Whether tree modifying operation happened on a temporary (intrinsic)
833 table index tree. In this case, it could be split, but no shrink. */
835
836 /** The MySQL table object */
838
839 /** The MySQL handler object. */
841
842 /** limit value to avoid fts result overflow */
844
845 /** True if exceeded the end_range while filling the prefetch cache. */
847
848 /** Undo information for LOB mvcc */
850
852
854
855 /** Can a record buffer or a prefetch cache be utilized for prefetching
856 records in this scan?
857 @retval true if records can be prefetched
858 @retval false if records cannot be prefetched */
859 bool can_prefetch_records() const;
860
861 /** Determines if the query is REPLACE or ON DUPLICATE KEY UPDATE in which
862 case duplicate values should be allowed (and further processed) instead of
863 causing an error.
864 @return true iff duplicated values should be allowed */
866
867 /** This is an no-op unless trx is using a READ COMMITTED or READ UNCOMMITTED
868 isolation level.
869 Before calling this function row_search_for_mysql() must have stored to
870 new_rec_locks[] the information which new record locks really were set.
871 This function removes a newly set index record locks under pcur or clust_pcur.
872 Thus, this implements a 'mini-rollback' that releases the latest index record
873 locks we've just set.
874
875 @param[in] has_latches_on_recs true if called so that we have the
876 latches on the records under pcur
877 and clust_pcur, and we do not need
878 to reposition the cursors. */
879 void try_unlock(bool has_latches_on_recs);
880
881 private:
882 /** A helper function for init_search_tuples_types() which prepares the shape
883 of the tuple to match the index
884 @param[in] tuple this->search_tuple or this->m_stop_tuple */
888 }
889
890 public:
891 /** Counts how many elements of @see new_rec_lock[] array are set to true. */
892 size_t new_rec_locks_count() const { return new_rec_lock.count(); }
893
894 /** Initializes search_tuple and m_stop_tuple shape so they match the index */
898 }
899
900 /** Resets both search_tuple and m_stop_tuple */
904 }
905
906 /** Inside this function perform activity that needs to be done at the
907 end of statement. */
908 void end_stmt();
909
910 /** @return true iff the operation can skip concurrency ticket. */
911 bool skip_concurrency_ticket() const;
912
913 /** It is unsafe to copy this struct, and moving it would be non-trivial,
914 because we want to keep in sync with row_is_reading_range_guard_t. Therefore
915 it is much safer/easier to just forbid such operations. */
920};
921
922/** Callback for row_mysql_sys_index_iterate() */
924 virtual ~SysIndexCallback() = default;
925
926 /** Callback method
927 @param mtr current mini-transaction
928 @param pcur persistent cursor. */
929 virtual void operator()(mtr_t *mtr, btr_pcur_t *pcur) noexcept = 0;
930};
931
932/** Get the updated parent field value from the update vector for the
933given col_no.
934@param[in] foreign foreign key information
935@param[in] update updated parent vector.
936@param[in] col_no base column position of the child table to check
937@return updated field from the parent update vector, else NULL */
939 upd_t *update, uint32_t col_no);
940
941/** Get the computed value by supplying the base column values.
942@param[in,out] row the data row
943@param[in] col virtual column
944@param[in] index index on the virtual column
945@param[in,out] local_heap heap memory for processing large data etc.
946@param[in,out] heap memory heap that copies the actual index row
947@param[in] ifield index field
948@param[in] thd MySQL thread handle
949@param[in,out] mysql_table mysql table object
950@param[in] old_table during ALTER TABLE, this is the old table
951 or NULL.
952@param[in] parent_update update vector for the parent row
953@param[in] foreign foreign key information
954@return the field filled with computed value, or NULL if just want
955to store the value in passed in "my_rec" */
957 const dtuple_t *row, const dict_v_col_t *col, const dict_index_t *index,
958 mem_heap_t **local_heap, mem_heap_t *heap, const dict_field_t *ifield,
959 THD *thd, TABLE *mysql_table, const dict_table_t *old_table,
960 upd_t *parent_update, dict_foreign_t *foreign);
961
962/** Parse out multi-values from a MySQL record
963@param[in] mysql_table MySQL table structure
964@param[in] f_idx field index of the multi-value column
965@param[in,out] dfield field structure to store parsed multi-value
966@param[in,out] value nullptr or the multi-value structure
967 to store the parsed values
968@param[in] old_val old value if exists
969@param[in] comp true if InnoDB table uses compact row format
970@param[in,out] heap memory heap */
971void innobase_get_multi_value(const TABLE *mysql_table, ulint f_idx,
972 dfield_t *dfield, multi_value_data *value,
973 uint old_val, ulint comp, mem_heap_t *heap);
974
975/** Get the computed value by supplying the base column values.
976@param[in,out] table the table whose virtual column template to be built */
978
979/** Change dbname and table name in table->vc_templ.
980@param[in,out] table the table whose virtual column template
981dbname and tbname to be renamed. */
983
984constexpr uint32_t ROW_PREBUILT_FETCH_MAGIC_N = 465765687;
985
986constexpr uint32_t ROW_MYSQL_WHOLE_ROW = 0;
987constexpr uint32_t ROW_MYSQL_REC_FIELDS = 1;
988constexpr uint32_t ROW_MYSQL_NO_TEMPLATE = 2;
989/** dummy template used in row_scan_and_check_index */
990constexpr uint32_t ROW_MYSQL_DUMMY_TEMPLATE = 3;
991
992/* Values for hint_need_to_fetch_extra_cols */
993constexpr uint32_t ROW_RETRIEVE_PRIMARY_KEY = 1;
994constexpr uint32_t ROW_RETRIEVE_ALL_COLS = 2;
995
996/* Values for row_read_type */
997constexpr uint32_t ROW_READ_WITH_LOCKS = 0;
998constexpr uint32_t ROW_READ_TRY_SEMI_CONSISTENT = 1;
999constexpr uint32_t ROW_READ_DID_SEMI_CONSISTENT = 2;
1000
1001#ifdef UNIV_DEBUG
1002/** Wait for the background drop list to become empty. */
1004#endif /* UNIV_DEBUG */
1005#endif /* !UNIV_HOTBACKUP */
1006
1007#endif /* row0mysql.h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:51
The index tree persistent cursor.
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:34
Definition: table.h:47
The class defining a handle to an InnoDB table.
Definition: ha_innodb.h:87
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4414
Definition: sess0sess.h:71
row_is_reading_range_guard_t(row_prebuilt_t &prebuilt)
Definition: row0mysql.h:654
A RAII-style class, which sets a given boolean to true in constructor, and to false in destructor,...
Definition: ut0bool_scope_guard.h:39
bool_scope_guard_t(bool &active)
Creates the RAII guard which sets active to true for the duration of its lifetime.
Definition: ut0bool_scope_guard.h:48
void dtuple_set_n_fields(dtuple_t *tuple, ulint n_fields)
Sets number of fields used in a tuple.
Definition: data0data.cc:96
SQL data field and tuple.
Data types.
constexpr uint32_t DATA_ROW_ID_LEN
stored length for row id
Definition: data0type.h:179
Global error codes for the database.
dberr_t
Definition: db0err.h:39
void dict_index_copy_types(dtuple_t *tuple, const dict_index_t *index, ulint n_fields)
Copies types of fields contained in index to tuple.
Definition: dict0dict.cc:2868
Data dictionary global types.
Full text search header file.
uint64_t doc_id_t
Document id type.
Definition: fts0fts.h:77
R-tree header file.
Prototypes for global functions in ha_innodb.cc that are called by InnoDB C code.
Undo logging small changes to BLOBs.
The transaction lock system global types.
select_mode
Definition: lock0types.h:45
lock_mode
Definition: lock0types.h:52
The memory management.
Header for compiler-dependent features.
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
static uint update
Definition: myisamlog.cc:91
static const char * filepath
Definition: myisamlog.cc:94
Definition: buf0block_hint.cc:30
PT & ref(PT *tp)
Definition: tablespace_impl.cc:359
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
mode
Definition: file_handle.h:60
This file contains a set of libraries providing overloads for regular dynamic allocation routines whi...
Definition: aligned_alloc.h:48
Query graph global types.
Record manager global types.
byte rec_t
Definition: rem0types.h:41
constexpr uint32_t ROW_MYSQL_NO_TEMPLATE
Definition: row0mysql.h:988
dberr_t row_drop_table_for_mysql(const char *name, trx_t *trx, bool nonatomic, dict_table_t *handler=nullptr)
Drop a table for MySQL.
Definition: row0mysql.cc:3739
void innobase_rename_vc_templ(dict_table_t *table)
Change dbname and table name in table->vc_templ.
Definition: ha_innodb.cc:23507
constexpr uint32_t ROW_PREBUILT_ALLOCATED
Definition: row0mysql.h:509
constexpr uint32_t ROW_READ_WITH_LOCKS
Definition: row0mysql.h:997
dberr_t row_mysql_lock_table(trx_t *trx, dict_table_t *table, enum lock_mode mode, const char *op_info)
Sets an exclusive lock on a table.
Definition: row0mysql.cc:3575
constexpr uint32_t ROW_PREBUILT_FETCH_MAGIC_N
Definition: row0mysql.h:984
void row_mysql_store_blob_ref(byte *dest, ulint col_len, const void *data, ulint len)
Stores a reference to a BLOB in the MySQL format.
Definition: row0mysql.cc:213
byte * row_mysql_store_col_in_innobase_format(dfield_t *dfield, byte *buf, bool row_format_col, const byte *mysql_data, ulint col_len, ulint comp)
Stores a non-SQL-NULL field given in the MySQL format in the InnoDB format.
Definition: row0mysql.cc:376
constexpr uint32_t ROW_RETRIEVE_PRIMARY_KEY
Definition: row0mysql.h:993
dberr_t row_create_index_for_mysql(dict_index_t *index, trx_t *trx, const ulint *field_lengths, dict_table_t *handler)
Does an index creation operation for MySQL.
Definition: row0mysql.cc:2877
void row_mysql_store_geometry(byte *dest, ulint dest_len, const byte *src, ulint src_len)
Converts InnoDB geometry data format to MySQL data format.
Definition: row0mysql.cc:246
dfield_t * innobase_get_computed_value(const dtuple_t *row, const dict_v_col_t *col, const dict_index_t *index, mem_heap_t **local_heap, mem_heap_t *heap, const dict_field_t *ifield, THD *thd, TABLE *mysql_table, const dict_table_t *old_table, upd_t *parent_update, dict_foreign_t *foreign)
Get the computed value by supplying the base column values.
Definition: ha_innodb.cc:23560
const byte * row_mysql_read_true_varchar(ulint *len, const byte *field, ulint lenlen)
Reads a >= 5.0.3 format true VARCHAR length, in the MySQL row format, and returns a pointer to the da...
Definition: row0mysql.cc:186
dberr_t row_mysql_parallel_select_count_star(trx_t *trx, std::vector< dict_index_t * > &indexes, size_t max_threads, ulint *n_rows)
Read the total number of records in a consistent view.
Definition: row0mysql.cc:4345
constexpr uint32_t ROW_MYSQL_DUMMY_TEMPLATE
dummy template used in row_scan_and_check_index
Definition: row0mysql.h:990
void innobase_get_multi_value(const TABLE *mysql_table, ulint f_idx, dfield_t *dfield, multi_value_data *value, uint old_val, ulint comp, mem_heap_t *heap)
Parse out multi-values from a MySQL record.
Definition: ha_innodb.cc:8960
dberr_t row_scan_index_for_mysql(row_prebuilt_t *prebuilt, dict_index_t *index, size_t n_threads, bool check_keys, ulint *n_rows)
Scans an index for either COUNT(*) or CHECK TABLE.
Definition: row0mysql.cc:4543
const byte * row_mysql_read_blob_ref(ulint *len, const byte *ref, ulint col_len)
Reads a reference to a BLOB in the MySQL format.
Definition: row0mysql.cc:234
dberr_t row_create_table_for_mysql(dict_table_t *&table, const char *compression, const HA_CREATE_INFO *create_info, trx_t *trx, mem_heap_t *heap)
Creates a table for MySQL.
Definition: row0mysql.cc:2727
dberr_t row_update_cascade_for_mysql(que_thr_t *thr, upd_node_t *node, dict_table_t *table)
Does a cascaded delete or set null in a foreign key operation.
Definition: row0mysql.cc:2572
void row_mysql_unlock_data_dictionary(trx_t *trx)
Unlocks the data dictionary exclusive lock.
Definition: row0mysql.cc:2714
constexpr uint32_t ROW_PREBUILT_FREED
Definition: row0mysql.h:510
void row_wait_for_background_drop_list_empty()
Wait for the background drop list to become empty.
Definition: row0mysql.cc:128
void row_mysql_unfreeze_data_dictionary(trx_t *trx)
Unlocks the data dictionary shared lock.
Definition: row0mysql.cc:2687
constexpr uint32_t MYSQL_FETCH_CACHE_SIZE
Definition: row0mysql.h:505
dberr_t row_discard_tablespace_for_mysql(const char *name, trx_t *trx)
Discards the tablespace of a table which stored in an .ibd file.
Definition: row0mysql.cc:3520
dberr_t row_table_load_foreign_constraints(trx_t *trx, const char *name, const dd::Table *dd_table)
Loads foreign key constraints for the table being created.
Definition: row0mysql.cc:3034
dberr_t row_update_for_mysql(const byte *mysql_rec, row_prebuilt_t *prebuilt)
Does an update or delete of a row for MySQL.
Definition: row0mysql.cc:2446
void row_mysql_prebuilt_free_blob_heap(row_prebuilt_t *prebuilt)
Frees the blob heap in prebuilt when no longer needed.
Definition: row0mysql.cc:147
row_prebuilt_t * row_create_prebuilt(dict_table_t *table, ulint mysql_row_len)
Create a prebuilt struct for a MySQL table handle.
Definition: row0mysql.cc:781
dberr_t row_drop_database_for_mysql(const char *name, trx_t *trx, ulint *found)
Drop a database for MySQL.
dberr_t row_lock_table_autoinc_for_mysql(row_prebuilt_t *prebuilt)
Sets an AUTO_INC type lock on the table mentioned in prebuilt.
Definition: row0mysql.cc:1144
constexpr uint32_t ROW_MYSQL_WHOLE_ROW
Definition: row0mysql.h:986
ulint row_drop_tables_for_mysql_in_background(void)
The master thread in srv0srv.cc calls this regularly to drop tables which we must drop in background ...
Definition: row0mysql.cc:3139
constexpr uint32_t ROW_READ_DID_SEMI_CONSISTENT
Definition: row0mysql.h:999
byte * row_mysql_store_true_var_len(byte *dest, ulint len, ulint lenlen)
Stores a >= 5.0.3 format true VARCHAR length to dest, in the MySQL row format.
Definition: row0mysql.cc:161
upd_t * row_get_prebuilt_update_vector(row_prebuilt_t *prebuilt)
Gets pointer to a prebuilt update vector used in updates.
Definition: row0mysql.cc:1782
dfield_t * innobase_get_field_from_update_vector(dict_foreign_t *foreign, upd_t *update, uint32_t col_no)
Get the updated parent field value from the update vector for the given col_no.
Definition: ha_innodb.cc:23518
constexpr uint32_t ROW_RETRIEVE_ALL_COLS
Definition: row0mysql.h:994
void row_mysql_freeze_data_dictionary(trx_t *trx, ut::Location location)
Locks the data dictionary in shared mode from modifications, for performing foreign key check,...
Definition: row0mysql.cc:2678
void row_mysql_pad_col(ulint mbminlen, byte *pad, ulint len)
Pad a column with spaces.
Definition: row0mysql.cc:339
bool row_is_mysql_tmp_table_name(const char *name)
Checks if a table name contains the string "/#sql" which denotes temporary tables in MySQL.
Definition: row0mysql.cc:4127
void row_mysql_close(void)
Close this module.
Definition: row0mysql.cc:4750
void row_update_prebuilt_trx(row_prebuilt_t *prebuilt, trx_t *trx)
Updates the transaction pointers in query graphs stored in the prebuilt struct.
Definition: row0mysql.cc:1004
dberr_t row_rename_table_for_mysql(const char *old_name, const char *new_name, const dd::Table *dd_table, trx_t *trx, bool replay)
Renames a table for MySQL.
Definition: row0mysql.cc:4139
bool row_mysql_handle_errors(dberr_t *new_err, trx_t *trx, que_thr_t *thr, trx_savept_t *savept)
Handles user errors and lock waits detected by the database engine.
Definition: row0mysql.cc:653
void row_prebuilt_free(row_prebuilt_t *prebuilt, bool dict_locked)
Free a prebuilt struct for a MySQL table handle.
Definition: row0mysql.cc:931
constexpr uint32_t ROW_MYSQL_REC_FIELDS
Definition: row0mysql.h:987
void row_mysql_lock_data_dictionary(trx_t *trx, ut::Location location)
Locks the data dictionary exclusively for performing a table create or other data dictionary modifica...
Definition: row0mysql.cc:2700
constexpr uint32_t ROW_READ_TRY_SEMI_CONSISTENT
Definition: row0mysql.h:998
bool row_rollback_on_timeout
Provide optional 4.x backwards compatibility for 5.0 and above.
Definition: row0mysql.cc:94
void innobase_init_vc_templ(dict_table_t *table)
Get the computed value by supplying the base column values.
Definition: ha_innodb.cc:23473
upd_node_t * row_create_update_node_for_mysql(dict_table_t *table, mem_heap_t *heap)
Creates an query graph node of 'update' type to be used in the MySQL interface.
Definition: row0mysql.cc:1737
void row_mysql_init(void)
Initialize this module.
Definition: row0mysql.cc:4743
bool row_table_got_default_clust_index(const dict_table_t *table)
Checks if a table is such that we automatically created a clustered index on it (on row id).
Definition: row0mysql.cc:2664
dberr_t row_lock_table(row_prebuilt_t *prebuilt)
Sets a table lock on the table mentioned in prebuilt.
Definition: row0mysql.cc:1213
void row_delete_all_rows(dict_table_t *table)
Delete all rows for the given table by freeing/truncating indexes.
Definition: row0mysql.cc:2459
dberr_t row_drop_tablespace(space_id_t space_id, const char *filepath)
Drop a tablespace as part of dropping or renaming a table.
Definition: row0mysql.cc:3702
void row_prebuild_sel_graph(row_prebuilt_t *prebuilt)
Builds a dummy query graph used in selects.
Definition: row0mysql.cc:1718
constexpr uint32_t MYSQL_FETCH_CACHE_THRESHOLD
Definition: row0mysql.h:507
dberr_t row_insert_for_mysql(const byte *mysql_rec, row_prebuilt_t *prebuilt)
Does an insert for MySQL.
Definition: row0mysql.cc:1707
Row operation global types.
InnoDB session state tracker.
Representation of an SQL command.
case opt name
Definition: sslopt-case.h:33
Struct to hold information about the table that should be created.
Definition: handler.h:3045
Callback for row_mysql_sys_index_iterate()
Definition: row0mysql.h:923
virtual ~SysIndexCallback()=default
virtual void operator()(mtr_t *mtr, btr_pcur_t *pcur) noexcept=0
Callback method.
Definition: table.h:1399
Definition: btr0pcur.h:99
Structure for an SQL data field.
Definition: data0data.h:605
Data structure for a field in an index.
Definition: dict0mem.h:895
Data structure for a foreign key constraint; an example: FOREIGN KEY (A, B) REFERENCES TABLE2 (C,...
Definition: dict0mem.h:1666
Data structure for an index.
Definition: dict0mem.h:1046
unsigned n_fields
number of fields in the index
Definition: dict0mem.h:1106
Data structure for a database table.
Definition: dict0mem.h:1909
Data structure for a virtual column in a table.
Definition: dict0mem.h:815
Structure for an SQL data tuple of fields (logical record)
Definition: data0data.h:682
Definition: row0ins.h:162
The list of modifications to be applied on LOBs to get older versions.
Definition: lob0undo.h:146
void reset()
Empty the collected LOB undo information from cache.
Definition: lob0undo.h:190
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:177
Structure to hold number of multiple values.
Definition: data0data.h:384
Definition: row0mysql.h:455
ulint mysql_null_byte_offset
MySQL NULL bit byte offset in a MySQL record.
Definition: row0mysql.h:475
ulint mysql_col_offset
offset of the column in the MySQL row format
Definition: row0mysql.h:470
ulint rec_field_no
field number of the column in an Innobase record in the current index; not defined if template_type i...
Definition: row0mysql.h:457
ulint is_unsigned
if a column type is an integer type and this field is != 0, then it is an unsigned integer type
Definition: row0mysql.h:497
ulint mysql_type
MySQL type code; this is always < 256.
Definition: row0mysql.h:481
ulint mbminlen
minimum length of a char, in bytes, or zero if not a char type
Definition: row0mysql.h:493
ulint mbmaxlen
maximum length of a char, in bytes, or zero if not a char type
Definition: row0mysql.h:495
ulint mysql_length_bytes
if mysql_type == DATA_MYSQL_TRUE_VARCHAR, this tells whether we should use 1 or 2 bytes to store the ...
Definition: row0mysql.h:483
ulint mysql_null_bit_mask
bit mask to get the NULL bit, zero if column cannot be NULL
Definition: row0mysql.h:477
ulint is_virtual
if a column is a virtual column
Definition: row0mysql.h:500
ulint col_no
column number of the column
Definition: row0mysql.h:456
ulint is_multi_val
if a column is a Multi-Value Array virtual column
Definition: row0mysql.h:501
ulint type
column type in Innobase mtype numbers DATA_CHAR...
Definition: row0mysql.h:479
ulint mysql_col_len
length of the column in the MySQL row format
Definition: row0mysql.h:472
ulint clust_rec_field_no
field number of the column in an Innobase record in the clustered index; not defined if template_type...
Definition: row0mysql.h:461
ulint mysql_mvidx_len
index length on multi-value array
Definition: row0mysql.h:474
ulint icp_rec_field_no
field number of the column in an Innobase record in the current index; only defined for columns that ...
Definition: row0mysql.h:465
ulint charset
MySQL charset-collation code of the column, or zero.
Definition: row0mysql.h:491
Definition: que0que.h:301
Definition: que0que.h:242
A struct for (sometimes lazily) prebuilt structures in an Innobase table handle used within MySQL; th...
Definition: row0mysql.h:515
bool m_read_virtual_key
Return materialized key for secondary index scan.
Definition: row0mysql.h:826
trx_id_t trx_id
The table->def_trx_id when ins_graph was built.
Definition: row0mysql.h:619
unsigned used_in_HANDLER
true if we have been using this handle in a MySQL HANDLER low level index cursor command: then we mus...
Definition: row0mysql.h:543
byte * srch_key_val2
buffer used in converting search key values from MySQL format to InnoDB format.
Definition: row0mysql.h:812
upd_node_t * upd_node
Innobase SQL update node used to perform updates and deletes.
Definition: row0mysql.h:617
unsigned sql_stat_start
true when we start processing of an SQL statement: we may have to set an intention lock on the table,...
Definition: row0mysql.h:524
row_prebuilt_t(row_prebuilt_t &&)=delete
innodb_session_t * session
InnoDB session handler.
Definition: row0mysql.h:808
multi_value_data * mv_data
Definition: row0mysql.h:605
dict_table_t * table
Innobase table handle.
Definition: row0mysql.h:520
const byte * default_rec
the default values of all columns (a "default row") in MySQL format
Definition: row0mysql.h:606
ulonglong m_fts_limit
limit value to avoid fts result overflow
Definition: row0mysql.h:843
void lob_undo_reset()
Definition: row0mysql.h:853
unsigned replace
1 if extra(HA_EXTRA_WRITE_CAN_REPLACE) was requested, which happen when REPLACE is done instead of re...
Definition: row0mysql.h:584
size_t new_rec_locks_count() const
Counts how many elements of.
Definition: row0mysql.h:892
dtuple_t * search_tuple
prebuilt dtuple used in selects
Definition: row0mysql.h:632
ulint hint_need_to_fetch_extra_cols
normally this is set to 0; if this is set to ROW_RETRIEVE_PRIMARY_KEY, then we should at least retrie...
Definition: row0mysql.h:608
mysql_row_templ_t * mysql_template
template used to transform rows fast between MySQL and Innobase formats; memory for this template is ...
Definition: row0mysql.h:588
ulint mysql_prefix_len
byte offset of the end of the last requested column
Definition: row0mysql.h:709
doc_id_t fts_doc_id
Definition: row0mysql.h:671
bool keep_other_fields_on_keyread
when using fetch cache with HA_EXTRA_KEYREAD, don't overwrite other fields in mysql row row buffer.
Definition: row0mysql.h:763
ulint select_lock_type
LOCK_NONE, LOCK_S, or LOCK_X.
Definition: row0mysql.h:679
bool no_autoinc_locking
true, if we were asked to skip AUTOINC locking for the table.
Definition: row0mysql.h:823
row_prebuilt_t(row_prebuilt_t const &)=delete
It is unsafe to copy this struct, and moving it would be non-trivial, because we want to keep in sync...
row_prebuilt_t & operator=(row_prebuilt_t const &)=delete
ulonglong autoinc_offset
The offset passed to get_auto_increment() by MySQL.
Definition: row0mysql.h:777
void end_stmt()
Inside this function perform activity that needs to be done at the end of statement.
Definition: row0mysql.cc:4812
ulint innodb_api_rec_size
Size of the Innodb API record.
Definition: row0mysql.h:796
unsigned innodb_api
whether this is a InnoDB API query
Definition: row0mysql.h:791
btr_pcur_t * clust_pcur
persistent cursor used in some selects and updates
Definition: row0mysql.h:628
unsigned templ_contains_fixed_point
true if the template contains a column with DATA_POINT.
Definition: row0mysql.h:571
unsigned null_bitmap_len
number of bytes in the SQL NULL bitmap at the start of a row in the MySQL format
Definition: row0mysql.h:556
bool ins_sel_stmt
if true then ins_sel_statement.
Definition: row0mysql.h:806
mem_heap_t * blob_heap
in SELECTS BLOB fields are copied to this heap
Definition: row0mysql.h:734
bool m_is_reading_range
Set to true iff we are inside read_range_first() or read_range_next()
Definition: row0mysql.h:647
ins_node_t * ins_node
Innobase SQL insert node used to perform inserts to the table.
Definition: row0mysql.h:598
bool m_no_prefetch
Disable prefetch.
Definition: row0mysql.h:817
unsigned n_template
number of elements in the template
Definition: row0mysql.h:554
bool m_temp_tree_modified
Whether tree modifying operation happened on a temporary (intrinsic) table index tree.
Definition: row0mysql.h:834
unsigned on_duplicate_key_update
1 if extra(HA_EXTRA_INSERT_WITH_UPDATE) was requested, which happens when ON DUPLICATE KEY UPDATE cla...
Definition: row0mysql.h:580
btr_pcur_t * pcur
persistent cursor used in selects and updates
Definition: row0mysql.h:626
ulint n_fetch_cached
number of not yet fetched rows in fetch_cache
Definition: row0mysql.h:732
std::bitset< LOCK_COUNT > new_rec_lock
normally false; if session is using READ COMMITTED or READ UNCOMMITTED isolation level,...
Definition: row0mysql.h:762
lob::undo_vers_t * get_lob_undo()
Definition: row0mysql.h:851
mem_heap_t * cursor_heap
memory heap from which innodb_api_buf is allocated per session
Definition: row0mysql.h:595
ulonglong autoinc_increment
The increment step of the auto increment column.
Definition: row0mysql.h:773
unsigned templ_contains_blob
true if the template contains a column with DATA_LARGE_MTYPE( get_innobase_type_from_mysql_type()) is...
Definition: row0mysql.h:564
ulint idx_cond_n_cols
Number of fields in idx_cond_cols.
Definition: row0mysql.h:788
ulint row_read_type
ROW_READ_WITH_LOCKS if row locks should be the obtained for records under an UPDATE or DELETE cursor.
Definition: row0mysql.h:682
lob::undo_vers_t m_lob_undo
Undo information for LOB mvcc.
Definition: row0mysql.h:849
ha_innobase * m_mysql_handler
The MySQL handler object.
Definition: row0mysql.h:840
bool in_fts_query
Whether we are in a FTS query.
Definition: row0mysql.h:767
bool no_read_locking
true, if server has called ha_extra(HA_EXTRA_NO_READ_LOCKING)
Definition: row0mysql.h:820
mem_heap_t * old_vers_heap
memory heap where a previous version is built in consistent read
Definition: row0mysql.h:736
bool is_reading_range() const
Definition: row0mysql.h:650
bool skip_concurrency_ticket() const
Definition: row0mysql.cc:4777
void try_unlock(bool has_latches_on_recs)
This is an no-op unless trx is using a READ COMMITTED or READ UNCOMMITTED isolation level.
Definition: row0mysql.cc:2492
ulint fetch_direction
ROW_SEL_NEXT or ROW_SEL_PREV.
Definition: row0mysql.h:718
ulint n_rows_fetched
number of rows fetched after positioning the current cursor
Definition: row0mysql.h:715
bool allow_duplicates()
Determines if the query is REPLACE or ON DUPLICATE KEY UPDATE in which case duplicate values should b...
Definition: row0mysql.h:865
ulint mysql_row_len
length in bytes of a row in the MySQL format
Definition: row0mysql.h:712
byte * srch_key_val1
buffer used in converting search key values from MySQL format to InnoDB format.
Definition: row0mysql.h:809
unsigned need_to_access_clustered
if we are fetching columns through a secondary index and at least one column is not in the secondary ...
Definition: row0mysql.h:559
que_fork_t * upd_graph
Innobase SQL query graph used in updates or deletes.
Definition: row0mysql.h:624
dtuple_t * m_stop_tuple
prebuilt dtuple used in selects where the end of range is known
Definition: row0mysql.h:635
bool m_stop_tuple_found
Set to true in row_search_mvcc when a row matching exactly the length and value of stop_tuple was fou...
Definition: row0mysql.h:643
byte * fetch_cache[MYSQL_FETCH_CACHE_SIZE]
a cache for fetched rows if we fetch many rows from the same cursor: it saves CPU time to fetch them ...
Definition: row0mysql.h:720
dberr_t autoinc_error
The actual error code encountered while trying to init or read the autoinc value from the table.
Definition: row0mysql.h:780
bool idx_cond
True if index condition pushdown is used, false otherwise.
Definition: row0mysql.h:786
byte * ins_upd_rec_buff
buffer for storing data converted to the Innobase format from the MySQL format
Definition: row0mysql.h:602
trx_t * trx
current transaction handle
Definition: row0mysql.h:523
unsigned read_just_key
set to 1 when MySQL calls ha_innobase::extra with the argument HA_EXTRA_KEYREAD; it is enough to read...
Definition: row0mysql.h:537
row_prebuilt_t & operator=(row_prebuilt_t &&)=delete
bool m_temp_read_shared
Whether this is a temporary(intrinsic) table read to keep the position for this MySQL TABLE object.
Definition: row0mysql.h:830
byte row_id[DATA_ROW_ID_LEN]
if the clustered index was generated, the row id of the last row fetched is stored here
Definition: row0mysql.h:666
TABLE * m_mysql_table
The MySQL table object.
Definition: row0mysql.h:837
const rec_t * innodb_api_rec
InnoDB API search result.
Definition: row0mysql.h:793
void init_search_tuples_types()
Initializes search_tuple and m_stop_tuple shape so they match the index.
Definition: row0mysql.h:895
unsigned clust_index_was_generated
if the user did not define a primary key in MySQL, then Innobase automatically generated a clustered ...
Definition: row0mysql.h:528
unsigned index_usable
caches the value of index->is_usable(trx)
Definition: row0mysql.h:535
void * innodb_api_buf
Buffer holding copy of the physical Innodb API search record.
Definition: row0mysql.h:794
row_is_reading_range_guard_t get_is_reading_range_guard()
Definition: row0mysql.h:658
void init_tuple_types(dtuple_t *tuple)
A helper function for init_search_tuples_types() which prepares the shape of the tuple to match the i...
Definition: row0mysql.h:885
bool can_prefetch_records() const
Can a record buffer or a prefetch cache be utilized for prefetching records in this scan?
Definition: row0mysql.cc:4762
rtr_info_t * rtr_info
R-tree Search Info.
Definition: row0mysql.h:800
ulint fetch_cache_first
position of the first not yet fetched row in fetch_cache
Definition: row0mysql.h:730
bool m_end_range
True if exceeded the end_range while filling the prefetch cache.
Definition: row0mysql.h:846
enum select_mode select_mode
SELECT_ORDINARY, SELECT_SKIP_LOKCED, or SELECT_NO_WAIT.
Definition: row0mysql.h:680
dtuple_t * clust_ref
prebuilt dtuple used in sel/upd/del
Definition: row0mysql.h:677
void clear_search_tuples()
Resets both search_tuple and m_stop_tuple.
Definition: row0mysql.h:901
ulint magic_n
this magic number is set to ROW_PREBUILT_ALLOCATED when created, or ROW_PREBUILT_FREED when the struc...
Definition: row0mysql.h:516
que_fork_t * ins_graph
Innobase SQL query graph used in inserts.
Definition: row0mysql.h:621
ulonglong autoinc_last_value
last value of AUTO-INC interval
Definition: row0mysql.h:771
uint srch_key_val_len
Size of search key.
Definition: row0mysql.h:815
bool fts_doc_id_in_read_set
true if table has externally defined FTS_DOC_ID coulmn.
Definition: row0mysql.h:768
mem_heap_t * heap
memory heap from which these auxiliary structures are allocated when needed
Definition: row0mysql.h:592
unsigned template_type
ROW_MYSQL_WHOLE_ROW, ROW_MYSQL_REC_FIELDS, ROW_MYSQL_DUMMY_TEMPLATE, or ROW_MYSQL_NO_TEMPLATE.
Definition: row0mysql.h:550
@ LOCK_PCUR
Definition: row0mysql.h:739
@ LOCK_COUNT
Definition: row0mysql.h:741
@ LOCK_CLUST_PCUR
Definition: row0mysql.h:740
dict_index_t * index
current index for a search, if any
Definition: row0mysql.h:521
que_fork_t * sel_graph
dummy query graph used in selects
Definition: row0mysql.h:630
ulint magic_n2
this should be the same as magic_n
Definition: row0mysql.h:803
Vectors holding the matching internal pages/nodes and leaf records.
Definition: gis0type.h:109
Transaction savepoint.
Definition: trx0types.h:148
Definition: trx0trx.h:684
Definition: row0upd.h:701
Definition: row0upd.h:565
Definition: ut0core.h:33
Transaction system global type definitions.
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
unsigned int uint
Definition: uca9-dump.cc:75
Version control for database, common definitions, and include files.
unsigned long int ulint
Definition: univ.i:406
The ut_bool_scope_guard class which sets boolean to true for the duration of scope.
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:69