MySQL 9.0.0
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 */
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 space_id_t space_id() const { return table->space; }
521
522 dict_table_t *table; /*!< Innobase table handle */
523 dict_index_t *index; /*!< current index for a search, if
524 any */
525 trx_t *trx; /*!< current transaction handle */
526 unsigned sql_stat_start : 1; /*!< true when we start processing of
527 an SQL statement: we may have to set
528 an intention lock on the table,
529 create a consistent read view etc. */
531 /*!< if the user did not define a
532 primary key in MySQL, then Innobase
533 automatically generated a clustered
534 index where the ordering column is
535 the row id: in this case this flag
536 is set to true */
537 unsigned index_usable : 1; /*!< caches the value of
538 index->is_usable(trx) */
539 unsigned read_just_key : 1; /*!< set to 1 when MySQL calls
540 ha_innobase::extra with the
541 argument HA_EXTRA_KEYREAD; it is enough
542 to read just columns defined in
543 the index (i.e., no read of the
544 clustered index record necessary) */
545 unsigned used_in_HANDLER : 1; /*!< true if we have been using this
546 handle in a MySQL HANDLER low level
547 index cursor command: then we must
548 store the pcur position even in a
549 unique search from a clustered index,
550 because HANDLER allows NEXT and PREV
551 in such a situation */
552 unsigned template_type : 2; /*!< ROW_MYSQL_WHOLE_ROW,
553 ROW_MYSQL_REC_FIELDS,
554 ROW_MYSQL_DUMMY_TEMPLATE, or
555 ROW_MYSQL_NO_TEMPLATE */
556 unsigned n_template : 10; /*!< number of elements in the
557 template */
558 unsigned null_bitmap_len : 10; /*!< number of bytes in the SQL NULL
559 bitmap at the start of a row in the
560 MySQL format */
561 unsigned need_to_access_clustered : 1; /*!< if we are fetching
562 columns through a secondary index
563 and at least one column is not in
564 the secondary index, then this is
565 set to true */
566 unsigned templ_contains_blob : 1; /*!< true if the template contains
567 a column with DATA_LARGE_MTYPE(
568 get_innobase_type_from_mysql_type())
569 is true;
570 not to be confused with InnoDB
571 externally stored columns
572 (VARCHAR can be off-page too) */
573 unsigned templ_contains_fixed_point : 1; /*!< true if the
574 template contains a column with
575 DATA_POINT. Since InnoDB regards
576 DATA_POINT as non-BLOB type, the
577 templ_contains_blob can't tell us
578 if there is DATA_POINT */
579
580 /** 1 if extra(HA_EXTRA_INSERT_WITH_UPDATE) was requested, which happens
581 when ON DUPLICATE KEY UPDATE clause is present, 0 otherwise */
583
584 /** 1 if extra(HA_EXTRA_WRITE_CAN_REPLACE) was requested, which happen when
585 REPLACE is done instead of regular INSERT, 0 otherwise */
586 unsigned replace : 1;
587
588 /** template used to transform rows fast between MySQL and Innobase formats;
589 memory for this template is not allocated from 'heap' */
591
592 /** memory heap from which these auxiliary structures are allocated when
593 needed */
595
596 /** memory heap from which innodb_api_buf is allocated per session */
598
599 /** Innobase SQL insert node used to perform inserts to the table */
601
602 /** buffer for storing data converted to the Innobase format from the MySQL
603 format */
605
606 /* buffer for converting data format for multi-value virtual columns */
608 const byte *default_rec; /*!< the default values of all columns
609 (a "default row") in MySQL format */
611 /*!< normally this is set to 0; if this
612 is set to ROW_RETRIEVE_PRIMARY_KEY,
613 then we should at least retrieve all
614 columns in the primary key; if this
615 is set to ROW_RETRIEVE_ALL_COLS, then
616 we must retrieve all columns in the
617 key (if read_just_key == 1), or all
618 columns in the table */
619 upd_node_t *upd_node; /*!< Innobase SQL update node used
620 to perform updates and deletes */
621 trx_id_t trx_id; /*!< The table->def_trx_id when
622 ins_graph was built */
623 que_fork_t *ins_graph; /*!< Innobase SQL query graph used
624 in inserts. Will be rebuilt on
625 trx_id or n_indexes mismatch. */
626 que_fork_t *upd_graph; /*!< Innobase SQL query graph used
627 in updates or deletes */
628 btr_pcur_t *pcur; /*!< persistent cursor used in selects
629 and updates */
630 btr_pcur_t *clust_pcur; /*!< persistent cursor used in
631 some selects and updates */
632 que_fork_t *sel_graph; /*!< dummy query graph used in
633 selects */
634 dtuple_t *search_tuple; /*!< prebuilt dtuple used in selects */
635
636 /** prebuilt dtuple used in selects where the end of range is known */
638
639 /** Set to true in row_search_mvcc when a row matching exactly the length and
640 value of stop_tuple was found, so that the next iteration of row_search_mvcc
641 knows it can simply return DB_RECORD_NOT_FOUND. If true, then for sure, at
642 least one such matching row was seen. If false, it might be false negative, as
643 not all control paths lead to setting this field to true in case a matching
644 row is visited. */
646
647 private:
648 /** Set to true iff we are inside read_range_first() or read_range_next() */
650
651 public:
652 bool is_reading_range() const { return m_is_reading_range; }
653
655 public:
658 };
659
661 /* We implement row_is_reading_range_guard_t as a simple bool_scope_guard_t
662 because we trust that scopes are never nested and thus we don't need to
663 count their "openings" and "closings", so we assert that.*/
665 return row_is_reading_range_guard_t(*this);
666 }
667
669 /*!< if the clustered index was
670 generated, the row id of the
671 last row fetched is stored
672 here */
673 doc_id_t fts_doc_id; /* if the table has an FTS index on
674 it then we fetch the doc_id.
675 FTS-FIXME: Currently we fetch it always
676 but in the future we must only fetch
677 it when FTS columns are being
678 updated */
679 dtuple_t *clust_ref; /*!< prebuilt dtuple used in
680 sel/upd/del */
681 ulint select_lock_type; /*!< LOCK_NONE, LOCK_S, or LOCK_X */
682 enum select_mode select_mode; /*!< SELECT_ORDINARY,
683 SELECT_SKIP_LOKCED, or SELECT_NO_WAIT */
684 ulint row_read_type; /*!< ROW_READ_WITH_LOCKS if row locks
685 should be the obtained for records
686 under an UPDATE or DELETE cursor.
687 If trx_t::allow_semi_consistent()
688 returns true, this can be set to
689 ROW_READ_TRY_SEMI_CONSISTENT, so that
690 if the row under an UPDATE or DELETE
691 cursor was locked by another
692 transaction, InnoDB will resort
693 to reading the last committed value
694 ('semi-consistent read'). Then,
695 this field will be set to
696 ROW_READ_DID_SEMI_CONSISTENT to
697 indicate that. If the row does not
698 match the WHERE condition, MySQL will
699 invoke handler::unlock_row() to
700 clear the flag back to
701 ROW_READ_TRY_SEMI_CONSISTENT and
702 to simply skip the row. If
703 the row matches, the next call to
704 row_search_for_mysql() will lock
705 the row.
706 This eliminates lock waits in some
707 cases; note that this breaks
708 serializability. */
709
710 /** byte offset of the end of the last requested column*/
712
713 /** length in bytes of a row in the MySQL format */
715
716 /** number of rows fetched after positioning the current cursor */
718
719 /** ROW_SEL_NEXT or ROW_SEL_PREV */
721
723 /*!< a cache for fetched rows if we
724 fetch many rows from the same cursor:
725 it saves CPU time to fetch them in a
726 batch; we reserve mysql_row_len
727 bytes for each such row; these
728 pointers point 4 bytes past the
729 allocated mem buf start, because
730 there is a 4 byte magic number at the
731 start and at the end */
732 ulint fetch_cache_first; /*!< position of the first not yet
733 fetched row in fetch_cache */
734 ulint n_fetch_cached; /*!< number of not yet fetched rows
735 in fetch_cache */
736 mem_heap_t *blob_heap; /*!< in SELECTS BLOB fields are copied
737 to this heap */
738 mem_heap_t *old_vers_heap; /*!< memory heap where a previous
739 version is built in consistent read */
740 enum {
744 };
745 /** normally false;
746 if session is using READ COMMITTED or READ UNCOMMITTED isolation level, set in
747 row_search_for_mysql() if we set a new record lock on the secondary or
748 clustered index;
749 this is used in row_try_unlock() when releasing the lock under the cursor if
750 we determine after retrieving the row that it does not need to be locked
751 ('mini-rollback')
752
753 [LOCK_PCUR] corresponds to pcur, the first index we looked up
754 (can be secondary or clustered!)
755
756 [LOCK_CLUST_PCUR] corresponds to clust_pcur, which if used at all, is always
757 the clustered index.
758
759 The meaning of these booleans is:
760 true = we've created a rec lock, which we might release as we "own" it
761 false = we should not release any lock for this index as we either reused
762 some existing lock, or there is some other reason, we should keep it
763 */
764 std::bitset<LOCK_COUNT> new_rec_lock;
765 bool keep_other_fields_on_keyread; /*!< when using fetch
766 cache with HA_EXTRA_KEYREAD, don't
767 overwrite other fields in mysql row
768 row buffer.*/
769 bool in_fts_query; /*!< Whether we are in a FTS query */
770 bool fts_doc_id_in_read_set; /*!< true if table has externally
771 defined FTS_DOC_ID coulmn. */
772 /*----------------------*/
774 /*!< last value of AUTO-INC interval */
775 ulonglong autoinc_increment; /*!< The increment step of the auto
776 increment column. Value must be
777 greater than or equal to 1. Required to
778 calculate the next value */
779 ulonglong autoinc_offset; /*!< The offset passed to
780 get_auto_increment() by MySQL. Required
781 to calculate the next value */
782 dberr_t autoinc_error; /*!< The actual error code encountered
783 while trying to init or read the
784 autoinc value from the table. We
785 store it here so that we can return
786 it to MySQL */
787 /*----------------------*/
788 bool idx_cond; /*!< True if index condition pushdown
789 is used, false otherwise. */
790 ulint idx_cond_n_cols; /*!< Number of fields in idx_cond_cols.
791 0 if and only if idx_cond == false. */
792 /*----------------------*/
793 unsigned innodb_api : 1; /*!< whether this is a InnoDB API
794 query */
795 const rec_t *innodb_api_rec; /*!< InnoDB API search result */
796 void *innodb_api_buf; /*!< Buffer holding copy of the physical
797 Innodb API search record */
798 ulint innodb_api_rec_size; /*!< Size of the Innodb API record */
799 /*----------------------*/
800
801 /*----------------------*/
802 rtr_info_t *rtr_info; /*!< R-tree Search Info */
803 /*----------------------*/
804
805 ulint magic_n2; /*!< this should be the same as
806 magic_n */
807
808 bool ins_sel_stmt; /*!< if true then ins_sel_statement. */
809
810 innodb_session_t *session; /*!< InnoDB session handler. */
811 byte *srch_key_val1; /*!< buffer used in converting
812 search key values from MySQL format
813 to InnoDB format.*/
814 byte *srch_key_val2; /*!< buffer used in converting
815 search key values from MySQL format
816 to InnoDB format.*/
817 uint srch_key_val_len; /*!< Size of search key */
818 /** Disable prefetch. */
820
821 /** true, if server has called ha_extra(HA_EXTRA_NO_READ_LOCKING) */
823
824 /** true, if we were asked to skip AUTOINC locking for the table. */
826
827 /** Return materialized key for secondary index scan */
829
830 /** Whether this is a temporary(intrinsic) table read to keep the position
831 for this MySQL TABLE object */
833
834 /** Whether tree modifying operation happened on a temporary (intrinsic)
835 table index tree. In this case, it could be split, but no shrink. */
837
838 /** The MySQL table object */
840
841 /** The MySQL handler object. */
843
844 /** limit value to avoid fts result overflow */
846
847 /** True if exceeded the end_range while filling the prefetch cache. */
849
850 /** Undo information for LOB mvcc */
852
854
856
857 /** Can a record buffer or a prefetch cache be utilized for prefetching
858 records in this scan?
859 @retval true if records can be prefetched
860 @retval false if records cannot be prefetched */
861 bool can_prefetch_records() const;
862
863 /** Determines if the query is REPLACE or ON DUPLICATE KEY UPDATE in which
864 case duplicate values should be allowed (and further processed) instead of
865 causing an error.
866 @return true iff duplicated values should be allowed */
868
869 /** This is an no-op unless trx is using a READ COMMITTED or READ UNCOMMITTED
870 isolation level.
871 Before calling this function row_search_for_mysql() must have stored to
872 new_rec_locks[] the information which new record locks really were set.
873 This function removes a newly set index record locks under pcur or clust_pcur.
874 Thus, this implements a 'mini-rollback' that releases the latest index record
875 locks we've just set.
876
877 @param[in] has_latches_on_recs true if called so that we have the
878 latches on the records under pcur
879 and clust_pcur, and we do not need
880 to reposition the cursors. */
881 void try_unlock(bool has_latches_on_recs);
882
883 private:
884 /** A helper function for init_search_tuples_types() which prepares the shape
885 of the tuple to match the index
886 @param[in] tuple this->search_tuple or this->m_stop_tuple */
890 }
891
892 public:
893 /** Counts how many elements of @see new_rec_lock[] array are set to true. */
894 size_t new_rec_locks_count() const { return new_rec_lock.count(); }
895
896 /** Initializes search_tuple and m_stop_tuple shape so they match the index */
900 }
901
902 /** Resets both search_tuple and m_stop_tuple */
906 }
907
908 /** Inside this function perform activity that needs to be done at the
909 end of statement. */
910 void end_stmt();
911
912 /** @return true iff the operation can skip concurrency ticket. */
913 bool skip_concurrency_ticket() const;
914
915 /** It is unsafe to copy this struct, and moving it would be non-trivial,
916 because we want to keep in sync with row_is_reading_range_guard_t. Therefore
917 it is much safer/easier to just forbid such operations. */
922};
923
924/** Callback for row_mysql_sys_index_iterate() */
926 virtual ~SysIndexCallback() = default;
927
928 /** Callback method
929 @param mtr current mini-transaction
930 @param pcur persistent cursor. */
931 virtual void operator()(mtr_t *mtr, btr_pcur_t *pcur) noexcept = 0;
932};
933
934/** Get the updated parent field value from the update vector for the
935given col_no.
936@param[in] foreign foreign key information
937@param[in] update updated parent vector.
938@param[in] col_no base column position of the child table to check
939@return updated field from the parent update vector, else NULL */
941 upd_t *update, uint32_t col_no);
942
943/** Get the computed value by supplying the base column values.
944@param[in,out] row the data row
945@param[in] col virtual column
946@param[in] index index on the virtual column
947@param[in,out] local_heap heap memory for processing large data etc.
948@param[in,out] heap memory heap that copies the actual index row
949@param[in] ifield index field
950@param[in] thd MySQL thread handle
951@param[in,out] mysql_table mysql table object
952@param[in] old_table during ALTER TABLE, this is the old table
953 or NULL.
954@param[in] parent_update update vector for the parent row
955@param[in] foreign foreign key information
956@return the field filled with computed value, or NULL if just want
957to store the value in passed in "my_rec" */
959 const dtuple_t *row, const dict_v_col_t *col, const dict_index_t *index,
960 mem_heap_t **local_heap, mem_heap_t *heap, const dict_field_t *ifield,
961 THD *thd, TABLE *mysql_table, const dict_table_t *old_table,
962 upd_t *parent_update, dict_foreign_t *foreign);
963
964/** Parse out multi-values from a MySQL record
965@param[in] mysql_table MySQL table structure
966@param[in] f_idx field index of the multi-value column
967@param[in,out] dfield field structure to store parsed multi-value
968@param[in,out] value nullptr or the multi-value structure
969 to store the parsed values
970@param[in] old_val old value if exists
971@param[in] comp true if InnoDB table uses compact row format
972@param[in,out] heap memory heap */
973void innobase_get_multi_value(const TABLE *mysql_table, ulint f_idx,
974 dfield_t *dfield, multi_value_data *value,
975 uint old_val, ulint comp, mem_heap_t *heap);
976
977/** Get the computed value by supplying the base column values.
978@param[in,out] table the table whose virtual column template to be built */
980
981/** Change dbname and table name in table->vc_templ.
982@param[in,out] table the table whose virtual column template
983dbname and tbname to be renamed. */
985
986constexpr uint32_t ROW_PREBUILT_FETCH_MAGIC_N = 465765687;
987
988constexpr uint32_t ROW_MYSQL_WHOLE_ROW = 0;
989constexpr uint32_t ROW_MYSQL_REC_FIELDS = 1;
990constexpr uint32_t ROW_MYSQL_NO_TEMPLATE = 2;
991/** dummy template used in row_scan_and_check_index */
992constexpr uint32_t ROW_MYSQL_DUMMY_TEMPLATE = 3;
993
994/* Values for hint_need_to_fetch_extra_cols */
995constexpr uint32_t ROW_RETRIEVE_PRIMARY_KEY = 1;
996constexpr uint32_t ROW_RETRIEVE_ALL_COLS = 2;
997
998/* Values for row_read_type */
999constexpr uint32_t ROW_READ_WITH_LOCKS = 0;
1000constexpr uint32_t ROW_READ_TRY_SEMI_CONSISTENT = 1;
1001constexpr uint32_t ROW_READ_DID_SEMI_CONSISTENT = 2;
1002
1003#ifdef UNIV_DEBUG
1004/** Wait for the background drop list to become empty. */
1006#endif /* UNIV_DEBUG */
1007#endif /* !UNIV_HOTBACKUP */
1008
1009#endif /* row0mysql.h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:47
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:36
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:4573
Definition: sess0sess.h:71
row_is_reading_range_guard_t(row_prebuilt_t &prebuilt)
Definition: row0mysql.h:656
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:79
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:94
static const char * filepath
Definition: myisamlog.cc:97
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
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:61
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:990
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:3732
void innobase_rename_vc_templ(dict_table_t *table)
Change dbname and table name in table->vc_templ.
Definition: ha_innodb.cc:23791
constexpr uint32_t ROW_PREBUILT_ALLOCATED
Definition: row0mysql.h:509
constexpr uint32_t ROW_READ_WITH_LOCKS
Definition: row0mysql.h:999
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:3568
constexpr uint32_t ROW_PREBUILT_FETCH_MAGIC_N
Definition: row0mysql.h:986
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:995
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:2870
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:23844
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:4338
constexpr uint32_t ROW_MYSQL_DUMMY_TEMPLATE
dummy template used in row_scan_and_check_index
Definition: row0mysql.h:992
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:9228
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:4536
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:2720
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:2565
void row_mysql_unlock_data_dictionary(trx_t *trx)
Unlocks the data dictionary exclusive lock.
Definition: row0mysql.cc:2707
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:2680
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:3513
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:3027
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:2439
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:988
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:3132
constexpr uint32_t ROW_READ_DID_SEMI_CONSISTENT
Definition: row0mysql.h:1001
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:23802
constexpr uint32_t ROW_RETRIEVE_ALL_COLS
Definition: row0mysql.h:996
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:2671
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:4120
void row_mysql_close(void)
Close this module.
Definition: row0mysql.cc:4743
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:4132
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:989
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:2693
constexpr uint32_t ROW_READ_TRY_SEMI_CONSISTENT
Definition: row0mysql.h:1000
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:23757
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:4736
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:2657
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:2452
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:3695
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:29
Struct to hold information about the table that should be created.
Definition: handler.h:3202
Callback for row_mysql_sys_index_iterate()
Definition: row0mysql.h:925
virtual ~SysIndexCallback()=default
virtual void operator()(mtr_t *mtr, btr_pcur_t *pcur) noexcept=0
Callback method.
Definition: table.h:1407
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
space_id_t space
Space where the clustered index of the table is placed.
Definition: dict0mem.h:1997
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:684
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:828
trx_id_t trx_id
The table->def_trx_id when ins_graph was built.
Definition: row0mysql.h:621
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:545
byte * srch_key_val2
buffer used in converting search key values from MySQL format to InnoDB format.
Definition: row0mysql.h:814
upd_node_t * upd_node
Innobase SQL update node used to perform updates and deletes.
Definition: row0mysql.h:619
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:526
row_prebuilt_t(row_prebuilt_t &&)=delete
innodb_session_t * session
InnoDB session handler.
Definition: row0mysql.h:810
multi_value_data * mv_data
Definition: row0mysql.h:607
dict_table_t * table
Innobase table handle.
Definition: row0mysql.h:522
const byte * default_rec
the default values of all columns (a "default row") in MySQL format
Definition: row0mysql.h:608
ulonglong m_fts_limit
limit value to avoid fts result overflow
Definition: row0mysql.h:845
void lob_undo_reset()
Definition: row0mysql.h:855
unsigned replace
1 if extra(HA_EXTRA_WRITE_CAN_REPLACE) was requested, which happen when REPLACE is done instead of re...
Definition: row0mysql.h:586
size_t new_rec_locks_count() const
Counts how many elements of.
Definition: row0mysql.h:894
dtuple_t * search_tuple
prebuilt dtuple used in selects
Definition: row0mysql.h:634
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:610
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:590
ulint mysql_prefix_len
byte offset of the end of the last requested column
Definition: row0mysql.h:711
doc_id_t fts_doc_id
Definition: row0mysql.h:673
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:765
@ LOCK_PCUR
Definition: row0mysql.h:741
@ LOCK_COUNT
Definition: row0mysql.h:743
@ LOCK_CLUST_PCUR
Definition: row0mysql.h:742
ulint select_lock_type
LOCK_NONE, LOCK_S, or LOCK_X.
Definition: row0mysql.h:681
bool no_autoinc_locking
true, if we were asked to skip AUTOINC locking for the table.
Definition: row0mysql.h:825
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:779
void end_stmt()
Inside this function perform activity that needs to be done at the end of statement.
Definition: row0mysql.cc:4806
ulint innodb_api_rec_size
Size of the Innodb API record.
Definition: row0mysql.h:798
unsigned innodb_api
whether this is a InnoDB API query
Definition: row0mysql.h:793
btr_pcur_t * clust_pcur
persistent cursor used in some selects and updates
Definition: row0mysql.h:630
unsigned templ_contains_fixed_point
true if the template contains a column with DATA_POINT.
Definition: row0mysql.h:573
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:558
bool ins_sel_stmt
if true then ins_sel_statement.
Definition: row0mysql.h:808
mem_heap_t * blob_heap
in SELECTS BLOB fields are copied to this heap
Definition: row0mysql.h:736
bool m_is_reading_range
Set to true iff we are inside read_range_first() or read_range_next()
Definition: row0mysql.h:649
ins_node_t * ins_node
Innobase SQL insert node used to perform inserts to the table.
Definition: row0mysql.h:600
bool m_no_prefetch
Disable prefetch.
Definition: row0mysql.h:819
unsigned n_template
number of elements in the template
Definition: row0mysql.h:556
bool m_temp_tree_modified
Whether tree modifying operation happened on a temporary (intrinsic) table index tree.
Definition: row0mysql.h:836
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:582
btr_pcur_t * pcur
persistent cursor used in selects and updates
Definition: row0mysql.h:628
ulint n_fetch_cached
number of not yet fetched rows in fetch_cache
Definition: row0mysql.h:734
std::bitset< LOCK_COUNT > new_rec_lock
normally false; if session is using READ COMMITTED or READ UNCOMMITTED isolation level,...
Definition: row0mysql.h:764
lob::undo_vers_t * get_lob_undo()
Definition: row0mysql.h:853
mem_heap_t * cursor_heap
memory heap from which innodb_api_buf is allocated per session
Definition: row0mysql.h:597
ulonglong autoinc_increment
The increment step of the auto increment column.
Definition: row0mysql.h:775
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:566
ulint idx_cond_n_cols
Number of fields in idx_cond_cols.
Definition: row0mysql.h:790
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:684
lob::undo_vers_t m_lob_undo
Undo information for LOB mvcc.
Definition: row0mysql.h:851
ha_innobase * m_mysql_handler
The MySQL handler object.
Definition: row0mysql.h:842
bool in_fts_query
Whether we are in a FTS query.
Definition: row0mysql.h:769
bool no_read_locking
true, if server has called ha_extra(HA_EXTRA_NO_READ_LOCKING)
Definition: row0mysql.h:822
mem_heap_t * old_vers_heap
memory heap where a previous version is built in consistent read
Definition: row0mysql.h:738
bool is_reading_range() const
Definition: row0mysql.h:652
bool skip_concurrency_ticket() const
Definition: row0mysql.cc:4770
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:2485
ulint fetch_direction
ROW_SEL_NEXT or ROW_SEL_PREV.
Definition: row0mysql.h:720
ulint n_rows_fetched
number of rows fetched after positioning the current cursor
Definition: row0mysql.h:717
bool allow_duplicates()
Determines if the query is REPLACE or ON DUPLICATE KEY UPDATE in which case duplicate values should b...
Definition: row0mysql.h:867
ulint mysql_row_len
length in bytes of a row in the MySQL format
Definition: row0mysql.h:714
byte * srch_key_val1
buffer used in converting search key values from MySQL format to InnoDB format.
Definition: row0mysql.h:811
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:561
que_fork_t * upd_graph
Innobase SQL query graph used in updates or deletes.
Definition: row0mysql.h:626
dtuple_t * m_stop_tuple
prebuilt dtuple used in selects where the end of range is known
Definition: row0mysql.h:637
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:645
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:722
dberr_t autoinc_error
The actual error code encountered while trying to init or read the autoinc value from the table.
Definition: row0mysql.h:782
bool idx_cond
True if index condition pushdown is used, false otherwise.
Definition: row0mysql.h:788
byte * ins_upd_rec_buff
buffer for storing data converted to the Innobase format from the MySQL format
Definition: row0mysql.h:604
trx_t * trx
current transaction handle
Definition: row0mysql.h:525
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:539
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:832
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:668
TABLE * m_mysql_table
The MySQL table object.
Definition: row0mysql.h:839
const rec_t * innodb_api_rec
InnoDB API search result.
Definition: row0mysql.h:795
space_id_t space_id() const
Definition: row0mysql.h:520
void init_search_tuples_types()
Initializes search_tuple and m_stop_tuple shape so they match the index.
Definition: row0mysql.h:897
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:530
unsigned index_usable
caches the value of index->is_usable(trx)
Definition: row0mysql.h:537
void * innodb_api_buf
Buffer holding copy of the physical Innodb API search record.
Definition: row0mysql.h:796
row_is_reading_range_guard_t get_is_reading_range_guard()
Definition: row0mysql.h:660
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:887
bool can_prefetch_records() const
Can a record buffer or a prefetch cache be utilized for prefetching records in this scan?
Definition: row0mysql.cc:4755
rtr_info_t * rtr_info
R-tree Search Info.
Definition: row0mysql.h:802
ulint fetch_cache_first
position of the first not yet fetched row in fetch_cache
Definition: row0mysql.h:732
bool m_end_range
True if exceeded the end_range while filling the prefetch cache.
Definition: row0mysql.h:848
enum select_mode select_mode
SELECT_ORDINARY, SELECT_SKIP_LOKCED, or SELECT_NO_WAIT.
Definition: row0mysql.h:682
dtuple_t * clust_ref
prebuilt dtuple used in sel/upd/del
Definition: row0mysql.h:679
void clear_search_tuples()
Resets both search_tuple and m_stop_tuple.
Definition: row0mysql.h:903
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:623
ulonglong autoinc_last_value
last value of AUTO-INC interval
Definition: row0mysql.h:773
uint srch_key_val_len
Size of search key.
Definition: row0mysql.h:817
bool fts_doc_id_in_read_set
true if table has externally defined FTS_DOC_ID coulmn.
Definition: row0mysql.h:770
mem_heap_t * heap
memory heap from which these auxiliary structures are allocated when needed
Definition: row0mysql.h:594
unsigned template_type
ROW_MYSQL_WHOLE_ROW, ROW_MYSQL_REC_FIELDS, ROW_MYSQL_DUMMY_TEMPLATE, or ROW_MYSQL_NO_TEMPLATE.
Definition: row0mysql.h:552
dict_index_t * index
current index for a search, if any
Definition: row0mysql.h:523
que_fork_t * sel_graph
dummy query graph used in selects
Definition: row0mysql.h:632
ulint magic_n2
this should be the same as magic_n
Definition: row0mysql.h:805
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:36
Transaction system global type definitions.
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
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:105