Обсуждение:

Поиск
Список
Период
Сортировка

От
Vincas Dargis
Дата:
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.

Here is one modified example from documentation:

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?

Thanks.

Re:

От
Tom Lane
Дата:
Vincas Dargis <vindrg@gmail.com> writes:
> I am experimenting with user defined functions in C, though I have
> problem with stability.

The only obvious problem in what you posted is

>        command = "SELECT 1";
> ...
>        pfree(command);

pfree'ing a constant is pretty much guaranteed to crash.
I am guessing the reason you don't see "5" printed is that
the if() fails, though it's not obvious why.

More generally, instead of putting an elog every two lines,
I'd suggest expending the effort to learn to use a debugger.
Having something that actually traps at the point of a crash
is a lot more useful than trying to triangulate on the problem
between inserted prints.

            regards, tom lane