Re: PostgreSQL 8.4 crash on user defined C language function

From: iihero <iihero(at)qq(dot)com>
To: Merlin Moncure <mmoncure(at)gmail(dot)com>, Vincas Dargis <vindrg(at)gmail(dot)com>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: PostgreSQL 8.4 crash on user defined C language function
Date: 2012-04-04 23:38:02
Message-ID: tencent_33FACCA062AA94A2412521E2@qq.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,

In your code, only the last line "pfree(command);" is wrong. No need to put it there. Since you use the constant string for the variable command.

In my test,

here is the result:

iihero=# select test();
INFO: 1
INFO: 2
INFO: 3
INFO: 4
INFO: 5
INFO: 6
INFO: 7
INFO: EXECQ: 1
test
------

(1 row)

------------------
~~~~~~~~~~~~~~~~~~~~~~~~~
iihero
http://www.sql9.comhttp://www.sql6.com
~~~~~~~~~~~~~~~~~~~~~~~~~




------------------ Original ------------------
From: "Merlin Moncure"<mmoncure(at)gmail(dot)com>;
Date: Thu, Apr 5, 2012 01:37 AM
To: "Vincas Dargis"<vindrg(at)gmail(dot)com>;
Cc: "pgsql-general"<pgsql-general(at)postgresql(dot)org>;
Subject: Re: [GENERAL] PostgreSQL 8.4 crash on user defined C language function


On Wed, Apr 4, 2012 at 10:46 AM, Vincas Dargis <vindrg(at)gmail(dot)com> wrote:
> SORRY FOR DUPLICATE EMAIL, I guess I'm really in pretty bad shape...
>
> Hello,
>
> I am experimenting with user defined functions in C, though I have
> problem with stability.
>
> It always crash on palloc() call, SPI_tuptable->tupdesc dereference
> but not on SPI_* calls, for example.
>
> Here is one modified example:
>
> PGDLLIMPORT Datum test(PG_FUNCTION_ARGS)
> {
> char *command;
> int ret;
> int proc;
>
> command = "SELECT 1";
>
> elog(INFO,"1");
>
> SPI_connect();
>
> elog(INFO,"2");
>
> ret = SPI_exec(command, 1);
>
> elog(INFO,"3");
>
> proc = SPI_processed;
>
> elog(INFO,"4");
> /*
> * If some rows were fetched, print them via elog(INFO).
> */
> if (ret > 0 && SPI_tuptable != NULL)
> {
> TupleDesc tupdesc = SPI_tuptable->tupdesc;
> SPITupleTable *tuptable = SPI_tuptable;
> char buf[8192];
> int i, j;
>
> elog(INFO,"5");
> for (j = 0; j < proc; j++)
> {
> HeapTuple tuple = tuptable->vals[j];
>
> elog(INFO,"6");
> for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++)
> {
> snprintf(buf + strlen (buf), sizeof(buf) -
> strlen(buf), " %s%s",
> SPI_getvalue(tuple, tupdesc, i),
> (i == tupdesc->natts) ? " " : " |");
>
> elog(INFO,"7");
> }
> elog(INFO, "EXECQ: %s", buf);
> }
> }
>
> SPI_finish();
> pfree(command);
>
> }
>
> "elog(INFO,"5");" line is not executed, I have to restart crashed
> server after error:
>
> LOG: server process (PID 1628) was terminated by exception 0xC0000005
> HINT: See C include file "ntstatus.h" for a description of the
> hexadecimal value.
> LOG: terminating any other active server processes
>
> 0xC0000005 is access violation, but I can't follow why.
>
> I am using Visual Studio 2005 SP1 compiler. Since mine PostgreSQL 8.4
> server uses msvcr71.dll, not 80, maybe it's compiler incompatibility
> of some kind?

did you remember to set up the V1 calling convention macro?

merlin

--
Sent via pgsql-general mailing list (pgsql-general(at)postgresql(dot)org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Responses

Browse pgsql-general by date

  From Date Subject
Next Message iihero 2012-04-05 00:07:25 Re: Function with variables/insert/for loop problems
Previous Message Scott Chapman 2012-04-04 22:41:25 EnterpriseDB install of Postgres on Ubuntu 10.04 library path issues - no version information available (required by /lib/libblkid.so.1)