微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL如何实现类似CURRENT_DATE函数的功能

小编给大家分享一下Postgresql如何实现类似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,转换存储表达式/查询树为源文本.

以上是“Postgresql如何实现类似CURRENT_DATE函数功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程之家行业资讯频道!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