1: 基本概念
postgres数据库将用户输入的sql命令作为字符串传递给查询分析器,并对其进行词法分析和语法分析,最后生成分析数。
2: 使用工具
词法分析和语法分析是由Unix工具Yacc和Lex制作的。具体使用的是Bison和Flex。
3:postgres相关的文件
[1] kwlist.h: 声明keyword列表(包括保留关键字和非保留关键字,关键字是SQL 语句中具有特殊含义的单词,例如 SELECT , UPDATE , DELETE 等等。 它们之中有的能够直接作为标识符,被称为非保留关键字(简称非保留字),但有需要经过特殊处理(比如加create table `rank`...)才能作为标识符的字,被称为保留关键字(简称保留字))。
具体的:keyword: (name, token_value,category)。
[2] kwlookup.cpp: 定义ScanKeywordLookup函数实现,该函数判断输入的字符串是否是关键字,若是关键字,则返回关键字列表中单词的指针,采用二分查找。没有匹配的则返回NULL。
[3] scanup.c:提供几个词法分析时常用的函数。scanstr函数处理转义字符,downcase_truncate_identifier函数将大写英文字符转换为小写字符,truncate_identifier函数截断超过最大标识符长度的标识符,scanner_isspace函数判断输入字符是否为空白字符
[4] scan.l:定义词法结构,编译生成scan.c;这里会忽略comment等无用信息。
[5] gram.y:定义语法结构,编译生成gram.c;分析后生成语法分析树。
[6] check_keywords.pl: 检查在gram.y和kwlist.h中定义的关键字列表是否一致
4: postgres相关的执行顺序:
5: 函数入口raw_parser:
给一个sql语句进行词法分析和语法分析,最后生成一个解析树parsetree.
其中重要的三步:[1] 初始化flex