Thread: New/old style trigger API
The docs seem a little sketchy but the source implies that there is a difference between new and old style triggers. I can't seem to find this difference. I tried following the only current example I could find but I get a core dump. Here is the backtrace. #0 0x0 in ?? () #1 0x8136052 in fmgr_oldstyle (fcinfo=0xbfbfd134) at fmgr.c:433 #2 0x80b6b2d in ExecCallTriggerFunc (trigger=0x82ce030, trigdata=0xbfbfd1c8, per_tuple_context=0x827acf0) at trigger.c:865 #3 0x80b6e15 in ExecBRUpdateTriggers (estate=0x82fbf50, tupleid=0xbfbfd264, newtuple=0x83094a8) at trigger.c:1008 #4 0x80bcf3a in ExecReplace (slot=0x8308018, tupleid=0xbfbfd264, estate=0x82fbf50) at execMain.c:1416 #5 0x80bcc82 in ExecutePlan (estate=0x82fbf50, plan=0x82fbec8, operation=CMD_UPDATE, numberTuples=0, direction=ForwardScanDirection, destfunc=0x83092f0) at execMain.c:1127 #6 0x80bc27b in ExecutorRun (queryDesc=0x8307cc0, estate=0x82fbf50, feature=3, count=0) at execMain.c:233 #7 0x80ff29b in ProcessQuery (parsetree=0x82f6e20, plan=0x82fbec8, dest=Remote) at pquery.c:277 #8 0x80fddd3 in pg_exec_query_string ( query_string=0x82f6030 "UPDATE bgroup SET actypid = 1,ddate = NULL,edate = '2001-07-23',mail= '',ftp = '',dns = 'f',bname = 'jpsantos',bgdesc = '',isp = 'VEX',pdate = '2001-04-23',pmon = 5,bgroup_active= 't',sdate = '1999-"..., dest=Remote, parse_context=0x827a720) at postgres.c:808 #9 0x80fedd1 in PostgresMain (argc=4, argv=0xbfbfd4c8, real_argc=9, real_argv=0xbfbfdc54, username=0x826325d "darcy")at postgres.c:1905 #10 0x80ea2ad in DoBackend (port=0x8263000) at postmaster.c:2114 #11 0x80e9eb2 in BackendStartup (port=0x8263000) at postmaster.c:1897 #12 0x80e91aa in ServerLoop () at postmaster.c:995 #13 0x80e8b7c in PostmasterMain (argc=9, argv=0xbfbfdc54) at postmaster.c:685 #14 0x80caff4 in main (argc=9, argv=0xbfbfdc54) at main.c:175 #15 0x806bc81 in ___start () It gets to fmgr_oldstyle() and then dies from a jump to a null pointer. Can someone please tell me how to make my function a newstyle one. I will update the docs once I have it working. -- D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves http://www.druid.net/darcy/ | and a sheep voting on +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.
darcy@druid.net (D'Arcy J.M. Cain) writes: > It gets to fmgr_oldstyle() and then dies from a jump to a null pointer. > Can someone please tell me how to make my function a newstyle one. Perhaps you forgot the PG_FUNCTION_INFO_V1 declaration? See http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/trigger-examples.html regards, tom lane
Thus spake Tom Lane > darcy@druid.net (D'Arcy J.M. Cain) writes: > > It gets to fmgr_oldstyle() and then dies from a jump to a null pointer. > > Can someone please tell me how to make my function a newstyle one. > > Perhaps you forgot the PG_FUNCTION_INFO_V1 declaration? See > http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/trigger-examples.html Yah, I was looking at chapter 22 on SPI programming. I assume that the same should apply there. Shall I go ahead and add it to the docs in that chapter as well? I wonder if there is a relation to another problem I am having. On AIX I can compile my chkpass function (in contrib which I just updated) OK but when I use it I get a similar core dump there that I don't see on NetBSD. Does it require the same interface? Shall I update those pages as well? BTW, here is the link command I needed to get as far as I did. ld -G -o $@ $< -bexpall -bnoentry -lc -- D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves http://www.druid.net/darcy/ | and a sheep voting on +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.
darcy@druid.net (D'Arcy J.M. Cain) writes: > Yah, I was looking at chapter 22 on SPI programming. I assume that the > same should apply there. Shall I go ahead and add it to the docs in that > chapter as well? Uh ... where? I see nothing related to trigger programming in chapter 22. There's an example of an old-style function at http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/spi-examples.html but it's not a trigger. regards, tom lane
Thus spake Tom Lane > darcy@druid.net (D'Arcy J.M. Cain) writes: > > Yah, I was looking at chapter 22 on SPI programming. I assume that the > > same should apply there. Shall I go ahead and add it to the docs in that > > chapter as well? > > Uh ... where? I see nothing related to trigger programming in chapter 22. > There's an example of an old-style function at > http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/spi-examples.html > but it's not a trigger. Ah. So PG_FUNCTION_INFO_V1() is strictly for triggers then. The name suggested it was a little more global than that. -- D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves http://www.druid.net/darcy/ | and a sheep voting on +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.
darcy@druid.net (D'Arcy J.M. Cain) writes: >> There's an example of an old-style function at >> http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/spi-examples.html >> but it's not a trigger. > Ah. So PG_FUNCTION_INFO_V1() is strictly for triggers then. No, it's for new-style functions. See http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/xfunc-c.html regards, tom lane
Thus spake Tom Lane > darcy@druid.net (D'Arcy J.M. Cain) writes: > >> There's an example of an old-style function at > >> http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/spi-examples.html > >> but it's not a trigger. > > > Ah. So PG_FUNCTION_INFO_V1() is strictly for triggers then. > > No, it's for new-style functions. See > http://www.ca.postgresql.org/users-lounge/docs/7.1/postgres/xfunc-c.html I'm so confused. :-) OK, so all functions can be upgraded to version 1 calling sequence, not just ones used for triggers. I think I have it but the docs could still use some work. If someone wants to check out the latest version of my chkpass function in contrib and let me know if I seem to have the right idea now then I will go ahead and try to improve the docs. -- D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves http://www.druid.net/darcy/ | and a sheep voting on +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.
darcy@druid.net (D'Arcy J.M. Cain) writes: > OK, so all functions can be upgraded to version 1 calling sequence, not > just ones used for triggers. Now you're getting there. Actually triggers *must* be upgraded to the new calling sequence, because we don't support old-style triggers anymore. But for other functions it's optional. regards, tom lane
Thus spake Tom Lane > darcy@druid.net (D'Arcy J.M. Cain) writes: > > OK, so all functions can be upgraded to version 1 calling sequence, not > > just ones used for triggers. > > Now you're getting there. Actually triggers *must* be upgraded to the > new calling sequence, because we don't support old-style triggers > anymore. But for other functions it's optional. OK, I am going to try to find time to update the other pages. In particular I will update the examples and add the list of macros. -- D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves http://www.druid.net/darcy/ | and a sheep voting on +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.