12.5非子查询UNION执行

的帮助下执行非子查询联合mysql_union ().目前分为以下几个步骤:

  • st_select_lex_unit:准备(同样的程序可以调用单个选择对于派生表=>,我们在这个过程中支持它,但我们不在这里描述它):

    • 创建select_union(继承自select_result),将选择结果写入临时表,临时表项为空。我们需要这个对象存储在加入结构链接在上面,但是我们还没有临时表结构。

    • 分配加入结构和执行加入:准备()对于每一个选择的元素类型的完整信息选择列表(结果)。合并结果字段的类型,并将它们存储在特殊的Items中(Item_type_holder)也将在这个循环中执行。此操作的结果(结果字段类型的列表)将存储在st_select_lex_unit:类型).

    • 创建一个临时表来存储联合结果(if联盟没有所有选项,'distinct'参数将被传递给表创建过程)。

    • 对象分配一个临时表select_union对象。

  • st_select_lex_unit:执行

    • 如果这不是第一次调用,则从临时表中删除行。

    • 如果这是第一个电话,打吧加入:优化其他的加入:reinit然后加入:执行对所有选择s (select_union将为临时表写入一个结果)。如果union是可缓存的,并且这不是第一次调用,那么该方法将什么也不做。

    • 调用mysql_select在带有全局的临时表上命令而且限制参数采集后的所有结果选择s.特色菜fake_select_lexSELECT_LEX),这是为每一个联盟将通过此程序(此SELECT_LEX也可用于存储全局命令而且限制参数,如果在查询中使用括号)。