我试图在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;
答案 0 :(得分:0)
你确定,所以你的数组包含text或varchar值吗? text
类型不是C字符串!前N(1,2,4)字节保持长度,其他字节是数据。您必须将C字符串转换为具有函数cstring_to_text
elems[i] = PointerGetDatum(cstring_to_text(ngrams[i]))