PostgreSQL 源码解读(177)- 内核研发#3(如何添加系统字段)#3

本节继续处理上一节给出的任务,重点介绍第三部分:实现,这一部分实现了类似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,转换存储表达式/查询树为源文本.

三、参考资料

Flex&Bison

请使用浏览器的分享功能分享到微信等