MySQL 8.4.0
Source Code Documentation
TemptableAggregateIterator< Profiler > Class Template Referencefinal

Aggregates unsorted data into a temporary table, using update operations to keep running aggregates. More...

Inheritance diagram for TemptableAggregateIterator< Profiler >:
[legend]

Public Member Functions

 TemptableAggregateIterator (THD *thd, unique_ptr_destroy_only< RowIterator > subquery_iterator, Temp_table_param *temp_table_param, TABLE *table, unique_ptr_destroy_only< RowIterator > table_iterator, JOIN *join, int ref_slice)
 
bool Init () override
 Initialize or reinitialize the iterator. More...
 
int Read () override
 Read a single row. 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 EndPSIBatchModeIfStarted () override
 Ends performance schema batch mode, if started. More...
 
void UnlockRow () override
 
const IteratorProfilerGetProfiler () const override
 Get profiling data for this iterator (for 'EXPLAIN ANALYZE'). More...
 
const Profiler * GetTableIterProfiler () const
 
- 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 void SetOverrideProfiler ([[maybe_unused]] const IteratorProfiler *profiler)
 
virtual RowIteratorreal_iterator ()
 If this iterator is wrapping a different iterator (e.g. More...
 
virtual const RowIteratorreal_iterator () const
 

Private Member Functions

bool using_hash_key () const
 
bool move_table_to_disk (int error, bool was_insert)
 Move the in-memory temporary table to disk. More...
 

Private Attributes

unique_ptr_destroy_only< RowIteratorm_subquery_iterator
 The iterator we are reading rows from. More...
 
unique_ptr_destroy_only< RowIteratorm_table_iterator
 The iterator used to scan the resulting temporary table. More...
 
Temp_table_paramm_temp_table_param
 
JOIN *const m_join
 
const int m_ref_slice
 
Profiler m_profiler
 Profiling data for this iterator. More...
 
Profiler m_table_iter_profiler
 Profiling data for m_table_iterator,. More...
 

Additional Inherited Members

- Protected Member Functions inherited from TableRowIterator
int HandleError (int error)
 
void PrintError (int error)
 
TABLEtable () const
 
- Protected Member Functions inherited from RowIterator
THDthd () const
 

Detailed Description

template<typename Profiler>
class TemptableAggregateIterator< Profiler >

Aggregates unsorted data into a temporary table, using update operations to keep running aggregates.

After that, works as a MaterializeIterator in that it allows the temporary table to be scanned.

'Profiler' should be 'IteratorProfilerImpl' for 'EXPLAIN ANALYZE' and 'DummyIteratorProfiler' otherwise. It is implemented as a a template parameter to minimize the impact this probe has on normal query execution.

Constructor & Destructor Documentation

◆ TemptableAggregateIterator()

template<typename Profiler >
TemptableAggregateIterator< Profiler >::TemptableAggregateIterator ( THD thd,
unique_ptr_destroy_only< RowIterator subquery_iterator,
Temp_table_param temp_table_param,
TABLE table,
unique_ptr_destroy_only< RowIterator table_iterator,
JOIN join,
int  ref_slice 
)

Member Function Documentation

◆ EndPSIBatchModeIfStarted()

template<typename Profiler >
void TemptableAggregateIterator< Profiler >::EndPSIBatchModeIfStarted ( )
inlineoverridevirtual

Ends performance schema batch mode, if started.

It's always safe to call this.

Iterators that have children (composite iterators) must forward the EndPSIBatchModeIfStarted() call to every iterator they could conceivably have called StartPSIBatchMode() on. This ensures that after such a call to on the root iterator, all handlers are out of batch mode.

Reimplemented from RowIterator.

◆ GetProfiler()

template<typename Profiler >
const IteratorProfiler * TemptableAggregateIterator< Profiler >::GetProfiler ( ) const
inlineoverridevirtual

Get profiling data for this iterator (for 'EXPLAIN ANALYZE').

Valid for TimingIterator, MaterializeIterator and TemptableAggregateIterator only.

Reimplemented from RowIterator.

◆ GetTableIterProfiler()

template<typename Profiler >
const Profiler * TemptableAggregateIterator< Profiler >::GetTableIterProfiler ( ) const
inline

◆ Init()

template<typename Profiler >
bool TemptableAggregateIterator< Profiler >::Init ( )
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.

◆ move_table_to_disk()

template<typename Profiler >
bool TemptableAggregateIterator< Profiler >::move_table_to_disk ( int  error_code,
bool  was_insert 
)
private

Move the in-memory temporary table to disk.

Parameters
[in]error_codeThe error code because of which the table is being moved to disk.
[in]was_insertTrue, if the table is moved to disk during an insert operation.
Returns
true if error.

◆ Read()

template<typename Profiler >
int TemptableAggregateIterator< Profiler >::Read ( )
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].

Return values
0OK
-1End of records
1Error

Implements RowIterator.

◆ SetNullRowFlag()

template<typename Profiler >
void TemptableAggregateIterator< Profiler >::SetNullRowFlag ( bool  is_null_row)
inlineoverridevirtual

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).

This is used for outer joins, when an iterator hasn't produced any rows and we need to produce a NULL-complemented row. Init() or Read() won't necessarily reset this flag, so if you ever set is to true, make sure to also set it to false when needed.

Note that this can be called without Init() having been called first. For example, NestedLoopIterator can hit EOF immediately on the outer iterator, which means the inner iterator doesn't get an Init() call, but will still forward SetNullRowFlag to both inner and outer iterators.

TODO: We shouldn't need this. See the comments on AggregateIterator for a bit more discussion on abstracting out a row interface.

Implements RowIterator.

◆ UnlockRow()

template<typename Profiler >
void TemptableAggregateIterator< Profiler >::UnlockRow ( )
inlineoverridevirtual

Implements RowIterator.

◆ using_hash_key()

template<typename Profiler >
bool TemptableAggregateIterator< Profiler >::using_hash_key ( ) const
inlineprivate

Member Data Documentation

◆ m_join

template<typename Profiler >
JOIN* const TemptableAggregateIterator< Profiler >::m_join
private

◆ m_profiler

template<typename Profiler >
Profiler TemptableAggregateIterator< Profiler >::m_profiler
private

Profiling data for this iterator.

Used for 'EXPLAIN ANALYZE'.

See also
MaterializeIterator::m_profiler for a description of how this is used.

◆ m_ref_slice

template<typename Profiler >
const int TemptableAggregateIterator< Profiler >::m_ref_slice
private

◆ m_subquery_iterator

template<typename Profiler >
unique_ptr_destroy_only<RowIterator> TemptableAggregateIterator< Profiler >::m_subquery_iterator
private

The iterator we are reading rows from.

◆ m_table_iter_profiler

template<typename Profiler >
Profiler TemptableAggregateIterator< Profiler >::m_table_iter_profiler
private

Profiling data for m_table_iterator,.

See also
MaterializeIterator::m_table_iter_profiler.

◆ m_table_iterator

template<typename Profiler >
unique_ptr_destroy_only<RowIterator> TemptableAggregateIterator< Profiler >::m_table_iterator
private

The iterator used to scan the resulting temporary table.

◆ m_temp_table_param

template<typename Profiler >
Temp_table_param* TemptableAggregateIterator< Profiler >::m_temp_table_param
private

The documentation for this class was generated from the following file: