There are two structures that describe selects:
st_select_lex
(SELECT_LEX) for representing
SELECT itself
st_select_lex_unit
(SELECT_LEX_UNIT) for grouping several
selects in a bunch
The latter item represents UNION operation (the
absence of UNION is a union with only one
SELECT and this structure is present in any
case). In the future, this structure will be used for
EXCEPT and INTERSECT as
well.
For example:
(SELECT ...) UNION (SELECT ... (SELECT...)...(SELECT...UNION...SELECT)) 1 2 3 4 5 6 7
will be represented as:
------------------------------------------------------------------------
level 1
SELECT_LEX_UNIT(2)
|
+---------------+
| |
SELECT_LEX(1) SELECT_LEX(3)
|
--------------- | ------------------------------------------------------
| level 2
+-------------------+
| |
SELECT_LEX_UNIT(4) SELECT_LEX_UNIT(6)
| |
| +--------------+
| | |
SELECT_LEX(4) SELECT_LEX(5) SELECT_LEX(7)
------------------------------------------------------------------------
Note: Single subquery 4 has its own
SELECT_LEX_UNIT.
The uppermost SELECT_LEX_UNIT (#2 in example)
is stored in LEX. The first and uppermost
SELECT_LEX (#1 in example) is stored in LEX,
too. These two structures always exist.
At the time of creating or performing any
JOIN::* operation,
LEX::current_select points to an appropriate
SELECT_LEX.
Only during parsing of global ORDER BY and
LIMIT clauses (for the whole
UNION), LEX::current_select
points to SELECT_LEX_UNIT of this unit, in
order to store this parameter in this
SELECT_LEX_UNIT. SELECT_LEX
and SELECT_LEX_UNIT are inherited from
st_select_lex_node.
