Ok, that worked!
Thank you very much, Jan and others who gave their input.
I did see Tom's input for the VARHDRSZ and tried that, but forgot to add
that again
when I called VARATT_SIZEP
Jan Urbański wrote:
> Tim Hawes wrote:
>
>> @Jan:
>> It appears the cstring_to_text function is unique to the latest
>> PostgreSQL code. I do not have a def for that for PostgreSQL 8.2, and
>
> Oh, I'm sorry, I forgot about that. cstring_to_text has been added
> only recently (it's not even it 8.3, silly me).
>
>> Datum pl_masterkey(PG_FUNCTION_ARGS)
>> {
>> char *e_var = getenv("PGMASTERKEY");
>> size_t length = e_var != NULL ? strlen(e_var) : 0;
>>
>> text * mkey = (text *) palloc(length);
>> VARATT_SIZEP(mkey) = length;
>> memcpy(VARDATA(mkey), e_var, length);
>>
>> PG_RETURN_TEXT_P(mkey);
>> }
>
> You forgot to palloc space for the varlena header. You need an extra
> VARHDRSZ bytes for the header, in addition to what is needed for your
> data.
> Try something like this:
>
> Datum
> pl_masterkey(PG_FUNCTION_ARGS)
> {
> char *e_var;
> size_t length;
> text *mkey;
>
> e_var = getenv("PGMASTERKEY");
> length = e_var ? strlen(e_var) : 0;
> mkey = (text *) palloc(VARHDRSZ + length);
>
> VARATT_SIZEP(mkey) = VARHDRSZ + length;
> memcpy(VARDATA(mkey), e_var, length);
>
> PG_RETURN_TEXT_P(mkey);
> }
>