ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL 源码解读(177)- 内核研发#3(如何添加系统字段)#3

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

原创 PostgreSQL 作者:husthxd 时间:2019-04-24 10:07:24 0 删除 编辑

本节继续处理上一节给出的任务,重点介绍第三部分:实现,这一部分实现了类似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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2642330/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
长期从事政务、金融等行业产品研发和架构设计工作,ITPUB数据库版块资深版主,对Oracle、PostgreSQL以及大数据等相关技术有深入研究。现就职于广州云图数据技术有限公司,系统架构师。

注册时间:2007-12-28

  • 博文量
    1250
  • 访问量
    3724314