Hi, 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.
Why is the memory of the variable uninitialized? I am not very familiar with Postgres. Is there another method to get a varchar attribute out of a TupleTableSlot as string? Best regards Maria
diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 76dd62f..be05ad0 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -77,6 +77,7 @@ */ #include "postgres.h" +#include "catalog/pg_attribute.h" #include "executor/executor.h" #include "executor/nodeAgg.h" #include "executor/nodeAppend.h" @@ -112,6 +113,7 @@ #include "executor/nodeWindowAgg.h" #include "executor/nodeWorktablescan.h" #include "miscadmin.h" +#include "utils/builtins.h" /* ------------------------------------------------------------------------ @@ -509,6 +511,17 @@ ExecProcNode(PlanState *node) if (node->instrument) InstrStopNode(node->instrument, TupIsNull(result) ? 0.0 : 1.0); + int i; + for(i = 0; i < result->tts_tupleDescriptor->natts; i++) { + if (1042 == result->tts_tupleDescriptor->attrs[i]->atttypid) { + if (0 == result->tts_values[i]) { + printf("null found\n"); + } else { + char *value = TextDatumGetCString(result->tts_values[i]); + } + } + } + return result; }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers