2021SC@SDUSC
我负责的PostgreSQL代码部分:查询的编译与执行
此篇博客的分析内容:查询分析源码
原因:由查询处理的完整流程图可知:查询分析是处于核心地位的,统领查询重写和调度等相关内容,所以我按照一个清晰的框架,首先从查询分析入手。
查询分析
功能:由SQL查询语句生成查询树
源码路径:src/backend/parser
主要部分:词法分析,语法分析,语义分析
重要源码文件及调用关系:
kwlist.h:SQL关键字定义,注意:关键字名要小写,按照字符串值顺序定义
kwlookup.h:定义结构体ScanKeyword;
kwlookup.c:使用kwlist.h初始化关键字数组ScanKeywords,提供ScanKeywordLookup函数,该函数判断输入的字符串是否是关键字,若是则返回当前标识符指向关键字列表中对应单词的指针,采用二分法查找;
scanup.c:提供几个词法分析时常用的函数。scanstr函数处理转义字符,downcase_truncate_identifier函数将大写英文字符转换为小写字符,truncate_identifier函数截断超过最大标识符长度的标识符,scanner_isspace函数判断输入字符是否为空白字符。
scan.l:定义词法结构,编译生成scan.c;这里会忽略comment等无用信息。
gram.y:定义语法结构,编译生成gram.c;分析后生成语法分析树。
gram.h:定义关键字的数值编号。
辅助脚本:
check_keywords.pl:检查在gram.y 和 kwlist.h 中定义的关键字列表是否一致。
查询分析执行流程: