Postgres C扩展聚合:如何检测第一次聚合函数被调用

时间:2018-01-23 02:25:53

标签: c postgresql

我正在为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 }
}

我不想在这里使用全局变量或静态变量,因为这使得我的函数不是线程安全的,这对我的函数的要求很猛烈。

1 个答案:

答案 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 }
}