源码链接
概述
接上一篇博客对gram.y的解析(一),这篇博客我来介绍一下C代码段中一些比较重要的函数。
函数
base_yyerror()
函数原型为:
//代码清单1
//src/common/backend/parser/gram.y
static void base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner, const char *msg)
Bison 需要此函数的签名。但是,我们忽略传递的 yylloc ,而是使用扫描仪上可用的最后一个令牌位置。
makeColumnRef()
//代码清单2
//src/common/backend/parser/gram.y
static Node *makeColumnRef(char *colname, List *indirection,int location, core_yyscan_t yyscanner)
生成 ColumnRef 节点,如果指定的间接列表中有任何订阅,则添加 A_Indirection 节点。但是,必须将间接列表开头的任何字段选择转换为 ColumnRef 节点的“字段”部分。
makeBoolAConst()
//代码清单3
//src/common/backend/parser/gram.y
Node *makeBoolAConst(bool state, int location)
创建一个A_Const字符串节点,并将其放入布尔转换中。
check_qualified_name()
//代码清单4
//src/common/backend/parser/gram.y
static void check_qualified_name(List *names, core_yyscan_t yyscanner)
检查 qualified _name 生成的结果,最简单的方法是让 qualified_name 的语法生成允许下标和“*”,然后我们必须在这里拒绝它们。
check_func_name()
//代码清单5
//src/common/backend/parser/gram.y
static List *check_func_name(List *names, core_yyscan_t yyscanner)
检查 func_name 生成的结果,最简单的方法是让 func_name 的语法生成允许下标和“*”,然后我们必须在这里拒绝它们。
insertSelectOptions()
//代码清单6
//src/common/backend/parser/gram.y
static void insertSelectOptions(SelectStmt *stmt,
List *sortClause, List *lockingClause,
Node *limitOffset, Node *limitCount,
WithClause *withClause,
core_yyscan_t yyscanner)
将 ORDER BY 等插入已构建的 SelectStmt 。此例程只是为了避免在已构建的 SelectStmt 中重复代码。
doNegate()
//代码清单7
//src/common/backend/parser/gram.y
static Node *doNegate(Node *n, int location)
处理数值常量的求反。以前,我们在这里这样做是因为优化器无法处理看起来像 "var=-4" 的索引,它需要 "var=const" ,并且应用于常量的一元减运算不符合条件。从 Postgres7.0 开始,这个问题不再存在,因为优化器中有一个常量子表达式简化器。然而,在这里仍然这样做有一个很好的理由,那就是我们可以推迟对简单负常量的特定内部表示的提交。我们最好将像 "-123.456" 这样的负常量保留为字符串形式,直到我们知道所需的类型。
makeRangeVarFromAnyName()
//代码清单8
//src/common/backend/parser/gram.y
static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner)
将(带虚线的)名称列表转换为 RangeVar (类似 makeRangeVarFromNameList ,但可以定位)。"AnyName" 指语法中的 any_name 产物。
processCASbits()
//代码清单9
//src/common/backend/parser/gram.y
static void processCASbits(int cas_bits, int location, const char *constrType,
bool *deferrable, bool *initdeferred, bool *not_valid,
bool *no_inherit, core_yyscan_t yyscanner)
该函数用来处理 ConstraintAttributeSpec 的结果,并在输出命令节点中设置适当的 bool 标志,为不支持特定命令的任何标志传递 NULL 。
总结
这些函数在生成语法树的过程中发挥了很大的作用。