This question was migrated来自数据库管理员堆栈交换,因为它可以在堆栈溢出时得到响应。
Migrated5年前。
我在PostgreSQL中编写了一个函数,它包含以下代码:
for (i = 0; i < 4; i++)
{
   Datum dat_value = CStringGetDatum(inp->str[0][i]);
   values[i] = datumCopy(dat_value,
                            stats->attrtype->typbyval,
                            stats->attrtype->typlen);
}

输入字符串是{阿尔及利亚、阿根廷、巴西、加拿大}。该代码适用于阿尔及利亚、阿根廷,但突然终止于巴西。当我调查时,我发现在datumCopy函数内部,memcpy之后的语句没有被打印出来。我检查了palloc是否出现(s == NULL)症状,但这似乎不是原因。我认为memcpy正在失败。有什么原因吗?谢谢!
Datum
datumCopy(Datum value, bool typByVal, int typLen)
{
Datum       res;

if (typByVal)
    res = value;
else
{
    Size        realSize;
    char       *s;

    if (DatumGetPointer(value) == NULL)
        return PointerGetDatum(NULL);

    realSize = datumGetSize(value, typByVal, typLen);

    s = (char *) palloc(realSize);

    printf ("Value : %s\n",DatumGetPointer(value));
    memcpy(s, DatumGetPointer(value), realSize);
    printf ("Not printing \n");
    res = PointerGetDatum(s);
}
return res;
}

编辑:好的,这真的很好。当输入为{巴西、巴基斯坦、法国}之一时,代码会突然终止。如果我有其他国家(我没有广泛尝试,但有些国家),代码运行正确。
编辑2:找到原因并纠正问题。如果要将C字符串传递给datumCopy,则必须为typLen参数传递-2。我传错了。
谢谢!

最佳答案

我已经找到原因并纠正了这个问题。
如果要将C字符串传递给datumCopy,则必须为typLen参数传递-2。我传错了。

09-30 14:22