Re: Internal function call from C-language function
От | Zoltan Boszormenyi |
---|---|
Тема | Re: Internal function call from C-language function |
Дата | |
Msg-id | 45783E1B.40003@dunaweb.hu обсуждение исходный текст |
Ответ на | Re: Internal function call from C-language function (Martijn van Oosterhout <kleptog@svana.org>) |
Ответы |
Re: Internal function call from C-language function
|
Список | 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
В списке pgsql-general по дате отправления: