In expressions, subqueries (that is, subselects) are represented
by Item inherited from
Item_subselect.
To hide difference in performing single SELECTs
and UNIONs, Item_subselect
uses two different engines, which provide uniform interface for
access to underlying SELECT or
UNION
(subselect_single_select_engine and
subselect_union_engine, both are inherited from
subselect_engine).
The engine will be created at the time
Item_subselect is constructed
(Item_subselect::init method).
On Item_subselect::fix_fields(),
engine->prepare() will be called.
Before calling any value-getting method (val,
val_int, val_str,
bring_value (in case of row result))
engine->exec() will be called, which
executes the query or just does nothing if subquery is cacheable
and has already been executed.
Inherited items have their own select_result classes. There are two types of them:
select_singlerow_subselect , to store
values of given rows in
Item_singlerow_subselect cache on
send_data() call, and report error if
Item_subselect has 'assigned' attribute.
select_exists_subselect just store 1 as
value of Item_exists_subselect on
send_data() call. Since
Item_in_subselect and
Item_allany_subselect are inherited from
Item_exists_subselect, they use the same
select_result class.
Item_subselect will never call the
cleanup() procedure for
JOIN. Every JOIN::cleanup
will call cleanup() for inner
JOINs. The uppermost
JOIN::cleanup will be called by
mysql_select() or
mysql_union().
