Good day-
I maintain the PL/Haskell language handler. Typically, the handler compiles function code and stores the compiled data in the fn_extra field of FmgrInfo. The fn_extra field persists from one call to the next within a query meaning the expensive compilation only needs to happen once per query.
However, when calling a set-returning function multiple times in a query, there appears to be no way to carry data from one set to another. This is because the fn_extra field stores the FuncCallContext structure. While the user_fctx field of the FuncCallContext structure persists from one call to the next, it is NULLed out at the end of a set.
For example, if there is a table, t, with a column, i, and a set-returning function, func, the following query is very inefficient:
SELECT *
FROM t, func(i)
This is because the function is recompiled for each row of t.
Is there a way around this? Ideally, there would be a field that persists from one set to another within a query.
Thank you for any help you can provide.
-Ed