MySQL 26.7.0
Source Code Documentation
row0sel.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1997, 2026, 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/row0sel.h
29 Select
30
31 Created 12/19/1997 Heikki Tuuri
32 *******************************************************/
33
34#ifndef row0sel_h
35#define row0sel_h
36
37#include "univ.i"
38
39#include "btr0pcur.h"
40#include "data0data.h"
41#include "dict0stats.h"
42#include "dict0types.h"
43#include "pars0sym.h"
44#include "que0types.h"
45#include "row0mysql.h"
46#include "row0types.h"
47#include "trx0types.h"
48
50
51/** Creates a select node struct.
52 @return own: select node struct */
54 mem_heap_t *heap); /*!< in: memory heap where created */
55/** Frees the memory private to a select node when a query graph is freed,
56 does not free the heap where the node was originally created. */
57void sel_node_free_private(sel_node_t *node); /*!< in: select node struct */
58/** Frees a prefetch buffer for a column, including the dynamically allocated
59 memory for data stored there. */
61 sel_buf_t *prefetch_buf); /*!< in, own: prefetch buffer */
62
63/** Gets the plan node for the nth table in a join.
64@param[in] node select node
65@param[in] i get ith plan node
66@return plan node */
68
69/** Performs a select step. This is a high-level function used in SQL execution
70 graphs.
71 @return query thread to run next or NULL */
72que_thr_t *row_sel_step(que_thr_t *thr); /*!< in: query thread */
73/** Performs an execution step of an open or close cursor statement node.
74 @return query thread to run next or NULL */
75static inline que_thr_t *open_step(que_thr_t *thr); /*!< in: query thread */
76/** Performs a fetch for a cursor.
77 @return query thread to run next or NULL */
78que_thr_t *fetch_step(que_thr_t *thr); /*!< in: query thread */
79
80/** Copy used fields from cached row.
81Copy cache record field by field, don't touch fields that
82are not covered by current key.
83@param[out] buf Where to copy the MySQL row.
84@param[in] cached_rec What to copy (in MySQL row format).
85@param[in] prebuilt prebuilt struct. */
86void row_sel_copy_cached_fields_for_mysql(byte *buf, const byte *cached_rec,
87 row_prebuilt_t *prebuilt);
88
89// clang-format off
90/** Convert a row in the Innobase format to a row in the MySQL format.
91Note that the template in prebuilt may advise us to copy only a few
92columns to mysql_rec, other columns are left blank. All columns may not
93be needed in the query.
94@param[out] mysql_rec row in the MySQL format
95@param[in,out] prebuilt prebuilt structure
96@param[in] rec Innobase record in the index
97 which was described in prebuilt's
98 template, or in the clustered index;
99 must be protected by a page latch
100@param[in] vrow virtual columns
101@param[in] rec_clust true if rec is in the clustered index
102 instead of index which could belong to
103 prebuilt->index
104@param[in] rec_index index of rec
105@param[in] prebuilt_index prebuilt->index
106@param[in] offsets array returned by rec_get_offsets(rec)
107@param[in] clust_templ_for_sec true if rec belongs to secondary index
108 but the prebuilt->template is in
109 clustered index format and it
110 is used only for end range comparison
111@param[in] lob_undo the LOB undo information.
112@param[in,out] blob_heap If not null then use this heap for BLOBs
113@return true on success, false if not all columns could be retrieved */
114// clang-format on
115bool row_sel_store_mysql_rec(byte *mysql_rec, row_prebuilt_t *prebuilt,
116 const rec_t *rec, const dtuple_t *vrow,
117 bool rec_clust, const dict_index_t *rec_index,
118 const dict_index_t *prebuilt_index,
119 const ulint *offsets, bool clust_templ_for_sec,
120 lob::undo_vers_t *lob_undo,
121 mem_heap_t *&blob_heap);
122
123/** Converts a key value stored in MySQL format to an Innobase dtuple. The last
124field of the key value may be just a prefix of a fixed length field: hence
125the parameter key_len. But currently we do not allow search keys where the
126last field is only a prefix of the full key field len and print a warning if
127such appears.
128@param[in,out] tuple Tuple where to build; NOTE: we assume that the type info in
129the tuple is already according to index!
130@param[in] buf Buffer to use in field conversions; NOTE that dtuple->data may
131end up pointing inside buf so do not discard that buffer while the tuple is
132being used. See row_mysql_store_col_in_innobase_format() in the case of
133DATA_INT.
134@param[in] buf_len Buffer length.
135@param[in] index Index of the key value.
136@param[in] key_ptr MySQL key value
137@param[in] key_len MySQL key value length
138*/
140 ulint buf_len, dict_index_t *index,
141 const byte *key_ptr, ulint key_len);
142
143/** Searches for rows in the database. This is used in the interface to
144MySQL. This function opens a cursor, and also implements fetch next
145and fetch prev. NOTE that if we do a search with a full key value
146from a unique index (ROW_SEL_EXACT), then we will not store the cursor
147position and fetch next or fetch prev must not be tried to the cursor!
148
149@param[out] buf buffer for the fetched row in MySQL format
150@param[in] mode search mode PAGE_CUR_L
151@param[in,out] prebuilt prebuilt struct for the table handler;
152 this contains the info to search_tuple,
153 index; if search tuple contains 0 field then
154 we position the cursor at start or the end of
155 index, depending on 'mode'
156@param[in] match_mode 0 or ROW_SEL_EXACT or ROW_SEL_EXACT_PREFIX
157@param[in] direction 0 or ROW_SEL_NEXT or ROW_SEL_PREV;
158 Note: if this is != 0, then prebuilt must has a
159 pcur with stored position! In opening of a
160 cursor 'direction' should be 0.
161@return DB_SUCCESS, DB_RECORD_NOT_FOUND, DB_END_OF_INDEX, DB_DEADLOCK,
162DB_LOCK_TABLE_FULL, DB_CORRUPTION, or DB_TOO_BIG_RECORD */
163[[nodiscard]] static inline dberr_t row_search_for_mysql(
164 byte *buf, page_cur_mode_t mode, row_prebuilt_t *prebuilt, ulint match_mode,
165 ulint direction);
166
167/** Searches for rows in the database using cursor.
168Function is for temporary tables that are not shared across connections
169and so lot of complexity is reduced especially locking and transaction related.
170The cursor is an iterator over the table/index.
171
172@param[out] buf buffer for the fetched row in MySQL format
173@param[in] mode search mode PAGE_CUR_L
174@param[in,out] prebuilt prebuilt struct for the table handler;
175 this contains the info to search_tuple,
176 index; if search tuple contains 0 field then
177 we position the cursor at start or the end of
178 index, depending on 'mode'
179@param[in] match_mode 0 or ROW_SEL_EXACT or ROW_SEL_EXACT_PREFIX
180@param[in] direction 0 or ROW_SEL_NEXT or ROW_SEL_PREV;
181 Note: if this is != 0, then prebuilt must has a
182 pcur with stored position! In opening of a
183 cursor 'direction' should be 0.
184@return DB_SUCCESS or error code */
186 row_prebuilt_t *prebuilt,
187 ulint match_mode, ulint direction);
188
189/** Searches for rows in the database using cursor.
190Function is mainly used for tables that are shared accorss connection and
191so it employs technique that can help re-construct the rows that
192transaction is suppose to see.
193It also has optimization such as pre-caching the rows, using AHI, etc.
194
195@param[out] buf buffer for the fetched row in MySQL format
196@param[in] mode search mode PAGE_CUR_L
197@param[in,out] prebuilt prebuilt struct for the table handler;
198 this contains the info to search_tuple,
199 index; if search tuple contains 0 field then
200 we position the cursor at start or the end of
201 index, depending on 'mode'
202@param[in] match_mode 0 or ROW_SEL_EXACT or ROW_SEL_EXACT_PREFIX
203@param[in] direction 0 or ROW_SEL_NEXT or ROW_SEL_PREV;
204 Note: if this is != 0, then prebuilt must has a
205 pcur with stored position! In opening of a
206 cursor 'direction' should be 0.
207@return DB_SUCCESS or error code */
208[[nodiscard]] dberr_t row_search_mvcc(byte *buf, page_cur_mode_t mode,
209 row_prebuilt_t *prebuilt,
210 ulint match_mode, const ulint direction);
211
212/** Count rows in a R-Tree leaf level.
213 @return DB_SUCCESS if successful */
215 row_prebuilt_t *prebuilt, /*!< in: prebuilt struct for the
216 table handle; this contains the info
217 of search_tuple, index; if search
218 tuple contains 0 fields then we
219 position the cursor at the start or
220 the end of the index, depending on
221 'mode' */
222 ulint *n_rows, /*!< out: number of entries
223 seen in the consistent read */
224 ulint *n_dups); /*!< out: number of dup entries
225 seen in the consistent read */
226
227/** Read the max AUTOINC value from an index.
228 @return DB_SUCCESS if all OK else error code */
229[[nodiscard]] dberr_t row_search_max_autoinc(
230 dict_index_t *index, /*!< in: index to search */
231 const char *col_name, /*!< in: autoinc column name */
232 uint64_t *value); /*!< out: AUTOINC value read */
233
234/** A structure for caching column values for prefetched rows */
235struct sel_buf_t {
236 byte *data; /*!< data, or NULL; if not NULL, this field
237 has allocated memory which must be explicitly
238 freed; can be != NULL even when len is
239 UNIV_SQL_NULL */
240 ulint len; /*!< data length or UNIV_SQL_NULL */
242 /*!< size of memory buffer allocated for data:
243 this can be more than len; this is defined
244 when data != NULL */
245};
246
247/** Query plan */
248struct plan_t {
249 dict_table_t *table; /*!< table struct in the dictionary
250 cache */
251 dict_index_t *index; /*!< table index used in the search */
252 btr_pcur_t pcur; /*!< persistent cursor used to search
253 the index */
254 bool asc; /*!< true if cursor traveling upwards */
255 bool pcur_is_open; /*!< true if pcur has been positioned
256 and we can try to fetch new rows */
257 bool cursor_at_end; /*!< true if the cursor is open but
258 we know that there are no more
259 qualifying rows left to retrieve from
260 the index tree; NOTE though, that
261 there may still be unprocessed rows in
262 the prefetch stack; always false when
263 pcur_is_open is false */
265 /*!< true if the pcur position has been
266 stored and the record it is positioned
267 on has already been processed */
268 que_node_t **tuple_exps; /*!< array of expressions
269 which are used to calculate
270 the field values in the search
271 tuple: there is one expression
272 for each field in the search
273 tuple */
274 dtuple_t *tuple; /*!< search tuple */
275 page_cur_mode_t mode; /*!< search mode: PAGE_CUR_G, ... */
276 ulint n_exact_match; /*!< number of first fields in
277 the search tuple which must be
278 exactly matched */
279 bool unique_search; /*!< true if we are searching an
280 index record with a unique key */
281 ulint n_rows_fetched; /*!< number of rows fetched using pcur
282 after it was opened */
283 ulint n_rows_prefetched; /*!< number of prefetched rows cached
284 for fetch: fetching several rows in
285 the same mtr saves CPU time */
286 ulint first_prefetched; /*!< index of the first cached row in
287 select buffer arrays for each column */
288 bool no_prefetch; /*!< no prefetch for this table */
289 sym_node_list_t columns; /*!< symbol table nodes for the columns
290 to retrieve from the table */
292 /** conditions which determine the fetch limit of the index segment we have to
293 look at: when one of these fails, the result set has been exhausted for the
294 cursor in this index; these conditions are normalized so that in a comparison
295 the column for this table is the first argument */
297 /** the rest of search conditions we can test at this table in a join */
299 bool must_get_clust; /*!< true if index is a non-clustered
300 index and we must also fetch the
301 clustered index record; this is the
302 case if the non-clustered record does
303 not contain all the needed columns, or
304 if this is a single-table explicit
305 cursor, or a searched update or
306 delete */
307 ulint *clust_map; /*!< map telling how clust_ref is built
308 from the fields of a non-clustered
309 record */
310 dtuple_t *clust_ref; /*!< the reference to the clustered
311 index entry is built here if index is
312 a non-clustered index */
313 btr_pcur_t clust_pcur; /*!< if index is non-clustered, we use
314 this pcur to search the clustered
315 index */
316 mem_heap_t *old_vers_heap; /*!< memory heap used in building an old
317 version of a row, or NULL */
318};
319
320/** Select node states */
322 SEL_NODE_CLOSED, /*!< it is a declared cursor which is not
323 currently open */
324 SEL_NODE_OPEN, /*!< intention locks not yet set on tables */
325 SEL_NODE_FETCH, /*!< intention locks have been set */
326 SEL_NODE_NO_MORE_ROWS /*!< cursor has reached the result set end */
328
329/** Select statement node */
331 /** node type: QUE_NODE_SELECT */
333 /** node state */
335 /** select list */
337 /** variables list or NULL */
339 /** table list */
341 /** true if the rows should be fetched in an ascending order */
342 bool asc;
343 /** true if the cursor is for update or delete, which means that a row x-lock
344 should be placed on the cursor row */
346 /** LOCK_X or LOCK_S */
348 /** number of tables */
350 /** number of the next table to access in the join */
352 /** array of n_tables many plan nodes containing the search plan and the
353 search data structures */
355 /** search condition */
357 /** if the query is a non-locking consistent read, its read view is placed
358 here, otherwise NULL */
360 /** true if the select is a consistent, non-locking read */
362 /** order by column definition, or NULL */
364 /** true if the select list consists of aggregate functions */
366 /** true if the aggregate row has already been fetched for the current cursor
367 */
369 /** this is true if the select is in a single-table explicit cursor which can
370 get updated within the stored procedure, or in a searched update or delete;
371 NOTE that to determine of an explicit cursor if it can get updated, the
372 parser checks from a stored procedure if it contains positioned update or
373 delete statements */
375 /** not NULL if an explicit cursor */
377 /** variables whose values we have to copy when an explicit cursor is opened,
378 so that they do not change between fetches */
379 sym_node_list_t copy_variables;
380};
381
382/** Fetch statement node */
384 que_common_t common; /*!< type: QUE_NODE_FETCH */
385 sel_node_t *cursor_def; /*!< cursor definition */
386 sym_node_t *into_list; /*!< variables to set */
387
388 pars_user_func_t *func; /*!< User callback function or NULL.
389 The first argument to the function
390 is a sel_node_t*, containing the
391 results of the SELECT operation for
392 one row. If the function returns
393 NULL, it is not interested in
394 further rows and the cursor is
395 modified so (cursor % NOTFOUND) is
396 true. If it returns not-NULL,
397 continue normally. */
398};
399
400/** Open or close cursor operation type */
402 ROW_SEL_OPEN_CURSOR, /*!< open cursor */
403 ROW_SEL_CLOSE_CURSOR /*!< close cursor */
405
406/** Open or close cursor statement node */
408 que_common_t common; /*!< type: QUE_NODE_OPEN */
409 enum open_node_op op_type; /*!< operation type: open or
410 close cursor */
411 sel_node_t *cursor_def; /*!< cursor definition */
412};
413
414/** Search direction for the MySQL interface */
416 ROW_SEL_NEXT = 1, /*!< ascending direction */
417 ROW_SEL_PREV = 2 /*!< descending direction */
419
420/** Match mode for the MySQL interface */
422 ROW_SEL_EXACT = 1, /*!< search using a complete key value */
423 ROW_SEL_EXACT_PREFIX /*!< search using a key prefix which
424 must match rows: the prefix may
425 contain an incomplete field (the last
426 field in prefix may be just a prefix
427 of a fixed length column) */
429
430/** Stores a non-SQL-NULL field in the MySQL format. The counterpart of this
431function is row_mysql_store_col_in_innobase_format() in row0mysql.cc.
432@param[in,out] dest buffer where to store; NOTE
433 that BLOBs are not in themselves stored
434 here: the caller must allocate and copy
435 the BLOB into buffer before, and pass
436 the pointer to the BLOB in 'data'
437@param[in] templ MySQL column template. Its following fields
438 are referenced: type, is_unsigned,
439mysql_col_len, mbminlen, mbmaxlen
440@param[in] index InnoDB index
441@param[in] field_no templ->rec_field_no or templ->clust_rec_field_no
442 or templ->icp_rec_field_no
443@param[in] data data to store
444@param[in] len length of the data
445@param[in] sec_field secondary index field no if the secondary index
446 record but the prebuilt template is in
447 clustered index format and used only for end
448 range comparison. */
450 byte *dest, const mysql_row_templ_t *templ, const dict_index_t *index,
451 IF_DEBUG(ulint field_no, ) const byte *data,
452 ulint len IF_DEBUG(, ulint sec_field));
453
454/** Convert a non-SQL-NULL field from Innobase format to MySQL format. */
456 byte *dest, const mysql_row_templ_t *templ, const dict_index_t *idx,
457 ulint field, const byte *src, ulint len, ulint sec) {
459 dest, templ, idx, IF_DEBUG(field, ) src, len IF_DEBUG(, sec));
460}
461
462/** Search the record present in innodb_table_stats table using
463db_name, table_name and fill it in table stats structure.
464@param[in] db_name database name
465@param[in] tbl_name table name
466@param[out] table_stats stats table structure.
467@return true if successful else false. */
468bool row_search_table_stats(const char *db_name, const char *tbl_name,
469 TableStatsRecord &table_stats);
470
471/** Search the record present in innodb_index_stats using
472db_name, table name and index_name and fill the
473cardinality for the each column.
474@param[in] db_name database name
475@param[in] tbl_name table name
476@param[in] index_name index name
477@param[in] col_offset offset of the column in the index
478@param[out] cardinality cardinality of the column.
479@return true if successful else false. */
480bool row_search_index_stats(const char *db_name, const char *tbl_name,
481 const char *index_name, ulint col_offset,
482 ulonglong *cardinality);
483
484#include "row0sel.ic"
485
486#endif
The index tree persistent cursor.
Definition: read0read_view_interface.h:33
Represent the record of innodb_table_stats table.
Definition: dict0stats.h:163
static struct my_cs_file_section_st sec[]
Definition: ctype.cc:169
SQL data field and tuple.
dberr_t
Definition: db0err.h:39
Code used for calculating and manipulating table statistics.
Data dictionary global types.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
Definition: buf0block_hint.cc:30
bool index(const std::string &value, const String &search_for, uint32_t *idx)
Definition: contains.h:76
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
const char * db_name
Definition: rules_table_service.cc:55
mode
Definition: file_handle.h:61
page_cur_mode_t
Definition: page0types.h:176
SQL parser symbol table.
Query graph global types.
void que_node_t
Definition: que0types.h:41
byte rec_t
Definition: rem0types.h:41
Interface between Innobase row operations and MySQL.
void sel_node_free_private(sel_node_t *node)
Frees the memory private to a select node when a query graph is freed, does not free the heap where t...
Definition: row0sel.cc:368
bool row_search_index_stats(const char *db_name, const char *tbl_name, const char *index_name, ulint col_offset, ulonglong *cardinality)
Search the record present in innodb_index_stats using db_name, table name and index_name and fill the...
Definition: row0sel.cc:6408
void row_sel_copy_cached_fields_for_mysql(byte *buf, const byte *cached_rec, row_prebuilt_t *prebuilt)
Copy used fields from cached row.
Definition: row0sel.cc:3539
static que_thr_t * open_step(que_thr_t *thr)
Performs an execution step of an open or close cursor statement node.
static plan_t * sel_node_get_nth_plan(sel_node_t *node, ulint i)
Gets the plan node for the nth table in a join.
row_sel_direction
Search direction for the MySQL interface.
Definition: row0sel.h:415
@ ROW_SEL_PREV
descending direction
Definition: row0sel.h:417
@ ROW_SEL_NEXT
ascending direction
Definition: row0sel.h:416
void sel_col_prefetch_buf_free(sel_buf_t *prefetch_buf)
Frees a prefetch buffer for a column, including the dynamically allocated memory for data stored ther...
Definition: row0sel.cc:557
static void row_sel_field_store_in_mysql_format(byte *dest, const mysql_row_templ_t *templ, const dict_index_t *idx, ulint field, const byte *src, ulint len, ulint sec)
Convert a non-SQL-NULL field from Innobase format to MySQL format.
Definition: row0sel.h:455
sel_node_t * sel_node_create(mem_heap_t *heap)
Creates a select node struct.
Definition: row0sel.cc:351
que_thr_t * row_sel_step(que_thr_t *thr)
Performs a select step.
Definition: row0sel.cc:2117
dberr_t row_search_mvcc(byte *buf, page_cur_mode_t mode, row_prebuilt_t *prebuilt, ulint match_mode, const ulint direction)
Searches for rows in the database using cursor.
Definition: row0sel.cc:4437
void row_sel_field_store_in_mysql_format_func(byte *dest, const mysql_row_templ_t *templ, const dict_index_t *index, ulint field_no, const byte *data, ulint len, ulint sec_field)
Stores a non-SQL-NULL field in the MySQL format.
Definition: row0sel.cc:2508
dberr_t row_search_no_mvcc(byte *buf, page_cur_mode_t mode, row_prebuilt_t *prebuilt, ulint match_mode, ulint direction)
Searches for rows in the database using cursor.
Definition: row0sel.cc:3973
sel_node_state
Select node states.
Definition: row0sel.h:321
@ SEL_NODE_NO_MORE_ROWS
cursor has reached the result set end
Definition: row0sel.h:326
@ SEL_NODE_FETCH
intention locks have been set
Definition: row0sel.h:325
@ SEL_NODE_OPEN
intention locks not yet set on tables
Definition: row0sel.h:324
@ SEL_NODE_CLOSED
it is a declared cursor which is not currently open
Definition: row0sel.h:322
que_thr_t * fetch_step(que_thr_t *thr)
Performs a fetch for a cursor.
Definition: row0sel.cc:2216
void row_sel_convert_mysql_key_to_innobase(dtuple_t *tuple, byte *buf, ulint buf_len, dict_index_t *index, const byte *key_ptr, ulint key_len)
Converts a key value stored in MySQL format to an Innobase dtuple.
Definition: row0sel.cc:2266
static dberr_t row_search_for_mysql(byte *buf, page_cur_mode_t mode, row_prebuilt_t *prebuilt, ulint match_mode, ulint direction)
Searches for rows in the database.
row_sel_match_mode
Match mode for the MySQL interface.
Definition: row0sel.h:421
@ ROW_SEL_EXACT_PREFIX
search using a key prefix which must match rows: the prefix may contain an incomplete field (the last...
Definition: row0sel.h:423
@ ROW_SEL_EXACT
search using a complete key value
Definition: row0sel.h:422
dberr_t row_search_max_autoinc(dict_index_t *index, const char *col_name, uint64_t *value)
Read the max AUTOINC value from an index.
Definition: row0sel.cc:6283
dberr_t row_count_rtree_recs(row_prebuilt_t *prebuilt, ulint *n_rows, ulint *n_dups)
Count rows in a R-Tree leaf level.
Definition: row0sel.cc:6087
open_node_op
Open or close cursor operation type.
Definition: row0sel.h:401
@ ROW_SEL_CLOSE_CURSOR
close cursor
Definition: row0sel.h:403
@ ROW_SEL_OPEN_CURSOR
open cursor
Definition: row0sel.h:402
bool row_search_table_stats(const char *db_name, const char *tbl_name, TableStatsRecord &table_stats)
Search the record present in innodb_table_stats table using db_name, table_name and fill it in table ...
Definition: row0sel.cc:6346
bool row_sel_store_mysql_rec(byte *mysql_rec, row_prebuilt_t *prebuilt, const rec_t *rec, const dtuple_t *vrow, bool rec_clust, const dict_index_t *rec_index, const dict_index_t *prebuilt_index, const ulint *offsets, bool clust_templ_for_sec, lob::undo_vers_t *lob_undo, mem_heap_t *&blob_heap)
Convert a row in the Innobase format to a row in the MySQL format.
Definition: row0sel.cc:2910
Select.
Row operation global types.
Definition: btr0pcur.h:99
Data structure for an index.
Definition: dict0mem.h:1069
Data structure for a database table.
Definition: dict0mem.h:1927
Structure for an SQL data tuple of fields (logical record)
Definition: data0data.h:706
Fetch statement node.
Definition: row0sel.h:383
sel_node_t * cursor_def
cursor definition
Definition: row0sel.h:385
pars_user_func_t * func
User callback function or NULL.
Definition: row0sel.h:388
sym_node_t * into_list
variables to set
Definition: row0sel.h:386
que_common_t common
type: QUE_NODE_FETCH
Definition: row0sel.h:384
A predefined function or operator node in a parsing tree; this construct is also used for some non-fu...
Definition: pars0pars.h:489
The list of modifications to be applied on LOBs to get older versions.
Definition: lob0undo.h:146
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:295
Definition: row0mysql.h:455
Open or close cursor statement node.
Definition: row0sel.h:407
enum open_node_op op_type
operation type: open or close cursor
Definition: row0sel.h:409
sel_node_t * cursor_def
cursor definition
Definition: row0sel.h:411
que_common_t common
type: QUE_NODE_OPEN
Definition: row0sel.h:408
An order-by node in a select.
Definition: pars0pars.h:508
User-supplied function and argument.
Definition: pars0pars.h:459
Query plan.
Definition: row0sel.h:248
ulint first_prefetched
index of the first cached row in select buffer arrays for each column
Definition: row0sel.h:286
page_cur_mode_t mode
search mode: PAGE_CUR_G, ...
Definition: row0sel.h:275
Cond_list other_conds
the rest of search conditions we can test at this table in a join
Definition: row0sel.h:298
ulint n_rows_prefetched
number of prefetched rows cached for fetch: fetching several rows in the same mtr saves CPU time
Definition: row0sel.h:283
dtuple_t * clust_ref
the reference to the clustered index entry is built here if index is a non-clustered index
Definition: row0sel.h:310
sym_node_list_t columns
symbol table nodes for the columns to retrieve from the table
Definition: row0sel.h:289
bool no_prefetch
no prefetch for this table
Definition: row0sel.h:288
bool unique_search
true if we are searching an index record with a unique key
Definition: row0sel.h:279
dict_table_t * table
table struct in the dictionary cache
Definition: row0sel.h:249
mem_heap_t * old_vers_heap
memory heap used in building an old version of a row, or NULL
Definition: row0sel.h:316
bool must_get_clust
true if index is a non-clustered index and we must also fetch the clustered index record; this is the...
Definition: row0sel.h:299
bool asc
true if cursor traveling upwards
Definition: row0sel.h:254
dtuple_t * tuple
search tuple
Definition: row0sel.h:274
bool pcur_is_open
true if pcur has been positioned and we can try to fetch new rows
Definition: row0sel.h:255
que_node_t ** tuple_exps
array of expressions which are used to calculate the field values in the search tuple: there is one e...
Definition: row0sel.h:268
bool cursor_at_end
true if the cursor is open but we know that there are no more qualifying rows left to retrieve from t...
Definition: row0sel.h:257
btr_pcur_t clust_pcur
if index is non-clustered, we use this pcur to search the clustered index
Definition: row0sel.h:313
dict_index_t * index
table index used in the search
Definition: row0sel.h:251
UT_LIST_BASE_NODE_T_EXTERN(func_node_t, cond_list) Cond_list
Definition: row0sel.h:291
bool stored_cursor_rec_processed
true if the pcur position has been stored and the record it is positioned on has already been process...
Definition: row0sel.h:264
ulint n_exact_match
number of first fields in the search tuple which must be exactly matched
Definition: row0sel.h:276
Cond_list end_conds
conditions which determine the fetch limit of the index segment we have to look at: when one of these...
Definition: row0sel.h:296
ulint n_rows_fetched
number of rows fetched using pcur after it was opened
Definition: row0sel.h:281
btr_pcur_t pcur
persistent cursor used to search the index
Definition: row0sel.h:252
ulint * clust_map
map telling how clust_ref is built from the fields of a non-clustered record
Definition: row0sel.h:307
Definition: que0types.h:51
Definition: que0que.h:242
A struct for (sometimes lazily) prebuilt structures in an Innobase table handle used within MySQL; th...
Definition: row0mysql.h:515
A structure for caching column values for prefetched rows.
Definition: row0sel.h:235
byte * data
data, or NULL; if not NULL, this field has allocated memory which must be explicitly freed; can be !...
Definition: row0sel.h:236
ulint len
data length or UNIV_SQL_NULL
Definition: row0sel.h:240
ulint val_buf_size
size of memory buffer allocated for data: this can be more than len; this is defined when data !...
Definition: row0sel.h:241
Select statement node.
Definition: row0sel.h:330
plan_t * plans
array of n_tables many plan nodes containing the search plan and the search data structures
Definition: row0sel.h:354
sym_node_list_t copy_variables
variables whose values we have to copy when an explicit cursor is opened, so that they do not change ...
Definition: row0sel.h:379
sym_node_t * into_list
variables list or NULL
Definition: row0sel.h:338
ulint row_lock_mode
LOCK_X or LOCK_S.
Definition: row0sel.h:347
que_common_t common
node type: QUE_NODE_SELECT
Definition: row0sel.h:332
bool consistent_read
true if the select is a consistent, non-locking read
Definition: row0sel.h:361
bool asc
true if the rows should be fetched in an ascending order
Definition: row0sel.h:342
sym_node_t * explicit_cursor
not NULL if an explicit cursor
Definition: row0sel.h:376
order_node_t * order_by
order by column definition, or NULL
Definition: row0sel.h:363
que_node_t * select_list
select list
Definition: row0sel.h:336
bool can_get_updated
this is true if the select is in a single-table explicit cursor which can get updated within the stor...
Definition: row0sel.h:374
que_node_t * search_cond
search condition
Definition: row0sel.h:356
ulint n_tables
number of tables
Definition: row0sel.h:349
bool aggregate_already_fetched
true if the aggregate row has already been fetched for the current cursor
Definition: row0sel.h:368
bool set_x_locks
true if the cursor is for update or delete, which means that a row x-lock should be placed on the cur...
Definition: row0sel.h:345
ulint fetch_table
number of the next table to access in the join
Definition: row0sel.h:351
sym_node_t * table_list
table list
Definition: row0sel.h:340
bool is_aggregate
true if the select list consists of aggregate functions
Definition: row0sel.h:365
Read_view_interface * read_view
if the query is a non-locking consistent read, its read view is placed here, otherwise NULL
Definition: row0sel.h:359
enum sel_node_state state
node state
Definition: row0sel.h:334
Symbol table node.
Definition: pars0sym.h:113
Transaction system global type definitions.
Version control for database, common definitions, and include files.
#define IF_DEBUG(...)
Definition: univ.i:677
unsigned long int ulint
Definition: univ.i:403
#define UT_LIST_BASE_NODE_T_EXTERN(t, m)
A variant of UT_LIST_BASE_NODE_T to be used in rare cases where the full definition of t is not yet i...
Definition: ut0lst.h:279