Non-Subquery UNION Execution - MySQL

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

All rights reserved © 2018 Wisdom IT Services India Pvt. Ltd Protection Status

MySQL Topics