Re: Internal function call from C-language function

From: Zoltan Boszormenyi <zboszor(at)dunaweb(dot)hu>
To: Martijn van Oosterhout <kleptog(at)svana(dot)org>, pgsql-general(at)postgresql(dot)org
Subject: Re: Internal function call from C-language function
Date: 2006-12-07 16:15:23
Message-ID: 45783E1B.40003@dunaweb.hu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,

Martijn van Oosterhout írta:
> On Thu, Dec 07, 2006 at 01:40:22PM +0100, Zoltan Boszormenyi wrote:
>
>> text_in() doesn't exists, it's textin() but I have to call it through
>> DirectFunctionCall1(), like this:
>>
>> yeardatum = DirectFunctionCall1(textin, CStringGetDatum("year"));
>>
>> However, the session crashes on the subsequent
>>
>> returndatum = DirectFunctionCall2(timestamp_part, yeardatum, timest);
>>
>
> It would be a good idea to actually find out where it crashes, that
> would help you work out what the actual problem is. Just looking at the
> code you posted, I only see this other bit that looks a bit suspect:
>
> Datum timest;
> bool isnull;
>
> t = PG_GETARG_HEAPTUPLEHEADER(0);
> timest = DatumGetTimestamp(GetAttributeByName(t, "ts_today", &isnull));
>
> You're calling DatumGetTimestamp() which would return a timestamp
> (probably some structure) but you're storing it in a Datum. Just take
> the result of GetAttributeByName directly.
>

Thanks, that worked for me.

I have just one more question:
How can I get an Oid out of a Datum, i.e.
how do I know what type I get in a given Datum?
DatumGetObjectId() seems to give me an Oid that
was specifically stored as a Datum.

The function I am working on is made for an
INSERT RULE, something like this:

CREATE OR REPLACE FUNCTION
myfunc( row1 table1 ) RETURNS BOOL VOLATILE
LANGUAGE C AS 'myfunc.so', 'myfunc';

CREATE RULE rule_table1_insert
AS ON INSERT TO table1
DO INSTEAD (SELECT myfunc( new ) );

So I get the to-be-inserted row in my function.
In the function, depending on the passed in values
I need to insert some other table. To do it,
I need to use SPI_prepare() which needs the list of Oids.

> Get at least a backtrace next time it crashes...
>

And how exactly can I do that? psql only reports that
the backend crashed and unable to reset connection.
At that time the backend session is already gone, isn't it?

> Have a nice day,
>

Thanks, to you, too. You helped a lot.

Best regards,
Zoltán

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message David Goodenough 2006-12-07 16:19:13 Performance figures from DbMail list
Previous Message Tom Lane 2006-12-07 15:59:19 Re: Cast boolean to text