12.6派生表执行

派生表是子查询的内部名称条款。

派生表的处理现在包括在表打开过程中(open_and_lock_tables()称呼)。执行派生表的例程并替换临时表而不是它(mysql_handle_derived())将在打开和锁定查询中使用的所有真实表(包括在派生中使用的表查询)之后调用。

如果LEX-> DERIVED_TABLE.国旗存在,所有Select_lex.将扫描结构(所有列表都有Select_lex.以反向命名的结构命名LEX-> ALL_SELECTS_LIST., 首先选择在查询中将在此列表中持续)。

派生表有一个指针,select_lex_unit.存储在table_list.结构体 (table_list ::派生)。对于具有此指针的任何表,mysql_derived()将被称为。

mysql_derived()

  • 创造union_result.为了在此表中写入结果(具有空表条目,与联盟s)。

  • 称呼单位 - >准备()获取结果字段类型的列表(它为单身正常工作选择,并不创建临时表联盟在这种情况下处理)。

  • 创建一个用于存储结果的临时表。

  • 将此临时表分配给union_result.目的。

  • 呼叫mysql_select.或者mysql_union.执行查询。

  • 如果它没有解释,则清理加入执行后的结构(解释需要优化阶段的数据并在整个查询处理之后清理它们)。

  • 存储指向此临时表的指针table_list.结构,然后将由外部查询使用此表。

  • 链接此临时表thd-> derived_tables.用于在查询执行后删除。这张表将关闭close_thread_tables.如果它的第二个参数(bool skip_derived) 是真的。