Thread: LOAD not updating object in session
Hiya I have written a trigger in C, and during the course of this I discovered that the LOAD command in psql wasn't updating the object when I made a change and recompiled. As requested by Tom, here is an example of this behaviour. I have just added this as a function as it performs the same. here is my code: --START-- #include "postgres.h" #include "executor/spi.h" /* this is what you need to work with SPI */ #include "commands/trigger.h" /* ... and triggers */ #include <stdio.h> int main (int argc, char **argv) { printf ("This is a trigger for PostgreSQL, not a standard executable\n\n"); return 0; } extern Datum trigf(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(trigf); Datum testtrig(PG_FUNCTION_ARGS) { TriggerData *trigdata = (TriggerData *) fcinfo->context; elog(INFO,"This is a test trigger"); //elog(INFO,"Uncomment me and recompile for new message"); return PointerGetDatum(NULL); } --END-- I have compiled and linked this with the lines: gcc -g -c test_trigger.c -I/usr/include/pgsql/server gcc -o testtrigger test_trigger.o --share without errors. to create the function I used: create or replace function testtrig() RETURNS trigger AS '/home/graeme/dev/radius-centraldb/testtrigger' LANGUAGE C; Now when I "select testtrig();" I get : INFO: This is a test trigger ERROR: Cannot display a value of type TRIGGER If I uncomment out the 2nd elog line and recompile and then use LOAD '/home/graeme/dev/radius-centraldb/testtrigger'; Again running "select testtrig()" I get : INFO: This is a test trigger ERROR: Cannot display a value of type TRIGGER So the new Object hasn't been loaded (I know about the Error on the end, this is just a quick test). If I quit out of psql and reconned, and then run "select testtrig()" I now get: INFO: This is a test trigger INFO: Uncomment me and recompile for new message ERROR: Cannot display a value of type TRIGGER So as you can see it doesn't appear to be refreshing the C object when I use LOAD. I also noticed during writing the C for this example that if I created the function with the wrong name I got an error saying that that function could not be found in the object as is expected, if I then renamed the function and recompiled the object, the create would give the same error (obviously using the already linked object). Load didn't fix this either. So am I doing something wrong? or have I found something? Thanks for your help/time -- ----- Graeme Hinchliffe (BSc) Core Internet Systems Designer Zen Internet (http://www.zen.co.uk/) Direct: 0845 058 9074 Main : 0845 058 9000 Fax : 0845 058 9005
Graeme Hinchliffe <graeme.hinchliffe@zeninternet.co.uk> writes: > I have written a trigger in C, and during the course of this I > discovered that the LOAD command in psql wasn't updating the object when > I made a change and recompiled. > As requested by Tom, here is an example of this behaviour. I have just > added this as a function as it performs the same. Thanks for the test case. Unfortunately it works fine here: regression=# select testtrig(); INFO: This is a test trigger ERROR: cannot display a value of type trigger regression=# LOAD '/home/tgl/testtrigger'; LOAD regression=# select testtrig(); INFO: This is a test trigger INFO: Uncomment me and recompile for new message ERROR: cannot display a value of type trigger regression=# This is on RHL 8.0 on i386. What platform are you using exactly? BTW, the file as given dumps core for me, because you have > extern Datum trigf(PG_FUNCTION_ARGS); > PG_FUNCTION_INFO_V1(trigf); > Datum testtrig(PG_FUNCTION_ARGS) and the V1 macro needs to reference testtrig not trigf. However I do not think this is related to the LOAD problem. regards, tom lane
On Tue, 2004-08-17 at 17:27, Tom Lane wrote: > Graeme Hinchliffe <graeme.hinchliffe@zeninternet.co.uk> writes: > > I have written a trigger in C, and during the course of this I > > discovered that the LOAD command in psql wasn't updating the object when > > I made a change and recompiled. > > As requested by Tom, here is an example of this behaviour. I have just > > added this as a function as it performs the same. > > Thanks for the test case. Unfortunately it works fine here: damn :) (but in a good way) > This is on RHL 8.0 on i386. What platform are you using exactly? This is RH 9.0 on i386 from RPM's > BTW, the file as given dumps core for me, because you have > > > extern Datum trigf(PG_FUNCTION_ARGS); > > PG_FUNCTION_INFO_V1(trigf); > > Datum testtrig(PG_FUNCTION_ARGS) oops! In the original I did have my function named as trigf, but I changed that so as not to conflict with the other function in my db > and the V1 macro needs to reference testtrig not trigf. However I do > not think this is related to the LOAD problem. It didn't dump core for me, it was quite happy :) I would guess because I have a function called trigf loaded in memory? Do you have any ideas what I am doing or what I have set wrong? -- ----- Graeme Hinchliffe (BSc) Core Internet Systems Designer Zen Internet (http://www.zen.co.uk/) Direct: 0845 058 9074 Main : 0845 058 9000 Fax : 0845 058 9005
Graeme Hinchliffe <graeme.hinchliffe@zeninternet.co.uk> writes: > It didn't dump core for me, it was quite happy :) I would guess because > I have a function called trigf loaded in memory? No; the lack of a V1 macro referencing testtrig would definitely cause the backend to call testtrig using V0 conventions, in other words fcinfo will not be passed. It could be that the indirection through a garbage value of fcinfo happens to land on valid memory in your compilation. (I did not get a core dump either when compiling on HPUX, but I have not bothered to chase down why not.) I don't know of any reason for RHL 9 to work differently from RHL 8 in this regard. Can anyone else duplicate the problem? BTW, given the testtrig/trigf confusion ... is it possible you were LOADing the wrong file? regards, tom lane