千家信息网

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

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,小编给大家分享一下PostgreSQL如何实现类似CURRENT_DATE函数的功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解
千家信息网最后更新 2025年01月20日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,相关代码如下:

voidExecEvalSQLValueFunction(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 voidget_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函数的功能"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0