Crash on SRF execution
От | Itai |
---|---|
Тема | Crash on SRF execution |
Дата | |
Msg-id | DUB127-W92B3678124F37C0807FCA8AD050@phx.gbl обсуждение исходный текст |
Ответы |
Re: Crash on SRF execution
(Tom Lane <tgl@sss.pgh.pa.us>)
Re: Crash on SRF execution (Andres Freund <andres@2ndquadrant.com>) |
Список | pgsql-hackers |
<div dir="ltr">Hi<br /> <br />I'm attempting to program a simple SRF function but it constantly crashes (details and codebelow).<br /> <br />Any idea why?<br /> <br />Thanks!<br /> <br />-Itai<br />-------------------------------------------------------------<br/>Environment<br />-------------------------------------------------------------<br/>Ubunto: 14.04.2 (server)<br />PG Ver: PostgreSQL 9.4.1on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, 64-bit<br />Install: deb <a href="http://apt.postgresql.org/pub/repos/apt/">http://apt.postgresql.org/pub/repos/apt/</a>trusty-pgdg main<br />Dev: postgresql-server-dev-9.4(9.4.1-1.pgdg14.04+1)<br />-------------------------------------------------------------<br />Execution<br/>-------------------------------------------------------------<br />select * from pg_srf();<br />INFO: -----------data source -----------<br />INFO: value: 1203000000<br />INFO: is_even: 1<br />INFO: value: 1203000001<br/>INFO: is_even: 0<br />...<br />INFO: value: 1203003998<br />INFO: is_even: 1<br />INFO: value: 1203003999<br/>INFO: is_even: 0<br />INFO: ----------- data context -----------<br />INFO: call_cntr: 0<br />INFO: value:1203000000<br />INFO: is_even: 1<br />INFO: call_cntr: 1<br />INFO: value: 1203000001<br />INFO: is_even: 0<br/>INFO: call_cntr: 2<br />server closed the connection unexpectedly<br /> This probably means the server terminatedabnormally<br /> before or while processing the request.<br />The connection to the server was lost. Attemptingreset: Failed.<br />!> <br />-------------------------------------------------------------<br />pg_srf.h<br/>-------------------------------------------------------------<br />#ifndef PGSRF_H<br />#define PGSRF_H<br/>#include "fmgr.h"<br />// using int as bool due to a different issue (one prob. at a time)<br />typedef structNumber_tag<br />{<br /> int value;<br /> int is_even;<br />} Number;<br />typedef struct NumberList_tag<br />{<br /> intlength;<br /> Number ** pp_numbers;<br />} NumberList;<br />extern Datum pg_srf(PG_FUNCTION_ARGS);<br />#endif<br />-------------------------------------------------------------<br/>pg_srf.c<br />-------------------------------------------------------------<br/>#include <postgres.h><br />#include <access/htup_details.h><br/>#include <catalog/pg_type.h><br />#include <funcapi.h><br />#include "pg_srf.h"<br/>#ifdef PG_MODULE_MAGIC<br />PG_MODULE_MAGIC;<br />#endif<br />PG_FUNCTION_INFO_V1(pg_srf);<br />Datum<br />pg_srf(PG_FUNCTION_ARGS)<br/>{<br /> int call_cntr, i, length, base_num;<br /> Number * num;<br /> NumberList * list;<br/> HeapTuple rettuple;<br /> FuncCallContext *funcctx;<br /> MemoryContext oldcontext;<br /> if (SRF_IS_FIRSTCALL())<br/> {<br /> length = 4000;<br /> base_num = 1203000000;<br /> list = (NumberList *)palloc(sizeof(NumberList));<br/> list->pp_numbers = (Number **)palloc(sizeof(Number*) * length);<br /> list->length= length;<br /> i = 0;<br /> for (; i < length; i++)<br /> {<br /> num = (Number *)palloc(sizeof(Number));<br/> num->value = base_num + i;<br /> num->is_even = ((base_num + i) % 2 == 0) ? 1 :0;<br /> list->pp_numbers[i] = num;<br /> }<br /> ereport(INFO, (errmsg("----------- data source -----------")));<br/> i = 0;<br /> for (; i < length; i++)<br /> {<br /> ereport(INFO, (errmsg("value: %d", list->pp_numbers[i]->value)));<br/> ereport(INFO, (errmsg("is_even: %d", list->pp_numbers[i]->is_even))); <br/> }<br /> <br /> funcctx = SRF_FIRSTCALL_INIT();<br /> oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);<br/> funcctx->user_fctx = list;<br /> funcctx->max_calls= list->length;<br /> if (get_call_result_type(fcinfo, NULL, &funcctx->tuple_desc) !=TYPEFUNC_COMPOSITE)<br /> ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),<br /> errmsg("check if sql functiondefinition returns SETOF record")));<br /><br /> BlessTupleDesc(funcctx->tuple_desc);<br /> MemoryContextSwitchTo(oldcontext);<br/> }<br /> funcctx = SRF_PERCALL_SETUP();<br /> list = funcctx->user_fctx;<br/> call_cntr = funcctx->call_cntr;<br /> if (call_cntr < funcctx->max_calls)<br /> {<br/> Datum retvals[2];<br /> bool retnulls[2];<br /> <br /> if (call_cntr == 0) <br /> {<br /> ereport(INFO,(errmsg("----------- data context -----------")));<br /> }<br /> ereport(INFO, (errmsg("call_cntr: %d",call_cntr)));<br /> ereport(INFO, (errmsg("value: %d", list->pp_numbers[call_cntr]->value)));<br /> retvals[0]= Int32GetDatum(list->pp_numbers[call_cntr]->value);<br /> ereport(INFO, (errmsg("is_even: %d", list->pp_numbers[call_cntr]->is_even)));<br/> retvals[1] = Int32GetDatum(list->pp_numbers[call_cntr]->is_even);<br/> retnulls[0] = false;<br /> retnulls[1] = false;<br /> rettuple= heap_form_tuple(funcctx->tuple_desc, retvals, retnulls);<br /> SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(rettuple));<br/> }<br /> else<br /> {<br /> SRF_RETURN_DONE(funcctx);<br /> }<br />}<br />-------------------------------------------------------------<br/>Makefile<br />-------------------------------------------------------------<br/>MODULES = pg_srf<br />OBJS = pg_srf.o<br />PG_CONFIG= pg_config<br />PGXS := $(shell $(PG_CONFIG) --pgxs)<br />include $(PGXS)<br />-------------------------------------------------------------<br/>SQL<br />-------------------------------------------------------------<br/>CREATE OR REPLACE FUNCTION<br /> pg_srf(OUT value integer,OUT is_even integer)<br />RETURNS <br /> SETOF record<br />AS<br /> 'pg_srf.so', 'pg_srf'<br />LANGUAGE<br /> C<br/>STRICT<br />IMMUTABLE;<br /></div>
В списке pgsql-hackers по дате отправления:
Предыдущее
От: Andres FreundДата:
Сообщение: Re: Merge compact/non compact commits, make aborts dynamically sized