Hi, On 2015-03-15 17:40:11 +0200, Itai wrote: > I'm attempting to program a simple SRF function but it constantly crashes > (details and code below). > > Any idea why?
> if (SRF_IS_FIRSTCALL()) > { > length = 4000; > base_num = 1203000000; > list = (NumberList *)palloc(sizeof(NumberList)); > list->pp_numbers = (Number **)palloc(sizeof(Number*) * length); > list->length = length; > i = 0; > for (; i < length; i++) > { > num = (Number *)palloc(sizeof(Number)); > num->value = base_num + i; > num->is_even = ((base_num + i) % 2 == 0) ? 1 : 0; > list->pp_numbers[i] = num; > } > ereport(INFO, (errmsg("----------- data source -----------"))); > i = 0; > for (; i < length; i++) > { > ereport(INFO, (errmsg("value: %d", list->pp_numbers[i]->value))); > ereport(INFO, (errmsg("is_even: %d", list->pp_numbers[i]->is_even))); > } > > funcctx = SRF_FIRSTCALL_INIT(); > oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); > funcctx->user_fctx = list; > funcctx->max_calls = list->length; > if (get_call_result_type(fcinfo, NULL, &funcctx->tuple_desc) != > TYPEFUNC_COMPOSITE) > ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), > errmsg("check if sql function definition returns SETOF record"))); > > BlessTupleDesc(funcctx->tuple_desc); > MemoryContextSwitchTo(oldcontext); > } The palloc() for list above is in the per call memory context, but you use it across several calls. You should allocate it in the multi call context you use some lines below. Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers