MySQL 8.0.39
Source Code Documentation
|
Scan a table from beginning to end. More...
#include <basic_row_iterators.h>
Public Member Functions | |
TableScanIterator (THD *thd, TABLE *table, double expected_rows, ha_rows *examined_rows) | |
~TableScanIterator () override | |
bool | Init () override |
Initialize or reinitialize the iterator. More... | |
int | Read () override |
Read a single row. More... | |
Public Member Functions inherited from TableRowIterator | |
TableRowIterator (THD *thd, TABLE *table) | |
void | UnlockRow () override |
The default implementation of unlock-row method of RowIterator, used in all access methods except EQRefIterator. More... | |
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 is true, you'll get only NULLs no matter what is actually in the buffer (typically some old leftover row). More... | |
void | StartPSIBatchMode () override |
Start performance schema batch mode, if supported (otherwise ignored). More... | |
void | EndPSIBatchModeIfStarted () override |
Ends performance schema batch mode, if started. More... | |
Public Member Functions inherited from RowIterator | |
RowIterator (THD *thd) | |
virtual | ~RowIterator ()=default |
RowIterator (const RowIterator &)=delete | |
RowIterator (RowIterator &&)=default | |
virtual const IteratorProfiler * | GetProfiler () const |
Get profiling data for this iterator (for 'EXPLAIN ANALYZE'). More... | |
virtual void | SetOverrideProfiler ([[maybe_unused]] const IteratorProfiler *profiler) |
virtual RowIterator * | real_iterator () |
If this iterator is wrapping a different iterator (e.g. More... | |
virtual const RowIterator * | real_iterator () const |
Private Attributes | |
uchar *const | m_record |
const double | m_expected_rows |
ha_rows *const | m_examined_rows |
ulonglong | m_remaining_dups {0} |
Used to keep track of how many more duplicates of the last read row that remains to be written to the next stage: used for EXCEPT and INTERSECT computation: we only ever materialize one row even if there are duplicates of it, but with a counter, cf TABLE::m_set_counter. More... | |
const ha_rows | m_limit_rows |
Used for EXCEPT and INTERSECT only: we cannot enforce limit during materialization as for UNION and single table, so we have to do it during the scan. More... | |
ha_rows | m_stored_rows {0} |
Used for EXCEPT and INTERSECT only: rows scanned so far, see also m_limit_rows. More... | |
Additional Inherited Members | |
Protected Member Functions inherited from TableRowIterator | |
int | HandleError (int error) |
void | PrintError (int error) |
TABLE * | table () const |
Protected Member Functions inherited from RowIterator | |
THD * | thd () const |
Scan a table from beginning to end.
This is the most basic access method of a table using rnd_init, ha_rnd_next and rnd_end. No indexes are used.
TableScanIterator::TableScanIterator | ( | THD * | thd, |
TABLE * | table, | ||
double | expected_rows, | ||
ha_rows * | examined_rows | ||
) |
thd | session context |
table | table to be scanned. Notice that table may be a temporary table that represents a set operation (UNION, INTERSECT or EXCEPT). For the latter two, the counter field must be interpreted by TableScanIterator::Read in order to give the correct result set, but this is invisible to the consumer. |
expected_rows | is used for scaling the record buffer. If zero or less, no record buffer will be set up. |
examined_rows | if not nullptr, is incremented for each successful Read(). |
|
override |
|
overridevirtual |
Initialize or reinitialize the iterator.
You must always call Init() before trying a Read() (but Init() does not imply Read()).
You can call Init() multiple times; subsequent calls will rewind the iterator (or reposition it, depending on whether the iterator takes in e.g. a Index_lookup) and allow you to read the records anew.
Implements RowIterator.
|
overridevirtual |
Read a single row.
The row data is not actually returned from the function; it is put in the table's (or tables', in case of a join) record buffer, ie., table->records[0].
0 | OK |
-1 | End of records |
1 | Error |
Implements RowIterator.
|
private |
|
private |
|
private |
Used for EXCEPT and INTERSECT only: we cannot enforce limit during materialization as for UNION and single table, so we have to do it during the scan.
|
private |
|
private |
Used to keep track of how many more duplicates of the last read row that remains to be written to the next stage: used for EXCEPT and INTERSECT computation: we only ever materialize one row even if there are duplicates of it, but with a counter, cf TABLE::m_set_counter.
When we start scanning we must produce as many duplicates as ALL semantics mandate, so we initialize m_examined_rows based on TABLE::m_set_counter and decrement for each row we emit, so as to produce the correct number of duplicates for the next stage.
|
private |
Used for EXCEPT and INTERSECT only: rows scanned so far, see also m_limit_rows.