派生表是子查询的内部名称从
条款。
派生表的处理现在包括在表打开过程中(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
) 是真的。