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的子类一层一层组成语法树结构。后续再补图。。。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值