mysql源码剖析–LEX结构分析
引言
mysql通过THD的父类字段Statement::lex保存解析出来的语法树信息。struct LEX继承于Query_tables_list。LEX中涉及的查询语法树的核心成员包括:
- unit:语法树顶层节点;
- select_lex:顶层第一个select语句节点;
- all_selects_list:通过link_next和link_prev构成所有select子句的双向链表;
- query_tables:通过next_global和prev_global构成所有talbe的双向链表;
- query_tables_last:指向query_tables中最后一个元素;
注:其他成员不作描述,在sql/sql_lex.h源码文件中。
1 select语法树
1.1 核心数据结构
select语法树由SELECT_LEX_UNIT(即st_select_lex_unit)节点和SELECT_LEX(即st_select_lex)节点组成。两个class都继承自st_select_lex_node。SELECT_LEX的核心成员如下:
- table_list:通过next_local串联起来的表结构,也就是from后面的表;
- top_join_list:将from后面的表根据jion语法规则生成的jion树;
- where:where语句后面的条件表示树;
- group_list:group分组条件;
- having:having条件;
- item_list:select语句后面的字段列表;
- order_list:order排序方式;
- select_limit,offset_limit:行限制条件;
1.2 语法树结构
查询语句的语法树结构如下:
整个语法树由SELECT_LEX_UNIT作为顶层,下面挂unit的多个select语句;每个select子句的顶层SELECT_LEX_UNIT挂到所属的select主句上面。THD::lex->unit指向顶层L1;THD::lex->select_lex指向顶层select 1。
2 from子句
2.1 解析原理
整个from表格解析规则如下:
规则1:JOIN表达式:=(JOIN表达式 | JOIN嵌套)JOIN(JOIN表达式 | JOIN嵌套)
规则2:JOIN嵌套:=‘(’ (表引用 | JOIN表达式)(,表引用 | ,JOIN表达式)* ‘)’ | 表引用
也就是说一个jion表达式是由join表达式或join嵌套组成;一个join嵌套可以是一个表引用,或者多个表引用或join表达式通过“,”相隔、且首尾括号包围。
2.2 语法树结构
from后面的表解析成TABLE_LIST结构,所有的TABLE_LIST按如下方式串联:
3 where语句
where语句都是抽象类Item的子类一层一层组成语法树结构。后续再补图。。。