PostgreSQL澄清

时间:2014-06-27 08:25:56

标签: postgresql

我在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。我错误地传递了它。

谢谢!

1 个答案:

答案 0 :(得分:4)

我找到了原因并纠正了这个问题。

如果我们将C字符串传递给datumCopy,我们必须为typLen参数传递-2。我错误地传递了它。