Postgresql UDF之返回集合的C语言函数(SRF)

什么是SRF

SRFpostgres提供的一种api,可以用来编写c语言函数实现返回结果集的功能。用户执行一次函数,函数多次被调用,每次调用返回一行结果。


如何编写代码

编写SRF的函数,代码结构有固定的几处地方,如下:

#inlcude  “funcapi.h”
 
/*调用方式为v1*/
Datum  function_name(PG_FUNCTION_ARGS)
{
    /* Variable declaration
    …..
    …..
    
    /*这两个变量很重要,funcctx 维护函数调用期间的内存环境,
    初始化函数调用之前的内存并临时存储函数调用的结果;
    oldcontext 显而易见,记录函数调用时所在的内存上下文,
    每个涉及到内存上下文处理的函数都会用到*/   
    FuncCallContext *funcctx;
    MemoryContext oldcontext;/

 
    if(SRF_IS_FISRTCALL())  //判断该函数是否是第一次调用,前面说过每次调用都返回一行 
    { 
        funcctx = SRF_FIRSTCALL_INIT();   //第一次调用,需要申请一段内存用来存放函数多次调用的状态信息
                                          //以及每次调用返回的结果。

 
        oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
        /**
            用户代码...... 
        **/
        MemoryContextSwitchTo(oldcontext); //切换回程序运行环境
    } 
 
 
 
    /*获取第一次调用时申请的内存,因为这个内存在函数的多次调用期间一直存在,
      所以如果存储上次函数调用结果的内存有内容,会被清空以存储该次调用返回的结果。*/
    funcctx  = SRF_PERCALL_SERUP();     

    
    while(/*satisfy the conditions*/)
    {
        /*
        用户代码
        get or construct the result
        */

 
        SRF_RETURN_NEXT(funcctx,result);  //返回结果,并进行下一次函数调用
    }
    
    
    SRF_RETURN_DONE(funcctx); // 清除第一次调用申请的内存。
}


阅读SRF相关操作的源码宏定义,有个一直困扰我的问题,postgres源代码里面fcinfo到底是怎么实现的。。。

你可能感兴趣的:(源码,postgres,SRF)