我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL如何实现输出

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL如何实现输出

这篇文章主要介绍了PostgreSQL如何实现输出,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、输出

参照current_date函数,首先通过日志跟踪其parse tree,重点关注targetList

 2019-04-19 17:06:15.591 CST,"xdb","testdb",1693,"[local]",5cb98b16.69d,3,"SELECT",2019-04-19 16:47:18 CST,3/4,0,LOG,00000,"parse tree:","   {QUERY 
   :commandType 1 
   ...
   :targetList (
      {TARGETENTRY 
      :expr 
         {SQLVALUEFUNCTION 
         :op 0 
         :type 1082 
         :typmod -1 
         :location 7
         }
      :resno 1 
      :resname current_date 
      :ressortgroupref 0 
      :resorigtbl 0 
      :resorigcol 0 
      :resjunk false
      }
   )
   ...
   :stmt_len 27
   }

分析源代码,找到与输出相关的文件是class="lazy" data-src/backend/parser/parse_target.c,相关的函数为transformTargetEntry,跟踪此函数,打印调用栈:

(gdb) bt
#0  transformTargetEntry (pstate=0x16afae8, node=0x16af770, expr=0x0, exprKind=EXPR_KIND_SELECT_TARGET, colname=0x0, 
    resjunk=false) at parse_target.c:93
#1  0x000000000060b1f9 in transformTargetList (pstate=0x16afae8, targetlist=0x16af828, exprKind=EXPR_KIND_SELECT_TARGET)
    at parse_target.c:191
#2  0x00000000005b1e3a in transformSelectStmt (pstate=0x16afae8, stmt=0x16af938) at analyze.c:1243
#3  0x00000000005b03db in transformStmt (pstate=0x16afae8, parseTree=0x16af938) at analyze.c:301
#4  0x00000000005b02b6 in transformOptionalSelectInto (pstate=0x16afae8, parseTree=0x16af938) at analyze.c:246
#5  0x00000000005b0174 in transformTopLevelStmt (pstate=0x16afae8, parseTree=0x16afa50) at analyze.c:196
#6  0x00000000005affcc in parse_analyze (parseTree=0x16afa50, sourceText=0x16aed78 "select current_date from t1;", 
    paramTypes=0x0, numParams=0, queryEnv=0x0) at analyze.c:116
#7  0x00000000008bb78c in pg_analyze_and_rewrite (parsetree=0x16afa50, 
    query_string=0x16aed78 "select current_date from t1;", paramTypes=0x0, numParams=0, queryEnv=0x0) at postgres.c:689
#8  0x00000000008bbddd in exec_simple_query (query_string=0x16aed78 "select current_date from t1;") at postgres.c:1070
#9  0x00000000008c01f3 in PostgresMain (argc=1, argv=0x16dcd28, dbname=0x16dcb90 "testdb", username=0x16aba98 "xdb")
    at postgres.c:4182
#10 0x000000000081e0ce in BackendRun (port=0x16d0b50) at postmaster.c:4361
#11 0x000000000081d841 in BackendStartup (port=0x16d0b50) at postmaster.c:4033
#12 0x0000000000819c3b in ServerLoop () at postmaster.c:1706
#13 0x00000000008194f1 in PostmasterMain (argc=1, argv=0x16a9a50) at postmaster.c:1379
#14 0x0000000000742993 in main (argc=1, argv=0x16a9a50) at main.c:228

其中FigureColnameInternal函数为current_date设置输出列名,添加以下代码,则实现输出sysdate:

//Hacker : 添加系统列
case SVFOP_ZZ_SYSDATE:
                    *name = "sysdate";//zz_sysdate -> sysdate
                    return 2;

相关源码解读


TargetEntry *
transformTargetEntry(ParseState *pstate,
                     Node *node,
                     Node *expr,
                     ParseExprKind exprKind,
                     char *colname,
                     bool resjunk)
{
    
    //expr为NULL,则转换之
    if (expr == NULL)
    {
        
        if (exprKind == EXPR_KIND_UPDATE_SOURCE && IsA(node, SetToDefault))
            expr = node;
        else
            expr = transformExpr(pstate, node, exprKind);
    }
    if (colname == NULL && !resjunk)
    {
        
        colname = FigureColname(node);
    }
    //返回TargetEntry
    return makeTargetEntry((Expr *) expr,
                           (AttrNumber) pstate->p_next_resno++,
                           colname,
                           resjunk);
}

