小编给大家分享一下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] 举报,一经查实,本站将立刻删除。