MySQL 9.2.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
bka_iterator.h
Go to the documentation of this file.
1#ifndef SQL_ITERATORS_BKA_ITERATOR_H_
2#define SQL_ITERATORS_BKA_ITERATOR_H_
3
4/* Copyright (c) 2019, 2024, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27/**
28 Batch key access (BKA) is a join strategy that uses multi-range read (MRR)
29 to get better read ordering on the table on the inner side. It reads
30 a block of rows from the outer side, picks up the join keys (refs) from
31 each row, and sends them all off in one big read request. The handler can
32 then order these and read them in whatever order it would prefer. This is
33 especially attractive when used with rotating media; the reads can then be
34 ordered such that it does not require constant seeking (disk-sweep MRR,
35 or DS-MRR).
36
37 BKA is implemented with two iterators working in concert. The BKAIterator
38 reads rows from the outer side into a buffer. When the buffer is full or we
39 are out of rows, it then sets up the key ranges and hand it over to the
40 MultiRangeRowIterator, which does the actual request, and reads rows from it
41 until there are none left. For each inner row returned, MultiRangeRowIterator
42 loads the appropriate outer row(s) from the buffer, doing the actual join.
43
44 The reason for this split is twofold. First, it allows us to accurately time
45 (for EXPLAIN ANALYZE) the actual table read. Second, and more importantly,
46 we can have other iterators between the BKAIterator and MultiRangeRowIterator,
47 in particular FilterIterator.
48 */
49
50#include <assert.h>
51#include <stddef.h>
52#include <sys/types.h>
53#include <iterator>
54#include <memory>
55#include <span>
56
57#include "my_alloc.h"
58
59#include "my_inttypes.h"
60#include "my_table_map.h"
61#include "sql/handler.h"
64#include "sql/join_type.h"
65#include "sql/mem_root_array.h"
66#include "sql/pack_rows.h"
67#include "sql_string.h"
68#include "template_utils.h"
69
70class Item;
71class JOIN;
73class THD;
74struct AccessPath;
75struct Index_lookup;
76struct KEY_MULTI_RANGE;
77struct TABLE;
78
79/**
80 The BKA join iterator, with an arbitrary iterator tree on the outer side
81 and a MultiRangeRowIterator on the inner side (possibly with a filter or
82 similar in-between). See file comment for more details.
83 */
84class BKAIterator final : public RowIterator {
85 public:
86 /**
87 @param thd Thread handle.
88 @param outer_input The iterator to read the outer rows from.
89 @param outer_input_tables Each outer table involved.
90 Used to know which fields we are to read into our buffer.
91 @param inner_input The iterator to read the inner rows from.
92 Must end up in a MultiRangeRowIterator.
93 @param max_memory_available Number of bytes available for row buffers,
94 both outer rows and MRR buffers. Note that allocation is incremental,
95 so we can allocate less than this.
96 @param mrr_bytes_needed_for_single_inner_row Number of bytes MRR needs
97 space for in its buffer for holding a single row from the inner table.
98 @param expected_inner_rows_per_outer_row Number of inner rows we
99 statistically expect for each outer row. Used for dividing the buffer
100 space between inner rows and MRR row buffer (if we expect many inner
101 rows, we can't load as many outer rows).
102 @param store_rowids Whether we need to make sure all tables below us have
103 row IDs available, after Read() has been called. Used only if
104 we are below a weedout operation.
105 @param tables_to_get_rowid_for A map of which tables BKAIterator needs
106 to call position() for itself. tables that are in outer_input_tables
107 but not in this map, are expected to be handled by some other iterator.
108 tables that are in this map but not in outer_input_tables will be
109 ignored.
110 @param mrr_iterator Pointer to the MRR iterator at the bottom of
111 inner_input. Used to send row ranges and buffers.
112 @param single_row_index_lookups All the single-row index lookups that
113 provide input to this iterator.
114 @param join_type What kind of join we are executing.
115 */
117 const Prealloced_array<TABLE *, 4> &outer_input_tables,
119 size_t max_memory_available,
120 size_t mrr_bytes_needed_for_single_inner_row,
121 float expected_inner_rows_per_outer_row, bool store_rowids,
122 table_map tables_to_get_rowid_for,
123 MultiRangeRowIterator *mrr_iterator,
124 std::span<AccessPath *> single_row_index_lookups,
126
127 bool Init() override;
128
129 int Read() override;
130
131 void SetNullRowFlag(bool is_null_row) override {
132 m_outer_input->SetNullRowFlag(is_null_row);
133 m_inner_input->SetNullRowFlag(is_null_row);
134 }
135
136 void UnlockRow() override {
137 // Since we don't know which condition that caused the row to be rejected,
138 // we can't know whether we could also unlock the outer row
139 // (it may still be used as parts of other joined rows).
141 m_inner_input->UnlockRow();
142 }
143 }
144
145 void EndPSIBatchModeIfStarted() override {
146 m_outer_input->EndPSIBatchModeIfStarted();
147 m_inner_input->EndPSIBatchModeIfStarted();
148 }
149
150 private:
151 /// Clear out the MEM_ROOT and prepare for reading rows anew.
152 void BeginNewBatch();
153
154 /// If there are more outer rows, begin the next batch. If not,
155 /// move to the EOF state.
156 void BatchFinished();
157
158 /// Find the next unmatched row, and load it for output as a NULL-complemented
159 /// row. (Assumes the NULL row flag has already been set on the inner table
160 /// iterator.) Returns 0 if a row was found, -1 if no row was found. (Errors
161 /// cannot happen.)
163
164 /// Read a batch of outer rows (BeginNewBatch() must have been called
165 /// earlier). Returns -1 for no outer rows found (sets state to END_OF_ROWS),
166 /// 0 for OK (sets state to RETURNING_JOINED_ROWS) or 1 for error.
167 int ReadOuterRows();
168
169 enum class State {
170 /**
171 We are about to start reading outer rows into our buffer.
172 A single Read() call will fill it up, so there is no
173 in-between “currently reading” state.
174 */
176
177 /**
178 We are returning rows from the MultiRangeRowIterator.
179 (For antijoins, we are looking up the rows, but don't actually
180 return them.)
181 */
183
184 /**
185 We are an outer join or antijoin, and we're returning NULL-complemented
186 rows for those outer rows that never had a matching inner row. Note that
187 this is done in the BKAIterator and not the MRR iterator for two reasons:
188 First, it gives more sensible EXPLAIN ANALYZE numbers. Second, the
189 NULL-complemented rows could be filtered inadvertently by a FilterIterator
190 before they reach the BKAIterator.
191 */
193
194 /**
195 Both the outer and inner side are out of rows.
196 */
198 };
199
201
204
205 /// The MEM_ROOT we are storing the outer rows on, and also allocating MRR
206 /// buffer from. In total, this should not go significantly over
207 /// m_max_memory_available bytes.
209
210 /// Buffered outer rows.
212
213 /// Tables and columns needed for each outer row. Rows/columns that are not
214 /// needed are filtered out in the constructor; the rest are read and stored
215 /// in m_rows.
217
218 /// Used for serializing the row we read from the outer table(s), before it
219 /// stored into the MEM_ROOT and put into m_rows. Should there not be room in
220 /// m_rows for the row, it will stay in this variable until we start reading
221 /// the next batch of outer rows.
222 ///
223 /// If there are no BLOB/TEXT column in the join, we calculate an upper bound
224 /// of the row size that is used to preallocate this buffer. In the case of
225 /// BLOB/TEXT columns, we cannot calculate a reasonable upper bound, and the
226 /// row size is calculated per row. The allocated memory is kept for the
227 /// duration of the iterator, so that we (most likely) avoid reallocations.
229
230 /// Whether we have a row in m_outer_row_buffer from the previous batch of
231 /// rows that we haven't stored in m_rows yet.
233
234 /// For each outer row, how many bytes we need in the MRR buffer (ie., the
235 /// number of bytes we expect to use on rows from the inner table).
236 /// This is the expected number of inner rows per key, multiplied by the
237 /// (fixed) size of each inner row. We use this information to stop scanning
238 /// before we've used up the entire RAM allowance on outer rows, so that
239 /// we have space remaining for the inner rows (in the MRR buffer), too.
241
242 /// Estimated number of bytes used on m_mem_root so far.
243 size_t m_bytes_used = 0;
244
245 /// Whether we've seen EOF from the outer iterator.
247
248 /// See max_memory_available in the constructor.
250
251 /// See max_memory_available in the constructor.
253
254 /// See mrr_iterator in the constructor.
256
257 // All the single-row index lookups that provide rows to this iterator.
258 std::span<AccessPath *> m_single_row_index_lookups;
259
260 /// The join type of the BKA join.
262
263 /// If we are synthesizing NULL-complemented rows (for an outer join or
264 /// antijoin), points to the next row within "m_rows" that we haven't
265 /// considered yet.
267};
268
269/**
270 The iterator actually doing the reads from the inner table during BKA.
271 See file comment.
272 */
274 public:
275 /**
276 @param thd Thread handle.
277 @param table The inner table to scan.
278 @param ref The index condition we are looking up on.
279 @param mrr_flags Flags passed on to MRR.
280 @param join_type
281 What kind of BKA join this MRR iterator is part of.
282 @param outer_input_tables
283 Which tables are on the left side of the BKA join (the MRR iterator
284 is always alone on the right side). This is needed so that it can
285 unpack the rows into the right tables, with the right format.
286 @param store_rowids Whether we need to keep row IDs.
287 @param tables_to_get_rowid_for
288 Tables we need to call table->file->position() for; if a table
289 is present in outer_input_tables but not this, some other iterator
290 will make sure that table has the correct row ID already present
291 after Read().
292 */
294 int mrr_flags, JoinType join_type,
295 const Prealloced_array<TABLE *, 4> &outer_input_tables,
296 bool store_rowids, table_map tables_to_get_rowid_for);
297
298 /**
299 Specify which outer rows to read inner rows for.
300 Must be called before Init(), and be valid until the last Read().
301 */
304 m_begin = begin;
305 m_end = end;
306 }
307
308 /**
309 Specify an unused chunk of memory MRR can use for the returned inner rows.
310 Must be called before Init(), and must be at least big enough to hold
311 one inner row.
312 */
313 void set_mrr_buffer(uchar *ptr, size_t size) {
314 m_mrr_buffer.buffer = ptr;
316 }
317
318 /**
319 Specify an unused chunk of memory that we can use to mark which inner rows
320 have been read (by the parent BKA iterator) or not. This is used for outer
321 joins to know which rows need NULL-complemented versions, and for semijoins
322 and antijoins to avoid matching the same inner row more than once.
323
324 Must be called before Init() for semijoins, outer joins and antijoins, and
325 never called otherwise. There must be room at least for one bit per row
326 given in set_rows().
327 */
329
330 /**
331 Mark that the BKA iterator has seen the last row we returned from Read().
332 (It could have been discarded by a FilterIterator before it reached them.)
333 Will be a no-op for inner joins; see set_match_flag_buffer()..
334 */
336 if (m_match_flag_buffer != nullptr) {
337 size_t row_number = std::distance(m_begin, m_last_row_returned);
338 m_match_flag_buffer[row_number / 8] |= 1 << (row_number % 8);
339 }
340 }
341
342 /**
343 Check whether the given row has been marked as read
344 (using MarkLastRowAsRead()) or not. Used internally when doing semijoins,
345 and also by the BKAIterator when synthesizing NULL-complemented rows for
346 outer joins or antijoins.
347 */
349 assert(m_match_flag_buffer != nullptr);
350 size_t row_number = std::distance(m_begin, row);
351 return m_match_flag_buffer[row_number / 8] & (1 << (row_number % 8));
352 }
353
354 /**
355 Do the actual multi-range read with the rows given by set_rows() and using
356 the temporary buffer given in set_mrr_buffer().
357 */
358 bool Init() override;
359
360 /**
361 Read another inner row (if any) and load the appropriate outer row(s)
362 into the associated table buffers.
363 */
364 int Read() override;
365
366 private:
367 // Thunks from function pointers to the actual callbacks.
368 static range_seq_t MrrInitCallbackThunk(void *init_params, uint n_ranges,
369 uint flags) {
370 return (pointer_cast<MultiRangeRowIterator *>(init_params))
371 ->MrrInitCallback(n_ranges, flags);
372 }
373 static uint MrrNextCallbackThunk(void *init_params, KEY_MULTI_RANGE *range) {
374 return (pointer_cast<MultiRangeRowIterator *>(init_params))
375 ->MrrNextCallback(range);
376 }
377 static bool MrrSkipRecordCallbackThunk(range_seq_t seq, char *range_info,
378 uchar *) {
379 return (reinterpret_cast<MultiRangeRowIterator *>(seq))
380 ->MrrSkipRecord(range_info);
381 }
382
383 // Callbacks we get from the handler during the actual read.
384 range_seq_t MrrInitCallback(uint n_ranges, uint flags);
386 bool MrrSkipIndexTuple(char *range_info);
387 bool MrrSkipRecord(char *range_info);
388
389 /// Handler for the table we are reading from.
391
392 /// The index condition.
394
395 /// Flags passed on to MRR.
396 const int m_mrr_flags;
397
398 /// Current outer rows to read inner rows for. Set by set_rows().
401
402 /// Which row we are at in the [m_begin, m_end) range.
403 /// Used during the MRR callbacks.
405
406 /// What row we last returned from Read() (used for MarkLastRowAsRead()).
408
409 /// Temporary space for storing inner rows, used by MRR.
410 /// Set by set_mrr_buffer().
412
413 /// See set_match_flag_buffer().
415
416 /// Tables and columns needed for each outer row. Same as m_outer_input_tables
417 /// in the corresponding BKAIterator.
419
420 /// The join type of the BKA join we are part of. Same as m_join_type in the
421 /// corresponding BKAIterator.
423};
424
425#endif // SQL_ITERATORS_BKA_ITERATOR_H_
The BKA join iterator, with an arbitrary iterator tree on the outer side and a MultiRangeRowIterator ...
Definition: bka_iterator.h:84
const size_t m_mrr_bytes_needed_for_single_inner_row
See max_memory_available in the constructor.
Definition: bka_iterator.h:252
int MakeNullComplementedRow()
Find the next unmatched row, and load it for output as a NULL-complemented row.
Definition: bka_iterator.cc:256
bool m_has_row_from_previous_batch
Whether we have a row in m_outer_row_buffer from the previous batch of rows that we haven't stored in...
Definition: bka_iterator.h:232
MEM_ROOT m_mem_root
The MEM_ROOT we are storing the outer rows on, and also allocating MRR buffer from.
Definition: bka_iterator.h:208
int ReadOuterRows()
Read a batch of outer rows (BeginNewBatch() must have been called earlier).
Definition: bka_iterator.cc:134
void BatchFinished()
If there are more outer rows, begin the next batch.
Definition: bka_iterator.cc:245
const unique_ptr_destroy_only< RowIterator > m_inner_input
Definition: bka_iterator.h:203
void EndPSIBatchModeIfStarted() override
Ends performance schema batch mode, if started.
Definition: bka_iterator.h:145
BKAIterator(THD *thd, unique_ptr_destroy_only< RowIterator > outer_input, const Prealloced_array< TABLE *, 4 > &outer_input_tables, unique_ptr_destroy_only< RowIterator > inner_input, size_t max_memory_available, size_t mrr_bytes_needed_for_single_inner_row, float expected_inner_rows_per_outer_row, bool store_rowids, table_map tables_to_get_rowid_for, MultiRangeRowIterator *mrr_iterator, std::span< AccessPath * > single_row_index_lookups, JoinType join_type)
Definition: bka_iterator.cc:71
const size_t m_max_memory_available
See max_memory_available in the constructor.
Definition: bka_iterator.h:249
MultiRangeRowIterator *const m_mrr_iterator
See mrr_iterator in the constructor.
Definition: bka_iterator.h:255
State
Definition: bka_iterator.h:169
@ RETURNING_JOINED_ROWS
We are returning rows from the MultiRangeRowIterator.
@ NEED_OUTER_ROWS
We are about to start reading outer rows into our buffer.
@ RETURNING_NULL_COMPLEMENTED_ROWS
We are an outer join or antijoin, and we're returning NULL-complemented rows for those outer rows tha...
@ END_OF_ROWS
Both the outer and inner side are out of rows.
std::span< AccessPath * > m_single_row_index_lookups
Definition: bka_iterator.h:258
String m_outer_row_buffer
Used for serializing the row we read from the outer table(s), before it stored into the MEM_ROOT and ...
Definition: bka_iterator.h:228
size_t m_mrr_bytes_needed_per_row
For each outer row, how many bytes we need in the MRR buffer (ie., the number of bytes we expect to u...
Definition: bka_iterator.h:240
pack_rows::TableCollection m_outer_input_tables
Tables and columns needed for each outer row.
Definition: bka_iterator.h:216
JoinType m_join_type
The join type of the BKA join.
Definition: bka_iterator.h:261
size_t m_bytes_used
Estimated number of bytes used on m_mem_root so far.
Definition: bka_iterator.h:243
hash_join_buffer::BufferRow * m_current_pos
If we are synthesizing NULL-complemented rows (for an outer join or antijoin), points to the next row...
Definition: bka_iterator.h:266
int Read() override
Read a single row.
Definition: bka_iterator.cc:276
bool m_end_of_outer_rows
Whether we've seen EOF from the outer iterator.
Definition: bka_iterator.h:246
Mem_root_array< hash_join_buffer::BufferRow > m_rows
Buffered outer rows.
Definition: bka_iterator.h:211
State m_state
Definition: bka_iterator.h:200
void BeginNewBatch()
Clear out the MEM_ROOT and prepare for reading rows anew.
Definition: bka_iterator.cc:118
void SetNullRowFlag(bool is_null_row) override
Mark the current row buffer as containing a NULL row or not, so that if you read from it and the flag...
Definition: bka_iterator.h:131
void UnlockRow() override
Definition: bka_iterator.h:136
bool Init() override
Initialize or reinitialize the iterator.
Definition: bka_iterator.cc:100
const unique_ptr_destroy_only< RowIterator > m_outer_input
Definition: bka_iterator.h:202
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:930
Definition: sql_optimizer.h:133
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:432
The iterator actually doing the reads from the inner table during BKA.
Definition: bka_iterator.h:273
MultiRangeRowIterator(THD *thd, TABLE *table, Index_lookup *ref, int mrr_flags, JoinType join_type, const Prealloced_array< TABLE *, 4 > &outer_input_tables, bool store_rowids, table_map tables_to_get_rowid_for)
Definition: bka_iterator.cc:328
void MarkLastRowAsRead()
Mark that the BKA iterator has seen the last row we returned from Read().
Definition: bka_iterator.h:335
void set_match_flag_buffer(uchar *ptr)
Specify an unused chunk of memory that we can use to mark which inner rows have been read (by the par...
Definition: bka_iterator.h:328
const int m_mrr_flags
Flags passed on to MRR.
Definition: bka_iterator.h:396
int Read() override
Read another inner row (if any) and load the appropriate outer row(s) into the associated table buffe...
Definition: bka_iterator.cc:436
handler *const m_file
Handler for the table we are reading from.
Definition: bka_iterator.h:390
static bool MrrSkipRecordCallbackThunk(range_seq_t seq, char *range_info, uchar *)
Definition: bka_iterator.h:377
const JoinType m_join_type
The join type of the BKA join we are part of.
Definition: bka_iterator.h:422
pack_rows::TableCollection m_outer_input_tables
Tables and columns needed for each outer row.
Definition: bka_iterator.h:418
bool Init() override
Do the actual multi-range read with the rows given by set_rows() and using the temporary buffer given...
Definition: bka_iterator.cc:340
Index_lookup *const m_ref
The index condition.
Definition: bka_iterator.h:393
static uint MrrNextCallbackThunk(void *init_params, KEY_MULTI_RANGE *range)
Definition: bka_iterator.h:373
bool MrrSkipRecord(char *range_info)
Definition: bka_iterator.cc:431
HANDLER_BUFFER m_mrr_buffer
Temporary space for storing inner rows, used by MRR.
Definition: bka_iterator.h:411
bool MrrSkipIndexTuple(char *range_info)
uchar * m_match_flag_buffer
See set_match_flag_buffer().
Definition: bka_iterator.h:414
uint MrrNextCallback(KEY_MULTI_RANGE *range)
Definition: bka_iterator.cc:386
static range_seq_t MrrInitCallbackThunk(void *init_params, uint n_ranges, uint flags)
Definition: bka_iterator.h:368
range_seq_t MrrInitCallback(uint n_ranges, uint flags)
Definition: bka_iterator.cc:381
const hash_join_buffer::BufferRow * m_current_pos
Which row we are at in the [m_begin, m_end) range.
Definition: bka_iterator.h:404
const hash_join_buffer::BufferRow * m_begin
Current outer rows to read inner rows for. Set by set_rows().
Definition: bka_iterator.h:399
void set_rows(const hash_join_buffer::BufferRow *begin, const hash_join_buffer::BufferRow *end)
Specify which outer rows to read inner rows for.
Definition: bka_iterator.h:302
bool RowHasBeenRead(const hash_join_buffer::BufferRow *row) const
Check whether the given row has been marked as read (using MarkLastRowAsRead()) or not.
Definition: bka_iterator.h:348
void set_mrr_buffer(uchar *ptr, size_t size)
Specify an unused chunk of memory MRR can use for the returned inner rows.
Definition: bka_iterator.h:313
const hash_join_buffer::BufferRow * m_last_row_returned
What row we last returned from Read() (used for MarkLastRowAsRead()).
Definition: bka_iterator.h:407
const hash_join_buffer::BufferRow * m_end
Definition: bka_iterator.h:400
A typesafe replacement for DYNAMIC_ARRAY.
Definition: prealloced_array.h:71
A context for reading through a single table using a chosen access method: index read,...
Definition: row_iterator.h:82
THD * thd() const
Definition: row_iterator.h:228
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: row_iterator.h:234
TABLE * table() const
Definition: row_iterator.h:246
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4633
A structure that contains a list of input tables for a hash join operation, BKA join operation or a s...
Definition: pack_rows.h:84
This file contains the HashJoinRowBuffer class and related functions/classes.
static int flags[50]
Definition: hp_test1.cc:40
JoinType
Definition: join_type.h:28
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
std::unique_ptr< T, Destroy_only< T > > unique_ptr_destroy_only
std::unique_ptr, but only destroying.
Definition: my_alloc.h:480
Some integer typedefs for easier portability.
unsigned char uchar
Definition: my_inttypes.h:52
uint64_t table_map
Definition: my_table_map.h:30
PT & ref(PT *tp)
Definition: tablespace_impl.cc:359
bool distance(const dd::Spatial_reference_system *srs, const Geometry *g1, const Geometry *g2, double *distance, bool *is_null) noexcept
Computes the distance between two geometries.
Definition: distance.cc:40
Key BufferRow
Definition: hash_join_buffer.h:111
const char * begin(const char *const c)
Definition: base64.h:44
size_t size(const char *const c)
Definition: base64.h:46
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
Generic routines for packing rows (possibly from multiple tables at the same time) into strings,...
void * range_seq_t
Definition: handler.h:3865
join_type
Definition: sql_opt_exec_shared.h:186
Our own string classes, used pervasively throughout the executor.
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:238
Definition: handler.h:3859
uchar * buffer_end
Definition: handler.h:3861
uchar * buffer
Definition: handler.h:3860
Structure used for index-based lookups.
Definition: sql_opt_exec_shared.h:67
Definition: my_base.h:1132
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: table.h:1421
Definition: gen_lex_token.cc:149