Hi hackers, The way the core code allocates FmgrInfo structures has a pleasing property (at least in the parts of the code I have read and the cases I've tested) that the docs don't seem to emphasize.
To wit, given a query like SELECT hello(n), hello(x) FROM (VALUES (1::int4, 1.0::float4), (2, 2.0 ), (3, 3.0 )) AS t(n,x); the core code allocates one FmgrInfo for each of the two uses. If the PL handler has a useful way to specialize the polymorphic-typed function to int4 in the one case and float4 in the other, each can be stashed in its respective flinfo->fn_extra and the specialized versions used as expected for the duration of the query. Likewise, the trigger manager prepares for a query by allocating one FmgrInfo for each distinct trigger involved, so if there is a single trigger function referenced by multiple triggers, a version specialized to each trigger can be stashed on its respective flinfo and used for all firings of that trigger the query may generate. This lends itself to a nice staged-programming view of a PL handler's job: prepare: RegProcedure -> Template (cache by regproc) specialize: (Template, call site) -> Routine (cache on fn_extra) apply: (Routine, fcinfo) -> result (where I consider some members both of flinfo, such as fn_expr, and of fcinfo, such as nargs, context, resultinfo, to be logically properties of a notional "call site"). I wonder, though, if there might be code in the wild, or even in corners of the core I haven't looked in, where FmgrInfo structs aren't being used that way, and could get reused for successive calls of one routine but with, say, different nargs or argument types. That would seem odd but I don't see that the documentation ever came right out and said not to. If that seems like a non-imaginary risk, I wonder if FmgrInfo could sprout something like a safe-to-specialize bit, initialized to false for old code that doesn't know about it, but set true in places where FmgrInfo structs are definitely being managed as described above? I suspect that would result in the vast majority of FmgrInfo structs ever really encountered having the bit set. Regards, -Chap A work-in-progress PL dispatcher based on the above can be seen at: https://tada.github.io/pljava/preview1.7/pljava-api/apidocs/org.postgresql.pljava/org/postgresql/pljava/PLJavaBasedLanguage.html