Non-subquery unions are performed with the help of
mysql_union(). For now, it is divided into the
following steps:
st_select_lex_unit::prepare (the same
procedure can be called for single SELECT
for derived table => we have support for it in this
procedure, but we will not describe it here):
Create select_union (inherited from
select_result) which will write select
results in this temporary table, with empty temporary
table entry. We will need this object to store in every
JOIN structure link on it, but we have
not (yet) temporary table structure.
Allocate JOIN structures and execute
JOIN::prepare() for every
SELECT to get full information about
types of elements of SELECT list
(results). Merging types of result fields and storing them
in special Items (Item_type_holder)
will be done in this loop, too. Result of this operation
(list of types of result fields) will be stored in
st_select_lex_unit::types).
Create a temporary table for storing union results (if
UNION without ALL
option, 'distinct' parameter will be passed to the table
creation procedure).
Assign a temporary table to the
select_union object created in the
first step.
st_select_lex_unit::exec
Delete rows from the temporary table if this is not the first call.
if this is the first call, call
JOIN::optimize else
JOIN::reinit and then
JOIN::exec for all
SELECTs
(select_union will write a result for
the temporary table). If union is cacheable and this is
not the first call, the method will do nothing.
Call mysql_select on temporary table
with global ORDER BY and
LIMIT parameters after collecting
results from all SELECTs. A special
fake_select_lex
(SELECT_LEX) which is created for
every UNION will be passed for this
procedure (this SELECT_LEX also can
be used to store global ORDER BY and
LIMIT parameters if brackets used in
a query).
