Problem with heap_form_tuple error

From: Stephen Woodbridge <woodbri(at)swoodbridge(dot)com>
To: PostgreSQL General <pgsql-general(at)postgresql(dot)org>
Subject: Problem with heap_form_tuple error
Date: 2012-11-05 14:50:59
Message-ID: 5097D253.9020609@swoodbridge.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi all,

I'm have a problem with heap_form_tuple error
ERROR: invalid memory alloc request size 1149502660

I've read through a ton of examples and read through the code and the
docs and I'm sure I'm doing something stupid but I'm not seeing it. I
have included a very reduced sample of the code below trying to focus on
the relevant parts.

1. how I get my return tuple_desc
2. how I prepare my values and nulls arrays

I am totally stuck on this! So I really need some help to point out the
error of my ways here.

Thanks,
-Steve

if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;

/* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();

/* create a function context for cross-call persistence */
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);

...

if (get_call_result_type( fcinfo, NULL, &tuple_desc ) !=
TYPEFUNC_COMPOSITE ) {
elog(ERROR, "function returning record called in context"
" that cannot accept type record");
std_free(std);
return finish(-1);
}
/* since this is a defined composite type,
I probably do not need to bless it,
but the example in the docs said to */
BlessTupleDesc(tuple_desc);
/* save this for later usage also */
funcctx->tuple_desc = tuple_desc;

MemoryContextSwitchTo(oldcontext);

DBG("finished first call setup");
}

funcctx = SRF_PERCALL_SETUP();

call_cntr = funcctx->call_cntr;
max_calls = funcctx->max_calls;
tuple_desc = funcctx->tuple_desc; /* the result record description */
fctx = (std_fctx *) funcctx->user_fctx;
std = fctx->std;

...

if (call_cntr < max_calls) { /* do while there are more to send */
Datum *values;
bool *nulls;
int id;
int k;

HeapTuple addr_tuple = spi_tuptable->vals[call_cntr];

...

values = (Datum *) palloc(17 * sizeof(Datum));
nulls = (bool *) palloc(17 * sizeof(bool));
for (k=0; k<17; k++) {
values[k] = (Datum) 0;
nulls[k] = true;
}
values[0] = Int32GetDatum(id);
nulls[0] = false;
if (stdaddr->building) {
DBG("building %d", strlen(stdaddr->building));
values[1] = CStringGetDatum(pstrdup(stdaddr->building));
nulls[1] = false;
}
... more if blocks for values[2..15] ...
if (stdaddr->unit) {
DBG("unit %d", strlen(stdaddr->unit));
values[16] = CStringGetDatum(pstrdup(stdaddr->unit));
nulls[16] = false;
}
HeapTuple tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
}
...

when this runs DBG logs the following:

NOTICE: city='NORTH CHELMSFORD', state='MASSACHUSETTS', postcode='01863'
NOTICE: setup values and nulls array for natts=17
NOTICE: house_num 2
NOTICE: name 8
NOTICE: suftype 4
NOTICE: city 16
NOTICE: state 13
NOTICE: postcode 5
NOTICE: calling heap_form_tuple
ERROR: invalid memory alloc request size 1149502660

the stdaddr fields all have reasonable null terminated CStrings in them.

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Frank Broniewski 2012-11-05 15:11:39 Re: Memory issue on FreeBSD
Previous Message Achilleas Mantzios 2012-11-05 14:21:50 Re: Memory issue on FreeBSD