对gram.y的解析(二)

源码链接

https://www.gitlink.org.cn/Eao3piq4e/openGauss-server/tree/master/src%2Fcommon%2Fbackend%2Fparser%2Fgram.y

概述

        接上一篇博客对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 。

总结

        这些函数在生成语法树的过程中发挥了很大的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔走的月光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值