%% 小到传统的单机数据库,大到分布式数据库、大数据计算引擎,他们大都可以借助**SQL引擎完成“接受一条sql语句然后返回查询结果”**的功能。SQL解析主要包含:词法分析、语义语法分析、优化和执行代码生成。大致可以通过下面的流程来概括:
。大致可以通过下面的流程来概括:
一条sql语句首先会经过::词法分析进行“分词”操作::,然后利用::语法解析器进行语法分析并形成一棵抽象语法树AST::
%% 词法分析主要是把输入转化成若干个Token,其中Token包含key和非key
**
++如图所示,MySQL关键字都会被标识为Key,非关键字就是非key++
通常情况下,词法分析可以使用Flex来生成,但是我们熟悉的MySQL并没有使用该工具,而是手写了词法分析的部分::具体原因据说是为了提高效率和灵活性::
%% 语法分析是生成语法树的过程,这是整个解析过程中最核心、最复杂的环节。ANTLR是一个功能强大的语法分析生成器,可以用来读取、处理、执行和转换结构化文本或者二进制文件。在大数据的一些SQL框架里面有广泛的应用,比如Hive的词法文件是ANTLR3写的,Presto::好像是一个很牛的搜索引擎::词法文件也是ANTLR4实现的,SparkSQL Lambda词法文件也是用Presto的词法文件改写的,另外还有HBase的SQL工具Phoenix也是用ANTLR工具进行SQL解析的
CharStream
到了SQL解析器中进行词法分析变成Token
,拆分完毕后再进行语法分析,TokenStream
最终变成一颗AST
AST
包含TerminalNode
和RuleNode
Parser Tree
下面是hive中的driver驱动组成部分: