PostgreSQL 8.4 crash on user defined C language function

Started by Vincas Dargisabout 14 years ago6 messagesgeneral
Jump to latest
#1Vincas Dargis
vindrg@gmail.com

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?

#2Merlin Moncure
mmoncure@gmail.com
In reply to: Vincas Dargis (#1)
Re: PostgreSQL 8.4 crash on user defined C language function

On Wed, Apr 4, 2012 at 10:46 AM, Vincas Dargis <vindrg@gmail.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

#3Vincas Dargis
vindrg@gmail.com
In reply to: Merlin Moncure (#2)
Re: PostgreSQL 8.4 crash on user defined C language function

2012.04.04 20:37, Merlin Moncure rašė:

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

merlin

Yes, I did remember. This kind of inconsistency bugs me, why SPI_*
works, pmalloc not?

Vincas.

#4Xiong He
iihero@qq.com
In reply to: Vincas Dargis (#3)
Re: PostgreSQL 8.4 crash on user defined C language function

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@gmail.com>;
Date: Thu, Apr 5, 2012 01:37 AM
To: "Vincas Dargis"<vindrg@gmail.com>;
Cc: "pgsql-general"<pgsql-general@postgresql.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@gmail.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@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#5Vincas Dargis
vindrg@gmail.com
In reply to: Xiong He (#4)
Re: PostgreSQL 8.4 crash on user defined C language function

Yeah, original example took command from arguments, I simply forgot to
revert changes to original.

Though it's not the problem, it is something with calling other
functions under some kind environment I got. Your test was successful
for "obviously it should work" reason, but it's something wrong for me
that server crashes before executing "INFO 5"...

2012.04.05 02:38, iihero rašė:

Show quoted text

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.com
http://www.sql6.com
~~~~~~~~~~~~~~~~~~~~~~~~~

#6Xiong He
iihero@qq.com
In reply to: Vincas Dargis (#5)
Re: PostgreSQL 8.4 crash on user defined C language function

If possible, could you use a compiled version of PG8.4, and debug your code via attaching the server process. Thus you can get more details why it crashed in your codeline.

------------------ Original ------------------
From: "Vincas Dargis"<vindrg@gmail.com>;
Date: Thu, Apr 5, 2012 02:09 PM
To: "iihero"<iihero@qq.com>;
Cc: "Merlin Moncure"<mmoncure@gmail.com>; "pgsql-general"<pgsql-general@postgresql.org>;
Subject: Re: [GENERAL] PostgreSQL 8.4 crash on user defined C language function

Yeah, original example took command from arguments, I simply forgot to
revert changes to original.

Though it's not the problem, it is something with calling other
functions under some kind environment I got. Your test was successful
for "obviously it should work" reason, but it's something wrong for me
that server crashes before executing "INFO 5"...

2012.04.05 02:38, iihero ra??:

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.com
http://www.sql6.com
~~~~~~~~~~~~~~~~~~~~~~~~~

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