本节继续处理上一节给出的任务,重点介绍第三部分:实现,这一部分实现了类似CURRENT_DATE函数的功能.
一、实现
实现部分,涉及到转换SQLValueFunction(在gram.y中把新增的列zz_sysdate设置为SQLValueFunction),解析SQLValueFunction以及PG的一些内部处理.
转换SQLValueFunction
SQLValueFunction转换在文件src/backend/parser/parse_expr.c中,对应的函数是transformSQLValueFunction,新增/修改的相关代码如下:
static Node *
transformSQLValueFunction(ParseState *pstate, SQLValueFunction *svf)
{
switch (svf->op)
{
...
case SVFOP_ZZ_SYSDATE:
svf->type = DATEOID;
break;
解析SQLValueFunction
解析SQLValueFunction在文件src/backend/executor/execExprInterp.c中,对应的函数是ExecEvalSQLValueFunction,相关代码如下:
void
ExecEvalSQLValueFunction(ExprState *state, ExprEvalStep *op)
{
switch (svf->op)
{
...
case SVFOP_ZZ_SYSDATE:
*op->resvalue = DateADTGetDatum(GetSQLCurrentDate());
break;
内部处理
PG的内部处理在文件src/backend/utils/adt/ruleutils.c中,对应的函数是get_rule_expr,相关代码如下:
static void
get_rule_expr(Node *node, deparse_context *context,
bool showimplicit)
{
...
...
case T_SQLValueFunction:
{
SQLValueFunction *svf = (SQLValueFunction *) node;
/*
* Note: this code knows that typmod for time, timestamp, and
* timestamptz just prints as integer.
*/
switch (svf->op)
{
...
case SVFOP_ZZ_SYSDATE:
appendStringInfoString(buf, "ZZ_SYSDATE");
break;
二、源码解读
parse_expr.c : handle expressions in parser,处理解析器中的表达式;
execExprInterp.c : 表达式(步骤)的解析求值;
ruleutils.c : Functions to convert stored expressions/querytrees back to source text,转换存储表达式/查询树为源文本.