char *
FigureColname(Node *node)
{
    char       *name = NULL;
    (void) FigureColnameInternal(node, &name);
    if (name != NULL)
        return name;
    
    return "?column?";
}

static int
FigureColnameInternal(Node *node, char **name)
{
    int            strength = 0;
    if (node == NULL)
        return strength;
    switch (nodeTag(node))
    {
        ...
        case T_SQLValueFunction:
            
            switch (((SQLValueFunction *) node)->op)
            {
                case SVFOP_CURRENT_DATE:
                    *name = "current_date";
                    return 2;
                ...
                //Hacker : 添加系统列
                case SVFOP_ZZ_SYSDATE:
                    *name = "sysdate";//zz_sysdate -> sysdate
                    return 2;
            }
            break;
        ...
    }
}

感谢你能够认真阅读完这篇文章,希望小编分享的“PostgreSQL如何实现输出”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL如何实现输出

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

php如何实现输出

这篇文章给大家分享的是有关php如何实现输出的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php输出方法:1、使用echo语句输出,例“echo hi!”;2、使用print语句输出;3、使用printf()函数
2023-06-14

VBScript如何实现输出中的对齐

这篇文章主要介绍了VBScript如何实现输出中的对齐,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。运行效果:代码(fOutput.vbs):strComputer = ".
2023-06-08

c语言如何实现声音输出

在C语言中,可以使用音频库来进行声音输出。以下是使用ALSA音频库来实现声音输出的示例代码:#include int main() {int err;snd_pcm_t *handle;snd_pcm_hw_params_t *param
2023-10-25

如何使用shell实现转换输出

这篇文章主要为大家展示了“如何使用shell实现转换输出”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用shell实现转换输出”这篇文章吧。一个简单的转换输出的shell脚本,从健盘输入
2023-06-09

shell命令行如何实现输入与输出功能

这篇文章将为大家详细讲解有关shell命令行如何实现输入与输出功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。标准输入/输出和重定向,Linux发行版Fedora Core Linux,而Red Hat
2023-06-09

Python中如何实现format()格式化输出

这篇文章主要为大家展示了“Python中如何实现format()格式化输出”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中如何实现format()格式化输出”这篇文章吧。format
2023-06-25

css如何实现文本不换行输出

今天小编给大家分享一下css如何实现文本不换行输出的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。具体操作方法:1.首先创建一
2023-07-04

python如何实现控制台输出颜色

这篇“python如何实现控制台输出颜色”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“python如何实现控制台输出颜色”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获
2023-06-06

php如何实现只在本地输出错误

这篇文章主要讲解了“php如何实现只在本地输出错误”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现只在本地输出错误”吧!首先,我们需要了解PHP的错误处理机制。在PHP中,所有的
2023-07-05

Java中FileWriter如何实现输出换行操作

小编给大家分享一下Java中FileWriter如何实现输出换行操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!FileWriter输出换行使用Java的Fil
2023-06-20

python实现输出日历

终于还有一个星期就放暑假了,可以抽出时间来学点新的东西,想想半年多没登CSDN差点把密码忘了我也是醉了。废话不多说,正文开始以下是使用几个简单的函数实现给定指定年月实现当月日历输出的程序,大部分内容引用自网易云课堂哈工大开设的Python程
2023-01-31

Java如何实现判断并输出文件大小

这篇文章主要介绍了Java如何实现判断并输出文件大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-15

如何实现控制输出颜色的shell脚本

小编给大家分享一下如何实现控制输出颜色的shell脚本,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现代码:#!/bin/sh# ANSI Color -- U
2023-06-09

R语言如何实现输出九九乘法表

这篇文章给大家分享的是有关R语言如何实现输出九九乘法表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在R语言中,使用cat()函数可以将多个变量连接起来并输出到控制台或者File文件中。演示cat()函数的用法/
2023-06-08

编程热搜

目录