Re: Convert Datum* to char* - Mailing list pgsql-hackers

From Masterprojekt Naumann1
Subject Re: Convert Datum* to char*
Date
Msg-id CANjJybTSX1cqzxcbTNJ08rOXKanww_FbDP5==TPCrSze7F4vVQ@mail.gmail.com
Whole thread Raw
In response to Re: Convert Datum* to char*  (Heikki Linnakangas <hlinnakangas@vmware.com>)
List pgsql-hackers
Yes, in some cases, Datum is 0, which I test before conversion. Additionally, I looked at tts_isnull but it does not prevent the segmentation fault in some cases. The problem is. that sometimes the value is random, but I don't know why and how I can detect that case.


2014/1/6 Heikki Linnakangas <hlinnakangas@vmware.com>
On 01/06/2014 03:09 PM, Masterprojekt Naumann1 wrote:
I want to read an attribute value from a TupleTableSlot. When I try to
convert an attribute of SQL type varchar from Datum* to char* with the help
of the method TextDatumGetCString(...), sometimes there is a segmentation
fault. The segmentation fault comes from the method
TextDatumGetCString(...), which is defined in utils/builtins.h.
Unfortunately, the fault is not always reproducible. I debugged the code
and figured out that the value of result->tts_values[i] sometimes is
random. It may be uninitialized memory. In other cases, the variable value
is NULL. Then, I can just skip the conversion from Datum* to char*, so that
there is no segmentation fault. I attached a patch with the code. The
relevant line is:
char *value = TextDatumGetCString(result->tts_values[i]);
The SQL-Query is a simple "SELECT * from ..." on the TPC-H table customer.
About every third execution leads to a segmentation fault.

Maybe the field is NULL? By convention, we normally set the Datum to 0 on an SQL NULL, but you're supposed to check tts_isnull first, and ignore tts_values[x] when tts_isnull[x] is true.

- Heikki

pgsql-hackers by date:

Previous
From: Heikki Linnakangas
Date:
Subject: Re: Convert Datum* to char*
Next
From: Steve Singer
Date:
Subject: Re: In-core regression tests for replication, cascading, archiving, PITR, etc. Michael Paquier