我正在为PostgreSQL编写C扩展聚合函数,在C代码中我想知道它是否是第一次调用聚合的转换函数。
例如,我定义了一个聚合函数,例如:
CREATE AGGREGATE my_aggregate (text) (
sfunc = my_transfunc,
stype = text,
finalfunc = my_finalfn,
initcond = '');
然后在 my_transfunc 的C代码中,我怎么知道它是第一次调用my_transfunc(而不是第二次,第三次......时间)。
Datum my_transfunc(PG_FUNCTION_ARGS) {
// How to check if the first time function called
if (first_time) { then do something }
else { do some other things }
}
我不想在这里使用全局变量或静态变量,因为这使得我的函数不是线程安全的,这对我的函数的要求很猛烈。
答案 0 :(得分:1)
通常,这是initcond
的正确设置问题。通常,如果只是正确设计算法,则无需知道该函数是否第一次执行。
在您的情况下,假设函数返回非空字符串,您可以检查参数是否为空(即等于initcond
)。当然,您可以将initcond
设置为特殊值而不是空字符串。
Datum my_transfunc(PG_FUNCTION_ARGS) {
text *arg = PG_GETARG_TEXT_PP(0);
int32 arg_size = VARSIZE_ANY_EXHDR(arg);
if (arg_size == 0) { // arg == initcond }
else { // do some other things }
}