gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:55 24 4
gpt4 key购买 nike

我正在尝试在 PostgreSQL 9.3 中编写一个 C 函数,它接收一个文本并返回一个文本数组。当我返回一个文本数组或 varchar 时,我的函数使服务器崩溃,但当我尝试返回一个数字或 bool 数组时,它工作正常。我认为指针变量类型数组或内存分配有问题。谁能帮我解决这个问题?

这是我的 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;

最佳答案

您确定,您的数组包含文本或 varchar 值吗? text 类型不是 C 字符串!前 N (1,2,4) 个字节保存长度,其他字节是数据。您必须使用函数 cstring_to_text

将 C 字符串转换为文本类型
elems[i] = PointerGetDatum(cstring_to_text(ngrams[i]))

关于c - PostgreSQL C函数,如何返回文本数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31874312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com