3

I have written a function inside PostgreSQL which has the following code:


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);
}

The input strings are {ALGERIA,ARGENTINA,BRAZIL,CANADA}. The code runs for ALGERIA,ARGENTINA but terminates abruptly for BRAZIL. When I investigated I found that inside datumCopy function, the statement after memcpy is not getting printed. I checked if palloc failed with (s == NULL) condition, but that seems to be not the reason. I think memcpy is failing. Any reason why? Thanks!

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;
}

EDITED : Ok this is really wierd. When the input is one of {BRAZIL,PAKISTAN,FRANCE}, the code terminates abruptly. If I have other countries (I haven't tried extensively, but some countries), the code runs correctly.

EDITED 2 : Found the cause and rectified the issue. If we are passing C strings to datumCopy, we have to pass -2 for typLen parameter. I had been passing it incorrectly.

Thanks!

0

1 Answer 1

4

I have found the cause and rectified the issue.

If we are passing C strings to datumCopy, we have to pass -2 for typLen parameter. I had been passing it incorrectly.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.