标签:含义 message const 资料 文件 empty 意思 必须 方法
本文是基于MySQL5.7.22进行分析1.1 SQL查询执行流程
2. 语法解析
2.1 编程语言知识回顾
在介绍具体的MySQL数据库解析SQL之前,先来回归一下编程语言的知识点
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) 语法解析
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声明, 可以省略这个部分的括号分隔符
%{‘和`%}‘, 这部分被BISON原封不动地复制到输出的.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部分使用 %% 进行分隔
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:
- 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;}
参考资料
本文由京东商城数据库技术部傅志宇提供。
标签:含义 message const 资料 文件 empty 意思 必须 方法
原文地址:http://blog.51cto.com/wangwei007/2300217