我在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);
}
输入字符串是{ALGERIA,ARGENTINA,BRAZIL,CANADA}。代码运行阿尔及利亚,阿根廷但突然终止巴西。当我调查时发现在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;
}
编辑:好的,这真的很奇怪。当输入是{BRAZIL,PAKISTAN,FRANCE}之一时,代码突然终止。如果我有其他国家(我还没有尝试过,但有些国家/地区),代码运行正常。
编辑2:找到原因并纠正了问题。如果我们将C字符串传递给datumCopy
,我们必须为typLen
参数传递-2。我错误地传递了它。
谢谢!
答案 0 :(得分:4)
我找到了原因并纠正了这个问题。
如果我们将C字符串传递给datumCopy
,我们必须为typLen
参数传递-2。我错误地传递了它。