PostgreSQL C函数,如何返回文本数组

时间:2015-08-07 09:29:42

标签: c arrays postgresql plpgsql

我试图在PostgreSQL 9.3中编写一个C函数,它接收文本并返回一个文本数组。当我返回一个text或varchar数组时,我的函数使服务器崩溃,但是当我尝试返回number或boolean数组时,它正常工作。我认为指针变量类型或内存分配数组存在问题。任何人都可以帮我解决问题吗?

这是我的C代码:

text*           arg         = PG_GETARG_TEXT_P(0);
char*           content     = VARDATA(arg);
size_t          size        = VARSIZE(arg);
unsigned int    nMax        = 1000;//size / 2 * NGRAM_MAX; //Maximum number of ngrams is 1/2 of content size;
text**          ngrams      = palloc(nMax * sizeof(text*));


ArrayType       *result;
Datum*          elems;
int16           typlen;
bool            typbyval;
char            typalign;

int n = parseNgram(content, size, ngrams, nMax);

elog(NOTICE, "What's sub %d", n);
elems       = (Datum*)palloc(n * sizeof(Datum));

unsigned short i;
for(i = 0; i < n; i++) {
    elems[i] = PointerGetDatum(ngrams[i]);
}

get_typlenbyvalalign(TEXTOID, &typlen, &typbyval, &typalign);
result = construct_array(elems, n, TEXTOID, typlen, typbyval, typalign);

elog(NOTICE, "Test %d", n);

PG_RETURN_ARRAYTYPE_P(result);

如上所示。我的功能运行良好,直到最后一行,我可以看到它提出通知&#34;测试%d&#34;。 这是我用来创建函数的SQL代码:

CREATE FUNCTION ngram(text) RETURNS text[] AS '$libdir/libziePGExtension', 'ngram' LANGUAGE C IMMUTABLE STRICT;

1 个答案:

答案 0 :(得分:0)

你确定,所以你的数组包含text或varchar值吗? text类型不是C字符串!前N(1,2,4)字节保持长度,其他字节是数据。您必须将C字符串转换为具有函数cstring_to_text

的文本类型
elems[i] = PointerGetDatum(cstring_to_text(ngrams[i]))