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
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Crash on SRF execution