【发布时间】:2015-10-30 16:43:19
【问题描述】:
我正在尝试在 PostgreSQL 9.3 中编写一个 C 函数,它接收一个文本并返回一个文本数组。当我返回一个文本或 varchar 数组时,我的函数使服务器崩溃,但当我尝试返回一个数字或布尔值数组时它工作正常。我认为指针变量类型的数组或内存分配存在问题。谁能帮我解决这个问题?
这是我的 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);
如您所见。我的函数运行良好,直到最后一行,我可以看到它发出通知“Test %d”。 这是我用来创建函数的 SQL 代码:
CREATE FUNCTION ngram(text) RETURNS text[] AS '$libdir/libziePGExtension', 'ngram' LANGUAGE C IMMUTABLE STRICT;
【问题讨论】:
标签: c arrays postgresql plpgsql