还有一个特殊的API用于提供从C语言函数中返回集合(多行)。
一个返回集合的函数必须遵循版本-1的调用方式。
同样,源代码必须包含funcapi.h,就像上面说的那样。
一个返回集合的函数(SRF)通常为它返回的每个项都调用一次。
因此SRF必须保存足够的状态用于记住它正在做的事情以及在每次调用的时候返回下一个项。
表函数 API 提供了FuncCallContext结构用于帮助控制这个过程。
fcinfo->flinfo->fn_extra
用于保存一个跨越多次调用的指向FuncCallContext的指针。typedef struct
{
/*
* 前面已经被调用的次数
* 初始的时候,call_cntr 被 SRF_FIRSTCALL_INIT() 置为 0,
*并且每次你调用 SRF_RETURN_NEXT() 的时候都递增
*/
uint32 call_cntr;
/*
* 可选的最大调用数量
* 这里的 max_calls 只是为了方便,设置它也是可选的。
* 如果没有设置,你必须提供可选的方法来知道函数何时结束。
*/
uint32 max_calls;
/*
* 指向结果槽位的可选指针
* 这个数据类型已经过时,只用于向下兼容。也就是那些使用已废弃的TupleDescGetSlot()的用户定义 SRF
*/
TupleTableSlot *slot;
/*
* 可选的指向用户提供的杂项环境信息的指针
* user_fctx 用做一个指向你自己的结构的指针,包含任意提供给你的函数的调用间的环境信息
*/
void *user_fctx;
/*
* 可选的指向包含属性类型输入元信息的结构数组的指针
* attinmeta 用于在返回行的时候(也就是说返回复合数据类型)
* 在只返回基本(也就是标量)数据类型的时候并不需要。
* 只有在你准备用 BuildTupleFromCStrings() 创建返回行的时候才需要它。
*/
AttInMetadata *attinmeta;
/*
* 用于必须在多次调用间存活的结构的内存环境
* multi_call_memory_ctx 是由 SRF_FIRSTCALL_INIT() 为你设置的,并且由 SRF_R