openGauss源码解析(87)

openGauss源码解析:SQL引擎源解析(2)

6.2 SQL解析

1970年,埃德加·科德(Edgar Frank Codd)发表了关系模型的论文,奠定了关系数据库的理论基础,随后在1974年,Boyce和Chamber在关系模型的基础上推出了Sequel语言,后来演进成了SQL(structured auery language,结构化查询语言)语言。SQL语言是一种基于关系代数和关系演算的非过程化语言,它指定用户需要对数据操作的内容,而不指定如何去操作数据,具有非过程化、简单易学、易迁移、高度统一等特点。因此,SQL语言在推出之后就快速地成为数据库中占比最高的语言。

SQL语句在数据库管理系统中的编译过程符合编译器实现的常规过程,需要进行词法分析、语法分析和语义分析。

(1) 词法分析:从查询语句中识别出系统支持的关键字、标识符、操作符、终结符等,确定每个词自己固有的词性。常用工具如flex。
(2) 语法分析:根据SQL语言的标准定义语法规则,使用词法分析中产生的词去匹配语法规则,如果一个SQL语句能够匹配一个语法规则,则生成对应的抽象语法树(abstract synatax tree,AST)。常用工具如Bison。
(3) 语义分析:对抽象语法树进行有效性检查,检查语法树中对应的表、列、函数、表达式是否有对应的元数据,将抽象语法树转换为查询树。

openGuass的SQL解析代码主流程可以用图6-2来表示。执行SQL命令的入口函数是exec_simple_query。用户输入的SQL命令会作为字符串sql_query_string传给raw_parser函数,由raw_parser函数调用base_yyparse进行词法分析和语法分析,生成语法树添加到链表parsetree_list中。完成语法分析后,对于parsetree_list中的每一颗语法树parsetree,openGuass会调用parse_analyze函数进行语义分析,根据SQL命令的不同,执行对应的入口函数,最终生成查询树。

C:\Users\c00588519\Desktop\语法解析demo-第 4 页.png

图6-2 SQL解析代码主流程

词法结构和语法结构分别由scan.l和gram.y文件定义,并通过flex和bison分别编译成scan.cpp和gram.cpp文件。SQL解析的相关源文件说明如表6-1所示。

表6-1 词法结构和语法结构源文件说明

源文件

说明

src/common/backend/parser/scan.l

定义词法结构,采用Lex编译后生成scan.cpp文件

src/common/backend/parser/gram.y

定义语法结构,采用Yacc编译后生成gram.cpp文件

src/common/backend/parser/scansup.cpp

提供词法分析的常用函数

src/common/backend/parser/parser.cpp

词法、语法分析的主入口文件,入口函数是raw_parser

src/common/backend/parser/analyze.cpp

语义分析的主入口文件,入口函数是parse_analyze

posted @ 2024-04-30 10:10  openGauss-bot  阅读(5)  评论(0编辑  收藏  举报