postmaster core dumps with SPI_repalloc

Started by Andrey Y. Mosienkoalmost 24 years ago2 messagesgeneral
Jump to latest

Hello All!

I noticed when I create memory pool with SPI_palloc(less than 100) and then
try to reallocate it with SPI_repalloc postmaster core dumps.

But when first SPI_palloc(100 or bigger) everything works fine!

What can be wrong?

Here is trigger example:

CREATE SEQUENCE base_id_seq;

CREATE TABLE "base" (
"id" int4 DEFAULT nextval('base_id_seq'::text) NOT NULL,
"field" text NOT NULL,
"field_m" text NOT NULL,
"field_n" text NOT NULL,
"changed" timestamp NOT NULL DEFAULT NOW(),
PRIMARY KEY ("id"), UNIQUE ("id")
);

INSERT INTO "base" (field, field_m, field_n) VALUES ('test', 'test', 'test');

CREATE FUNCTION archive() RETURNS OPAQUE AS
'/home/feo/WORK/backup/archive.so' LANGUAGE 'C';

CREATE TRIGGER "archive" AFTER UPDATE
ON base FOR EACH ROW
EXECUTE PROCEDURE archive();

archive.c:

#include "executor/spi.h" /* this is what you need to work with SPI */
#include "commands/trigger.h" /* -"- and triggers */

extern Datum archive(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(archive);

Datum
archive(PG_FUNCTION_ARGS)
{
//TriggerData *trigdata = (TriggerData *) fcinfo->context;

int ret, i;
char* sql;
char* fields_names;
char* values;

// Ok ... this is a trigger function ...
// were we called from a trigger??
//
if (!CALLED_AS_TRIGGER(fcinfo))
elog(ERROR, "archive: not fired by trigger manager");

// Connect to the SPI manager
//
if( (ret = SPI_connect()) == SPI_OK_CONNECT ) {
fields_names = SPI_palloc(100);
values = SPI_palloc(100);
sql = SPI_palloc(40);

for (i = 0; i < 10; i++) {
SPI_repalloc(fields_names, sizeof(fields_names) + 100);
SPI_repalloc(values, sizeof(values) + 100);
};
SPI_pfree(fields_names);
SPI_pfree(values);
SPI_pfree(sql);

SPI_finish();
};
// Or if everything failes (no SPI connection)
// we'll just return ... nothing!
return PointerGetDatum(NULL);
}

PgSQL log:
DEBUG: query: update base set field_m = 'test4', changed = NOW() where id = '1';
DEBUG: server process (pid 5909) was terminated by signal 11

--
with respection Andrey Feofilactovich.
e-mail: feo@ttn.ru, feo@feo.org.ru
ICQ: 28073807

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrey Y. Mosienko (#1)
Re: postmaster core dumps with SPI_repalloc

"Andrey Y. Mosienko" <feo@ttn.ru> writes:

char* fields_names;
...
SPI_repalloc(fields_names, sizeof(fields_names) + 100);

Not sure what you were expecting this to do ... but you do realize
that sizeof(fields_names) is a constant here? (Probably 4, but you
did not mention your platform.)

regards, tom lane