MySQL解析——MySQL内核源码解读

欢迎Java工程师关注简书专栏
Java架构技术进阶
本专栏收录各种Java相关技术,面试题,以及学习感悟,心得!

一、SQL总体执行流程图

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

1.1 SQL查询执行流程

二、语法解析

2.1 编程语言知识回顾

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

形式语言(Formal language):形式语言是用精确的数学或机器可处理的公式定义的语言,个人理解形式语言就是符号化的语言,比如编程语言(C C++ JAVA PYTHON),都是定义一组符号来描述映射人的思维逻辑的,符号化的语言的好处就是能够准确表达,不会产生二义性.

文法(grammar):当我们要描述一种语言时,需要给出这种语言的所有句子,当句子的数目是有限可数时,就要都列出来;当句子是一个无穷集,也就是无限不可数时,就要给出可以表示它们的结构的描述方法或者说,句子的组成规则。这种规则就是文法。即从形式上用于描述和规定结构的称为文法(或者说语法), 也可以理解为指怎么由一堆符号组成一个有含义的句子的规则和协议

上下文无关文法(context-free grammar)(数学描述)

一个四元数组G=(VN,VT,S,P):

VN:非空有限的非终结符集合VT:非空有限的终结符集

S:开始符号P:产生式集合

其中,VN∩VT=?,S∈VN

P中产生式一般形式为A→α|β,其中A∈VN,α,β∈(VN∪VT)*

大写字母表示非终结符,小写字母表示终结符,α、β、γ等代表由 终结符和非终结符号的并集的闭包 中的元素 组成的符号串

上下文无关文法取名为“上下文无关”的原因就是因为字符A总可以被字串α或β自由替换,而无需考虑字符A出现的上下文

终结符(terminal symbol ):终结符是一个形式语言的基本符号。就是说,它们能在一个形式语法的推导规则的输入或输出字符串存在,而且它们不能被分解成更小的单位。可以理解为产生式推导到什么时候停止呢,推导到终止符为止.

非终结符(nonterminal symbol):非终结符是可以被取代的符号。一个形式文法中必须有一个起始符号;这个起始符号属于非终结符的集合。在上下文无关文法中,每个推导规则的左边只能有一个非终结符而不能有两个以上的非终结符或终结符。

巴科斯范式(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.hsql/lex_token.hsql/lex.hsql/lex_symbol.h

sql/gen_lex_token.ccsql/sql_lex.cc

SQL语法解析文件:

sql/sql_yacc.yysql/sql_yacc.ccsql/sql_yacc.h

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

sql/sql_hints.yysql/sql_hints.yy.cc

(2) 语法解析

三、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

Prologue部分包括宏定义和在语法规则动作中使用的函数和变量的声明. 这些将复制到分析器文件的开头以便先于yyparse的定义. 你可以使用#include'来从头文件获取声明. 如果你不需要任何的C声明, 可以省略这个部分的括号分隔符%{'和`%}', 这部分被BISON原封不动地复制到输出的.C文件中

Bison declatations部分包含了定义终结符和非终结符的声明,优先级等等

Grammar Rules部分包含了一个或多个Bison语法规则, 在这里至少应该有一个语法规则,并且第一个%%, 绝对不能省略,解释它在文件的最开头.

就像Prologue部分被复制到开头一样,Epilogue部分被逐字地复制到分析器文件的结尾. 如果你想放一些代码却没必要放在yyparse的定义之前,这里是最方便的地方. 如果最后一部分为空,你可以省略分隔它的分隔符%%.

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部分使用 %% 进行分隔

3.2.3 Grammar Rules部分

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

例子分析:

Bison产生式: result: components…;

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

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

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

即query->END_OF_INPUT | verb_clause | verb_clause END_OF_INPUT

query:

Hello World!END_OF_INPUT
{
    THD *thd= YYTHD;
    if (!thd->bootstrap &&!thd->m_parser_state->has_comment())
    {
        my_message(ER_EMPTY_QUERY, ER(ER_EMPTY_QUERY), MYF(0));
        MYSQL_YYABORT;
    }
    thd->lex->sql_command= SQLCOM_EMPTY_QUERY;
    YYLIP->found_semicolon= NULL;
}
| verb_clause
{
    Lex_input_stream *lip = YYLIP;
    if (YYTHD->get_protocol()->has_client_capability(CLIENT_MULTI_QUERIE S)&& lip->multi_statements && !lip->eof())
    {
        lip->next_state= MY_LEX_END;
        lip->found_semicolon= lip->get_ptr();
    } else
    {
        lip->found_semicolon= NULL;
    }
}
';'
opt_end_of_input
|verb_clause END_OF_INPUT
{
    YYLIP->found_semicolon= NULL;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容