【问题标题】:PostgreSQL C function, how to return array of textPostgreSQL C函数,如何返回文本数组
【发布时间】: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


    【解决方案1】:

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

    elems[i] = PointerGetDatum(cstring_to_text(ngrams[i]))
    

    【讨论】:

    • 我分配了新的 text* 项目并将 CString 复制到 VARDATA(item)。当然还有 SET_VARSIZE。
    • 你是为数组中的任何字段做的吗?
    • 尝试使用 --with-casserts 选项编译 PostgreSQL,也许会有帮助
    猜你喜欢
    • 2012-06-17
    • 2012-06-04
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2021-11-27
    • 2021-01-30
    相关资源
    最近更新 更多