原创文章,转载请注明: 转载自 镜中影的技术博客
本文链接地址: OceanBase SQL解析源码分析(一)
URL:http://blog.csdn.net/linkpark1904/article/details/50778265
一、 编译原理基础
涉及到SQL解析,当然离不开编译原理相关知识,毕竟SQL也是一门计算机语言,用于操作数据库,所以在数据库系统中,SQL解析模块为最上层模块,将SQL语句解析为后续模块能够读懂的语法树。
一般编译器编译源程序要经过如下图1-1几个步骤:
然而,在SQL语句解析中,OceanBase用到了Flex与Bison作为词法解析程序和语法解析程序的构建工具,在数据库系统中,对于SQL解析在语法分析阶段生成SQL语法树,然后对SQL语法树进行分析生成逻辑计划,然后进行查询优化,生成物理执行计划,所以,在数据库系统中代码优化部分以及目标代码生成部分和传统的编译器不同,其查询优化部分可以类比为代码优化,而生成物理执行计划部分可以类比为目标代码生成部分。
这里的重点在于词法分析以及语法分析,那么词法分析和语法分析的最主要作用如下:
词法分析:词法分析程序又称扫描器。进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单位,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数。
语法分析:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类。分析时如果发现有不合法规则的符号,要把这些出错的符号报给程序员。语法分析与语文中分析句子成分类似,分析过程常用语法树(怎样用数据结构来描述语法树,对于SQL解析程序来说极为重要)来表示句子。
另外,还有一个重要的概念——符号表。在编译过程中要记录源程序中出现的标识符,并收集每个标志符的各种属性信息。在词法分析中,对所有的标识符都用一个统一的符号表示,那么这个符号代表的标识符是变量名、函数名还是其他对象的名称呢?如