Thread: Trigger function returning null
In backend/commands/trigger.c the following can be found: /* * Trigger protocol allows function to return a null pointer, * but NOT to set the isnull result flag. */ if (fcinfo.isnull) ereport(ERROR, Why? Regards, Thomas Hallgren
Thomas Hallgren <thhal@mailblocks.com> writes: > In backend/commands/trigger.c the following can be found: > /* > * Trigger protocol allows function to return a null pointer, > * but NOT to set the isnull result flag. > */ > if (fcinfo.isnull) > ereport(ERROR, > Why? Why not? The real answer is "it's historical and I didn't see any need to change it". But one could argue that a function returning NULL doesn't know it's supposed to be a trigger. regards, tom lane
Thomas Hallgren <thhal@mailblocks.com> writes: > Perhaps you should either change this behavior or make a note it in > "Writing Trigger Functions in C"? Okay, I've changed the text thusly: diff -r1.35 trigger.sgml 434,435c434,437 < A trigger function must return either <symbol>NULL</> or a < <structname>HeapTuple</> pointer. Be careful to return either --- > A trigger function must return either a > <structname>HeapTuple</> pointer or a <symbol>NULL</> pointer > (<emphasis>not</> a SQL NULL, that is, do not set isNull true). > Be careful to return either regards, tom lane
Tom Lane wrote: >Why not? > >The real answer is "it's historical and I didn't see any need to >change it". But one could argue that a function returning NULL >doesn't know it's supposed to be a trigger. > > The reason I ask is that this behavior just bit me in PL/Java. Triggers returning null didn't work. I've fixed it at my end by simply forcing the isnull to false for triggers. I just wanted to know if there was some deeper thought behind this that could result in side effects. Perhaps you should either change this behavior or make a note it in "Writing Trigger Functions in C"? Even if the documented example use a local isnull, it's not evident that you have to do that. Regards, Thomas Hallgren