Doc: flesh out fmgr/README's description of context-node usage.
[pgsql.git] / src / backend / utils / fmgr / README
blob49845f67accb72abf93ecbffce35d366a5efc5b1
1 src/backend/utils/fmgr/README
3 Function Manager
4 ================
6 [This file originally explained the transition from the V0 to the V1
7 interface.  Now it just explains some internals and rationale for the V1
8 interface, while the V0 interface has been removed.]
10 The V1 Function-Manager Interface
11 ---------------------------------
13 The core of the design is data structures for representing the result of a
14 function lookup and for representing the parameters passed to a specific
15 function invocation.  (We want to keep function lookup separate from
16 function call, since many parts of the system apply the same function over
17 and over; the lookup overhead should be paid once per query, not once per
18 tuple.)
21 When a function is looked up in pg_proc, the result is represented as
23 typedef struct
25     PGFunction  fn_addr;    /* pointer to function or handler to be called */
26     Oid         fn_oid;     /* OID of function (NOT of handler, if any) */
27     short       fn_nargs;   /* number of input args (0..FUNC_MAX_ARGS) */
28     bool        fn_strict;  /* function is "strict" (NULL in => NULL out) */
29     bool        fn_retset;  /* function returns a set (over multiple calls) */
30     unsigned char fn_stats; /* collect stats if track_functions > this */
31     void       *fn_extra;   /* extra space for use by handler */
32     MemoryContext fn_mcxt;  /* memory context to store fn_extra in */
33     Node       *fn_expr;    /* expression parse tree for call, or NULL */
34 } FmgrInfo;
36 For an ordinary built-in function, fn_addr is just the address of the C
37 routine that implements the function.  Otherwise it is the address of a
38 handler for the class of functions that includes the target function.
39 The handler can use the function OID and perhaps also the fn_extra slot
40 to find the specific code to execute.  (fn_oid = InvalidOid can be used
41 to denote a not-yet-initialized FmgrInfo struct.  fn_extra will always
42 be NULL when an FmgrInfo is first filled by the function lookup code, but
43 a function handler could set it to avoid making repeated lookups of its
44 own when the same FmgrInfo is used repeatedly during a query.)  fn_nargs
45 is the number of arguments expected by the function, fn_strict is its
46 strictness flag, and fn_retset shows whether it returns a set; all of
47 these values come from the function's pg_proc entry.  fn_stats is also
48 set up to control whether or not to track runtime statistics for calling
49 this function.
51 If the function is being called as part of a SQL expression, fn_expr will
52 point to the expression parse tree for the function call; this can be used
53 to extract parse-time knowledge about the actual arguments.  Note that this
54 field really is information about the arguments rather than information
55 about the function, but it's proven to be more convenient to keep it in
56 FmgrInfo than in FunctionCallInfoBaseData where it might more logically go.
59 During a call of a function, the following data structure is created
60 and passed to the function:
62 typedef struct
64     FmgrInfo   *flinfo;         /* ptr to lookup info used for this call */
65     Node       *context;        /* pass info about context of call */
66     Node       *resultinfo;     /* pass or return extra info about result */
67     Oid         fncollation;    /* collation for function to use */
68     bool        isnull;         /* function must set true if result is NULL */
69     short       nargs;          /* # arguments actually passed */
70     NullableDatum args[];       /* Arguments passed to function */
71 } FunctionCallInfoBaseData;
72 typedef FunctionCallInfoBaseData* FunctionCallInfo;
74 flinfo points to the lookup info used to make the call.  Ordinary functions
75 will probably ignore this field, but function class handlers will need it
76 to find out the OID of the specific function being called.
78 context is NULL for an "ordinary" function call, but may point to additional
79 info when the function is called in certain contexts.  (For example, the
80 trigger manager will pass information about the current trigger event here.)
81 Further details appear in "Function Call Contexts" below.
83 resultinfo is NULL when calling any function from which a simple Datum
84 result is expected.  It may point to some subtype of Node if the function
85 returns more than a Datum.  (For example, resultinfo is used when calling a
86 function that returns a set, as discussed below.)  Like the context field,
87 resultinfo is a hook for expansion; fmgr itself doesn't constrain the use
88 of the field.
90 fncollation is the input collation derived by the parser, or InvalidOid
91 when there are no inputs of collatable types or they don't share a common
92 collation.  This is effectively a hidden additional argument, which
93 collation-sensitive functions can use to determine their behavior.
95 nargs and args[] hold the arguments being passed to the function.
96 Notice that all the arguments passed to a function (as well as its result
97 value) will now uniformly be of type Datum.  As discussed below, callers
98 and callees should apply the standard Datum-to-and-from-whatever macros
99 to convert to the actual argument types of a particular function.  The
100 value in args[i].value is unspecified when args[i].isnull is true.
102 It is generally the responsibility of the caller to ensure that the
103 number of arguments passed matches what the callee is expecting; except
104 for callees that take a variable number of arguments, the callee will
105 typically ignore the nargs field and just grab values from args[].
107 The isnull field will be initialized to "false" before the call.  On
108 return from the function, isnull is the null flag for the function result:
109 if it is true the function's result is NULL, regardless of the actual
110 function return value.  Note that simple "strict" functions can ignore
111 both isnull and args[i].isnull, since they won't even get called when there
112 are any TRUE values in args[].isnull.
114 FunctionCallInfo replaces FmgrValues plus a bunch of ad-hoc parameter
115 conventions, global variables (fmgr_pl_finfo and CurrentTriggerData at
116 least), and other uglinesses.
119 Callees, whether they be individual functions or function handlers,
120 shall always have this signature:
122 Datum function (FunctionCallInfo fcinfo);
124 which is represented by the typedef
126 typedef Datum (*PGFunction) (FunctionCallInfo fcinfo);
128 The function is responsible for setting fcinfo->isnull appropriately
129 as well as returning a result represented as a Datum.  Note that since
130 all callees will now have exactly the same signature, and will be called
131 through a function pointer declared with exactly that signature, we
132 should have no portability or optimization problems.
135 Function Coding Conventions
136 ---------------------------
138 Here are the proposed macros and coding conventions:
140 The definition of an fmgr-callable function will always look like
142 Datum
143 function_name(PG_FUNCTION_ARGS)
145         ...
148 "PG_FUNCTION_ARGS" just expands to "FunctionCallInfo fcinfo".  The main
149 reason for using this macro is to make it easy for scripts to spot function
150 definitions.  However, if we ever decide to change the calling convention
151 again, it might come in handy to have this macro in place.
153 A nonstrict function is responsible for checking whether each individual
154 argument is null or not, which it can do with PG_ARGISNULL(n) (which is
155 just "fcinfo->args[n].isnull").  It should avoid trying to fetch the value
156 of any argument that is null.
158 Both strict and nonstrict functions can return NULL, if needed, with
159         PG_RETURN_NULL();
160 which expands to
161         { fcinfo->isnull = true; return (Datum) 0; }
163 Argument values are ordinarily fetched using code like
164         int32   name = PG_GETARG_INT32(number);
166 For float4, float8, and int8, the PG_GETARG macros will hide whether the
167 types are pass-by-value or pass-by-reference.  For example, if float8 is
168 pass-by-reference then PG_GETARG_FLOAT8 expands to
169         (* (float8 *) DatumGetPointer(fcinfo->args[number].value))
170 and would typically be called like this:
171         float8  arg = PG_GETARG_FLOAT8(0);
172 For what are now historical reasons, the float-related typedefs and macros
173 express the type width in bytes (4 or 8), whereas we prefer to label the
174 widths of integer types in bits.
176 Non-null values are returned with a PG_RETURN_XXX macro of the appropriate
177 type.  For example, PG_RETURN_INT32 expands to
178         return Int32GetDatum(x)
179 PG_RETURN_FLOAT4, PG_RETURN_FLOAT8, and PG_RETURN_INT64 hide whether their
180 data types are pass-by-value or pass-by-reference, by doing a palloc if
181 needed.
183 fmgr.h will provide PG_GETARG and PG_RETURN macros for all the basic data
184 types.  Modules or header files that define specialized SQL datatypes
185 (eg, timestamp) should define appropriate macros for those types, so that
186 functions manipulating the types can be coded in the standard style.
188 For non-primitive data types (particularly variable-length types) it won't
189 be very practical to hide the pass-by-reference nature of the data type,
190 so the PG_GETARG and PG_RETURN macros for those types won't do much more
191 than DatumGetPointer/PointerGetDatum plus the appropriate typecast (but see
192 TOAST discussion, below).  Functions returning such types will need to
193 palloc() their result space explicitly.  I recommend naming the GETARG and
194 RETURN macros for such types to end in "_P", as a reminder that they
195 produce or take a pointer.  For example, PG_GETARG_TEXT_P yields "text *".
197 When a function needs to access fcinfo->flinfo or one of the other auxiliary
198 fields of FunctionCallInfo, it should just do it.  I doubt that providing
199 syntactic-sugar macros for these cases is useful.
202 Support for TOAST-Able Data Types
203 ---------------------------------
205 For TOAST-able data types, the PG_GETARG macro will deliver a de-TOASTed
206 data value.  There might be a few cases where the still-toasted value is
207 wanted, but the vast majority of cases want the de-toasted result, so
208 that will be the default.  To get the argument value without causing
209 de-toasting, use PG_GETARG_RAW_VARLENA_P(n).
211 Some functions require a modifiable copy of their input values.  In these
212 cases, it's silly to do an extra copy step if we copied the data anyway
213 to de-TOAST it.  Therefore, each toastable datatype has an additional
214 fetch macro, for example PG_GETARG_TEXT_P_COPY(n), which delivers a
215 guaranteed-fresh copy, combining this with the detoasting step if possible.
217 There is also a PG_FREE_IF_COPY(ptr,n) macro, which pfree's the given
218 pointer if and only if it is different from the original value of the n'th
219 argument.  This can be used to free the de-toasted value of the n'th
220 argument, if it was actually de-toasted.  Currently, doing this is not
221 necessary for the majority of functions because the core backend code
222 releases temporary space periodically, so that memory leaked in function
223 execution isn't a big problem.  However, as of 7.1 memory leaks in
224 functions that are called by index searches will not be cleaned up until
225 end of transaction.  Therefore, functions that are listed in pg_amop or
226 pg_amproc should be careful not to leak detoasted copies, and so these
227 functions do need to use PG_FREE_IF_COPY() for toastable inputs.
229 A function should never try to re-TOAST its result value; it should just
230 deliver an untoasted result that's been palloc'd in the current memory
231 context.  When and if the value is actually stored into a tuple, the
232 tuple toaster will decide whether toasting is needed.
235 Function Call Contexts
236 ----------------------
238 If a caller passes a non-NULL pointer in fcinfo->context, it should point
239 to some subtype of Node; the particular kind of context is indicated by the
240 node type field.  (A callee should always check the node type, via IsA(),
241 before assuming it knows what kind of context is being passed.)  fmgr
242 itself puts no other restrictions on the use of this field.
244 Current uses of this convention include:
246 * Trigger functions are passed an instance of struct TriggerData,
247 containing information about the trigger context.  (The trigger function
248 does not receive any normal arguments.)  See commands/trigger.h for
249 more information and macros that are commonly used by trigger functions.
251 * Aggregate functions (or to be precise, their transition and final
252 functions) are passed an instance of struct AggState, that is the executor
253 state node for the calling Agg plan node; or if they are called as window
254 functions, they receive an instance of struct WindowAggState.  It is
255 recommended that these pointers be used only via AggCheckCallContext()
256 and sibling functions, which are declared in fmgr.h but are documented
257 only with their source code in src/backend/executor/nodeAgg.c.  Typically
258 these context nodes are only of interest when the transition and final
259 functions wish to optimize execution based on knowing that they are being
260 used within an aggregate rather than as standalone SQL functions.
262 * True window functions receive an instance of struct WindowObject.
263 (Like trigger functions, they don't receive any normal arguments.)
264 See windowapi.h for more information.
266 * Procedures are passed an instance of struct CallContext, containing
267 information about the context of the CALL statement, particularly
268 whether it is within an "atomic" execution context.
271 Functions Accepting or Returning Sets
272 -------------------------------------
274 If a function is marked in pg_proc as returning a set, then it is called
275 with fcinfo->resultinfo pointing to a node of type ReturnSetInfo.  A
276 function that desires to return a set should raise an error "called in
277 context that does not accept a set result" if resultinfo is NULL or does
278 not point to a ReturnSetInfo node.
280 There are currently two modes in which a function can return a set result:
281 value-per-call, or materialize.  In value-per-call mode, the function returns
282 one value each time it is called, and finally reports "done" when it has no
283 more values to return.  In materialize mode, the function's output set is
284 instantiated in a Tuplestore object; all the values are returned in one call.
285 Additional modes might be added in future.
287 ReturnSetInfo contains a field "allowedModes" which is set (by the caller)
288 to a bitmask that's the OR of the modes the caller can support.  The actual
289 mode used by the function is returned in another field "returnMode".  For
290 backwards-compatibility reasons, returnMode is initialized to value-per-call
291 and need only be changed if the function wants to use a different mode.
292 The function should ereport() if it cannot use any of the modes the caller is
293 willing to support.
295 Value-per-call mode works like this: ReturnSetInfo contains a field
296 "isDone", which should be set to one of these values:
298     ExprSingleResult             /* expression does not return a set */
299     ExprMultipleResult           /* this result is an element of a set */
300     ExprEndResult                /* there are no more elements in the set */
302 (the caller will initialize it to ExprSingleResult).  If the function simply
303 returns a Datum without touching ReturnSetInfo, then the call is over and a
304 single-item set has been returned.  To return a set, the function must set
305 isDone to ExprMultipleResult for each set element.  After all elements have
306 been returned, the next call should set isDone to ExprEndResult and return a
307 null result.  (Note it is possible to return an empty set by doing this on
308 the first call.)
310 Value-per-call functions MUST NOT assume that they will be run to completion;
311 the executor might simply stop calling them, for example because of a LIMIT.
312 Therefore, it's unsafe to attempt to perform any resource cleanup in the
313 final call.  It's usually not necessary to clean up memory, anyway.  If it's
314 necessary to clean up other types of resources, such as file descriptors,
315 one can register a shutdown callback function in the ExprContext pointed to
316 by the ReturnSetInfo node.  (But note that file descriptors are a limited
317 resource, so it's generally unwise to hold those open across calls; SRFs
318 that need file access are better written to do it in a single call using
319 Materialize mode.)
321 Materialize mode works like this: the function creates a Tuplestore holding
322 the (possibly empty) result set, and returns it.  There are no multiple calls.
323 The function must also return a TupleDesc that indicates the tuple structure.
324 The Tuplestore and TupleDesc should be created in the context
325 econtext->ecxt_per_query_memory (note this will *not* be the context the
326 function is called in).  The function stores pointers to the Tuplestore and
327 TupleDesc into ReturnSetInfo, sets returnMode to indicate materialize mode,
328 and returns null.  isDone is not used and should be left at ExprSingleResult.
330 The Tuplestore must be created with randomAccess = true if
331 SFRM_Materialize_Random is set in allowedModes, but it can (and preferably
332 should) be created with randomAccess = false if not.  Callers that can support
333 both ValuePerCall and Materialize mode will set SFRM_Materialize_Preferred,
334 or not, depending on which mode they prefer.
336 If available, the expected tuple descriptor is passed in ReturnSetInfo;
337 in other contexts the expectedDesc field will be NULL.  The function need
338 not pay attention to expectedDesc, but it may be useful in special cases.
340 InitMaterializedSRF() is a helper function able to setup the function's
341 ReturnSetInfo for a single call, filling in the Tuplestore and the
342 TupleDesc with the proper configuration for Materialize mode.
344 There is no support for functions accepting sets; instead, the function will
345 be called multiple times, once for each element of the input set.
348 Notes About Function Handlers
349 -----------------------------
351 Handlers for classes of functions should find life much easier and
352 cleaner in this design.  The OID of the called function is directly
353 reachable from the passed parameters; we don't need the global variable
354 fmgr_pl_finfo anymore.  Also, by modifying fcinfo->flinfo->fn_extra,
355 the handler can cache lookup info to avoid repeat lookups when the same
356 function is invoked many times.  (fn_extra can only be used as a hint,
357 since callers are not required to re-use an FmgrInfo struct.
358 But in performance-critical paths they normally will do so.)
360 If the handler wants to allocate memory to hold fn_extra data, it should
361 NOT do so in CurrentMemoryContext, since the current context may well be
362 much shorter-lived than the context where the FmgrInfo is.  Instead,
363 allocate the memory in context flinfo->fn_mcxt, or in a long-lived cache
364 context.  fn_mcxt normally points at the context that was
365 CurrentMemoryContext at the time the FmgrInfo structure was created;
366 in any case it is required to be a context at least as long-lived as the
367 FmgrInfo itself.