This question was migrated来自数据库管理员堆栈交换,因为它可以在堆栈溢出时得到响应。
Migrated5年前。
我在PostgreSQL中编写了一个函数,它包含以下代码:
输入字符串是{阿尔及利亚、阿根廷、巴西、加拿大}。该代码适用于阿尔及利亚、阿根廷,但突然终止于巴西。当我调查时,我发现在
编辑:好的,这真的很好。当输入为{巴西、巴基斯坦、法国}之一时,代码会突然终止。如果我有其他国家(我没有广泛尝试,但有些国家),代码运行正确。
编辑2:找到原因并纠正问题。如果要将C字符串传递给
谢谢!
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