MySQL内核源码解读-SQL解析一

栏目: 数据库 · 发布时间: 6年前

内容简介:2. 语法解析2.1 编程语言知识回顾在介绍具体的MySQL数据库解析SQL之前,先来回归一下编程语言的知识点

本文是基于 MySQL 5.7.22进行分析

1. SQL总体执行流程图

MySQL内核源码解读-SQL解析一

通过上面图,可以从全局上了解 SQL 语句执行流程以及与其他模块交互

1.1 SQL查询执行流程

MySQL内核源码解读-SQL解析一 MySQL内核源码解读-SQL解析一

2. 语法解析

2.1 编程语言知识回顾

在介绍具体的MySQL数据库解析SQL之前,先来回归一下编程语言的知识点

  1. 形式语言(Formal language)
    形式语言是用精确的数学或机器可处理的公式定义的语言,个人理解形式语言就是符号化的语言,比如编程语言(C C++ JAVA PYTHON),都是定义一组符号来描述映射人的思维逻辑的,符号化的语言的好处就是能够准确表达,不会产生二义性.
  2. 文法(grammar)
    当我们要描述一种语言时,需要给出这种语言的所有句子,当句子的数目是有限可数时,就要都列出来;当句子是一个无穷集,也就是无限不可数时,就要给出可以表示它们的结构的描述方法或者说,句子的组成规则。这种规则就是文法。即从形式上用于描述和规定结构的称为文法(或者说语法), 也可以理解为指怎么由一堆符号组成一个有含义的句子的规则和协议
  3. 上下文无关文法(context-free grammar)(数学描述)
    一个四元数组G=(VN,VT,S,P):
    VN:非空有限的非终结符集合VT:非空有限的终结符集
    S:开始符号P:产生式集合
    其中,VN∩VT=∅,S∈VN
    P中产生式一般形式为A→α|β,其中A∈VN,α,β∈(VN∪VT)*
    大写字母表示非终结符,小写字母表示终结符,α、β、γ等代表由 终结符和非终结符号的并集的闭包 中的元素 组成的符号串
    上下文无关文法取名为“上下文无关”的原因就是因为字符A总可以被字串α或β自由替换,而无需考虑字符A出现的上下文
  4. 终结符(terminal symbol )
    终结符是一个形式语言的基本符号。就是说,它们能在一个形式语法的推导规则的输入或输出字符串存在,而且它们不能被分解成更小的单位。可以理解为产生式推导到什么时候停止呢,推导到终止符为止.
  5. 非终结符(nonterminal symbol)
    非终结符是可以被取代的符号。一个形式文法中必须有一个起始符号;这个起始符号属于非终结符的集合。在上下文无关文法中,每个推导规则的左边只能有一个非终结符而不能有两个以上的非终结符或终结符。
  6. 巴科斯范式(BNF: Backus-Naur Form)
    以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形式体系,是一种典型的元语言。又称巴科斯-诺尔形式(Backus-Naur form)。它不仅能严格地表示语法规则,而且所描述的语法是与上下文无关的。它具有语法简单,表示明确,便于语法分析和编译的特点。
    编程语言的文法除了数学化的描述,还需要在在实际生产中易于描述的符号化语言,BNF就是用来描述上下文无关文法的符号化的语言.

2.2 概念与bison

2.1章节说明的概念跟bison又是一种什么关系呢?

bison是属于 GNU 项目的一个语法分析器生成器。

bison能够将上下文无文法解释成语法分析表,由于兼容yacc,而yacc是BNF进行描述文法规则的, 所以可以理解为bison能够解析以BNF描述上下文无关文法的语法分析器生成器.

2.3 MySQL与bison

MySQL使用bison作为其解析SQL语句的语法分析器.

2.4 SQL解析相关文件及关联

(1) 相关文件

SQL词法解析文件:

sql/sql_lex.h、sql/lex_token.h、sql/lex.h、sql/lex_symbol.h

sql/gen_lex_token.cc、sql/sql_lex.cc

SQL语法解析文件:

sql/sql_yacc.yy、sql/sql_yacc.cc、sql/sql_yacc.h

SQL语句的hint语法解析文件:

sql/sql_hints.yy、sql/sql_hints.yy.cc

(2) 语法解析

MySQL内核源码解读-SQL解析一

3. sql/sql_yacc.yy

3.1 sql_yacc.yy描述

sql_yacc.cc规定了SQL语句语法规则,定义了SQL语句的关键字.

3.2 sql_yacc.yy文件结构

%{ Prologue %}
Bison declarations
%% Grammar rules %%
Epilogue
#include'来从头文件获取声明. 如果你不需要任何的C声明, 可以省略这个部分的括号分隔符

3.2 sql_yacc.yy文件解析

3.2.1 Prologue部分

该部分包含了 C语言 的头文件,宏定义,该部分主要声明和定义了2个关键函数,如下:

int yylex(void yylval, void yythd);词法解析函数的声明

void MYSQLerror(YYLTYPE , THD thd, const char *s);语法分析错误函数的定义。

3.2.2 Bison declatations部分

本部分与prologue部分使用 %% 进行分隔

MySQL内核源码解读-SQL解析一 MySQL内核源码解读-SQL解析一

3.2.3 Grammar Rules部分

本部分与Bison declatations部分,使用 %% 进行分隔

MySQL内核源码解读-SQL解析一

例子分析:

Bison产生式: result: components…;

下面的例子就是一个产生式

query是产生式的左端, 冒号后面是产生式的右端, | 代表或的意思, {}当query产生式推出右端情况的时候所执行的动作,一个产生式结束要是 ;

其中, query verb_clause 都是非终止符, END_OF_INPUT 是终止符, 也就是说产生式推导到终止符就停止推导.

即query->END_OF_INPUT | verb_clause | verb_clause END_OF_INPUT

query:

  1. END_OF_INPUT
  2. { THD *thd= YYTHD;
  3. if (!thd->bootstrap &&!thd->m_parser_state->has_comment())
  4. my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0));
  5. MYSQL_YYABORT;
  6. thd->lex->sql_command= SQLCOM_EMPTY_QUERY;
  7. YYLIP->found_semicolon= NULL;
  8. | verb_clause
  9. { Lex_input_stream *lip = YYLIP;
  10. if (YYTHD->get_protocol()->has_client_capability(CLIENT_MULTI_QUERIE S)&& lip->multi_statements && !lip->eof())
  11. lip->next_state= MY_LEX_END;
  12. lip->found_semicolon= lip->get_ptr();
  13. else
  14. { lip->found_semicolon= NULL;}
  15. ';'
  16. opt_end_of_input
  17. |verb_clause END_OF_INPUT
  18. {YYLIP->found_semicolon= NULL;}

参考资料

  1. 《lex与yacc》(第二版)
  2. 《flex与bison》(第二版)
  3. Bison操作手册
    http://www.gnu.org/software/bison/manual/bison.html

本文由京东商城数据库技术部傅志宇提供。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

第一行代码:Android(第2版)

第一行代码:Android(第2版)

郭霖 / 人民邮电出版社 / 2016-12-1 / CNY 79.00

本书被广大Android 开发者誉为“Android 学习第一书”。全书系统全面、循序渐进地介绍了Android软件开发的必备知识、经验和技巧。 第2版基于Android 7.0 对第1 版进行了全面更新,将所有知识点都在最新的Android 系统上进行重新适配,使用 全新的Android Studio 开发工具代替之前的Eclipse,并添加了对Material Design、运行时权限、......一起来看看 《第一行代码:Android(第2版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

html转js在线工具
html转js在线工具

html转js在线工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换