1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * fmgr.h |
4 | * Definitions for the Postgres function manager and function-call |
5 | * interface. |
6 | * |
7 | * This file must be included by all Postgres modules that either define |
8 | * or call fmgr-callable functions. |
9 | * |
10 | * |
11 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
12 | * Portions Copyright (c) 1994, Regents of the University of California |
13 | * |
14 | * src/include/fmgr.h |
15 | * |
16 | *------------------------------------------------------------------------- |
17 | */ |
18 | #ifndef FMGR_H |
19 | #define FMGR_H |
20 | |
21 | /* We don't want to include primnodes.h here, so make some stub references */ |
22 | typedef struct Node *fmNodePtr; |
23 | typedef struct Aggref *fmAggrefPtr; |
24 | |
25 | /* Likewise, avoid including execnodes.h here */ |
26 | typedef void (*fmExprContextCallbackFunction) (Datum arg); |
27 | |
28 | /* Likewise, avoid including stringinfo.h here */ |
29 | typedef struct StringInfoData *fmStringInfo; |
30 | |
31 | |
32 | /* |
33 | * All functions that can be called directly by fmgr must have this signature. |
34 | * (Other functions can be called by using a handler that does have this |
35 | * signature.) |
36 | */ |
37 | |
38 | typedef struct FunctionCallInfoBaseData *FunctionCallInfo; |
39 | |
40 | typedef Datum (*PGFunction) (FunctionCallInfo fcinfo); |
41 | |
42 | /* |
43 | * This struct holds the system-catalog information that must be looked up |
44 | * before a function can be called through fmgr. If the same function is |
45 | * to be called multiple times, the lookup need be done only once and the |
46 | * info struct saved for re-use. |
47 | * |
48 | * Note that fn_expr really is parse-time-determined information about the |
49 | * arguments, rather than about the function itself. But it's convenient to |
50 | * store it here rather than in FunctionCallInfoBaseData, where it might more |
51 | * logically belong. |
52 | * |
53 | * fn_extra is available for use by the called function; all other fields |
54 | * should be treated as read-only after the struct is created. |
55 | */ |
56 | typedef struct FmgrInfo |
57 | { |
58 | PGFunction fn_addr; /* pointer to function or handler to be called */ |
59 | Oid fn_oid; /* OID of function (NOT of handler, if any) */ |
60 | short fn_nargs; /* number of input args (0..FUNC_MAX_ARGS) */ |
61 | bool fn_strict; /* function is "strict" (NULL in => NULL out) */ |
62 | bool fn_retset; /* function returns a set */ |
63 | unsigned char fn_stats; /* collect stats if track_functions > this */ |
64 | void *; /* extra space for use by handler */ |
65 | MemoryContext fn_mcxt; /* memory context to store fn_extra in */ |
66 | fmNodePtr fn_expr; /* expression parse tree for call, or NULL */ |
67 | } FmgrInfo; |
68 | |
69 | /* |
70 | * This struct is the data actually passed to an fmgr-called function. |
71 | * |
72 | * The called function is expected to set isnull, and possibly resultinfo or |
73 | * fields in whatever resultinfo points to. It should not change any other |
74 | * fields. (In particular, scribbling on the argument arrays is a bad idea, |
75 | * since some callers assume they can re-call with the same arguments.) |
76 | * |
77 | * Note that enough space for arguments needs to be provided, either by using |
78 | * SizeForFunctionCallInfo() in dynamic allocations, or by using |
79 | * LOCAL_FCINFO() for on-stack allocations. |
80 | * |
81 | * This struct is named *BaseData, rather than *Data, to break pre v12 code |
82 | * that allocated FunctionCallInfoData itself, as it'd often silently break |
83 | * old code due to no space for arguments being provided. |
84 | */ |
85 | typedef struct FunctionCallInfoBaseData |
86 | { |
87 | FmgrInfo *flinfo; /* ptr to lookup info used for this call */ |
88 | fmNodePtr context; /* pass info about context of call */ |
89 | fmNodePtr resultinfo; /* pass or return extra info about result */ |
90 | Oid fncollation; /* collation for function to use */ |
91 | #define FIELDNO_FUNCTIONCALLINFODATA_ISNULL 4 |
92 | bool isnull; /* function must set true if result is NULL */ |
93 | short nargs; /* # arguments actually passed */ |
94 | #define FIELDNO_FUNCTIONCALLINFODATA_ARGS 6 |
95 | NullableDatum args[FLEXIBLE_ARRAY_MEMBER]; |
96 | } FunctionCallInfoBaseData; |
97 | |
98 | /* |
99 | * Space needed for a FunctionCallInfoBaseData struct with sufficient space |
100 | * for `nargs` arguments. |
101 | */ |
102 | #define SizeForFunctionCallInfo(nargs) \ |
103 | (offsetof(FunctionCallInfoBaseData, args) + \ |
104 | sizeof(NullableDatum) * (nargs)) |
105 | |
106 | /* |
107 | * This macro ensures that `name` points to a stack-allocated |
108 | * FunctionCallInfoBaseData struct with sufficient space for `nargs` arguments. |
109 | */ |
110 | #define LOCAL_FCINFO(name, nargs) \ |
111 | /* use union with FunctionCallInfoBaseData to guarantee alignment */ \ |
112 | union \ |
113 | { \ |
114 | FunctionCallInfoBaseData fcinfo; \ |
115 | /* ensure enough space for nargs args is available */ \ |
116 | char fcinfo_data[SizeForFunctionCallInfo(nargs)]; \ |
117 | } name##data; \ |
118 | FunctionCallInfo name = &name##data.fcinfo |
119 | |
120 | /* |
121 | * This routine fills a FmgrInfo struct, given the OID |
122 | * of the function to be called. |
123 | */ |
124 | extern void fmgr_info(Oid functionId, FmgrInfo *finfo); |
125 | |
126 | /* |
127 | * Same, when the FmgrInfo struct is in a memory context longer-lived than |
128 | * CurrentMemoryContext. The specified context will be set as fn_mcxt |
129 | * and used to hold all subsidiary data of finfo. |
130 | */ |
131 | extern void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, |
132 | MemoryContext mcxt); |
133 | |
134 | /* Convenience macro for setting the fn_expr field */ |
135 | #define fmgr_info_set_expr(expr, finfo) \ |
136 | ((finfo)->fn_expr = (expr)) |
137 | |
138 | /* |
139 | * Copy an FmgrInfo struct |
140 | */ |
141 | extern void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, |
142 | MemoryContext destcxt); |
143 | |
144 | extern void fmgr_symbol(Oid functionId, char **mod, char **fn); |
145 | |
146 | /* |
147 | * This macro initializes all the fields of a FunctionCallInfoBaseData except |
148 | * for the args[] array. |
149 | */ |
150 | #define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo) \ |
151 | do { \ |
152 | (Fcinfo).flinfo = (Flinfo); \ |
153 | (Fcinfo).context = (Context); \ |
154 | (Fcinfo).resultinfo = (Resultinfo); \ |
155 | (Fcinfo).fncollation = (Collation); \ |
156 | (Fcinfo).isnull = false; \ |
157 | (Fcinfo).nargs = (Nargs); \ |
158 | } while (0) |
159 | |
160 | /* |
161 | * This macro invokes a function given a filled-in FunctionCallInfoBaseData |
162 | * struct. The macro result is the returned Datum --- but note that |
163 | * caller must still check fcinfo->isnull! Also, if function is strict, |
164 | * it is caller's responsibility to verify that no null arguments are present |
165 | * before calling. |
166 | */ |
167 | #define FunctionCallInvoke(fcinfo) ((* (fcinfo)->flinfo->fn_addr) (fcinfo)) |
168 | |
169 | |
170 | /*------------------------------------------------------------------------- |
171 | * Support macros to ease writing fmgr-compatible functions |
172 | * |
173 | * A C-coded fmgr-compatible function should be declared as |
174 | * |
175 | * Datum |
176 | * function_name(PG_FUNCTION_ARGS) |
177 | * { |
178 | * ... |
179 | * } |
180 | * |
181 | * It should access its arguments using appropriate PG_GETARG_xxx macros |
182 | * and should return its result using PG_RETURN_xxx. |
183 | * |
184 | *------------------------------------------------------------------------- |
185 | */ |
186 | |
187 | /* Standard parameter list for fmgr-compatible functions */ |
188 | #define PG_FUNCTION_ARGS FunctionCallInfo fcinfo |
189 | |
190 | /* |
191 | * Get collation function should use. |
192 | */ |
193 | #define PG_GET_COLLATION() (fcinfo->fncollation) |
194 | |
195 | /* |
196 | * Get number of arguments passed to function. |
197 | */ |
198 | #define PG_NARGS() (fcinfo->nargs) |
199 | |
200 | /* |
201 | * If function is not marked "proisstrict" in pg_proc, it must check for |
202 | * null arguments using this macro. Do not try to GETARG a null argument! |
203 | */ |
204 | #define PG_ARGISNULL(n) (fcinfo->args[n].isnull) |
205 | |
206 | /* |
207 | * Support for fetching detoasted copies of toastable datatypes (all of |
208 | * which are varlena types). pg_detoast_datum() gives you either the input |
209 | * datum (if not toasted) or a detoasted copy allocated with palloc(). |
210 | * pg_detoast_datum_copy() always gives you a palloc'd copy --- use it |
211 | * if you need a modifiable copy of the input. Caller is expected to have |
212 | * checked for null inputs first, if necessary. |
213 | * |
214 | * pg_detoast_datum_packed() will return packed (1-byte header) datums |
215 | * unmodified. It will still expand an externally toasted or compressed datum. |
216 | * The resulting datum can be accessed using VARSIZE_ANY() and VARDATA_ANY() |
217 | * (beware of multiple evaluations in those macros!) |
218 | * |
219 | * In consumers oblivious to data alignment, call PG_DETOAST_DATUM_PACKED(), |
220 | * VARDATA_ANY(), VARSIZE_ANY() and VARSIZE_ANY_EXHDR(). Elsewhere, call |
221 | * PG_DETOAST_DATUM(), VARDATA() and VARSIZE(). Directly fetching an int16, |
222 | * int32 or wider field in the struct representing the datum layout requires |
223 | * aligned data. memcpy() is alignment-oblivious, as are most operations on |
224 | * datatypes, such as text, whose layout struct contains only char fields. |
225 | * |
226 | * Note: it'd be nice if these could be macros, but I see no way to do that |
227 | * without evaluating the arguments multiple times, which is NOT acceptable. |
228 | */ |
229 | extern struct varlena *pg_detoast_datum(struct varlena *datum); |
230 | extern struct varlena *pg_detoast_datum_copy(struct varlena *datum); |
231 | extern struct varlena *pg_detoast_datum_slice(struct varlena *datum, |
232 | int32 first, int32 count); |
233 | extern struct varlena *pg_detoast_datum_packed(struct varlena *datum); |
234 | |
235 | #define PG_DETOAST_DATUM(datum) \ |
236 | pg_detoast_datum((struct varlena *) DatumGetPointer(datum)) |
237 | #define PG_DETOAST_DATUM_COPY(datum) \ |
238 | pg_detoast_datum_copy((struct varlena *) DatumGetPointer(datum)) |
239 | #define PG_DETOAST_DATUM_SLICE(datum,f,c) \ |
240 | pg_detoast_datum_slice((struct varlena *) DatumGetPointer(datum), \ |
241 | (int32) (f), (int32) (c)) |
242 | /* WARNING -- unaligned pointer */ |
243 | #define PG_DETOAST_DATUM_PACKED(datum) \ |
244 | pg_detoast_datum_packed((struct varlena *) DatumGetPointer(datum)) |
245 | |
246 | /* |
247 | * Support for cleaning up detoasted copies of inputs. This must only |
248 | * be used for pass-by-ref datatypes, and normally would only be used |
249 | * for toastable types. If the given pointer is different from the |
250 | * original argument, assume it's a palloc'd detoasted copy, and pfree it. |
251 | * NOTE: most functions on toastable types do not have to worry about this, |
252 | * but we currently require that support functions for indexes not leak |
253 | * memory. |
254 | */ |
255 | #define PG_FREE_IF_COPY(ptr,n) \ |
256 | do { \ |
257 | if ((Pointer) (ptr) != PG_GETARG_POINTER(n)) \ |
258 | pfree(ptr); \ |
259 | } while (0) |
260 | |
261 | /* Macros for fetching arguments of standard types */ |
262 | |
263 | #define PG_GETARG_DATUM(n) (fcinfo->args[n].value) |
264 | #define PG_GETARG_INT32(n) DatumGetInt32(PG_GETARG_DATUM(n)) |
265 | #define PG_GETARG_UINT32(n) DatumGetUInt32(PG_GETARG_DATUM(n)) |
266 | #define PG_GETARG_INT16(n) DatumGetInt16(PG_GETARG_DATUM(n)) |
267 | #define PG_GETARG_UINT16(n) DatumGetUInt16(PG_GETARG_DATUM(n)) |
268 | #define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n)) |
269 | #define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n)) |
270 | #define PG_GETARG_OID(n) DatumGetObjectId(PG_GETARG_DATUM(n)) |
271 | #define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n)) |
272 | #define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n)) |
273 | #define PG_GETARG_NAME(n) DatumGetName(PG_GETARG_DATUM(n)) |
274 | /* these macros hide the pass-by-reference-ness of the datatype: */ |
275 | #define PG_GETARG_FLOAT4(n) DatumGetFloat4(PG_GETARG_DATUM(n)) |
276 | #define PG_GETARG_FLOAT8(n) DatumGetFloat8(PG_GETARG_DATUM(n)) |
277 | #define PG_GETARG_INT64(n) DatumGetInt64(PG_GETARG_DATUM(n)) |
278 | /* use this if you want the raw, possibly-toasted input datum: */ |
279 | #define PG_GETARG_RAW_VARLENA_P(n) ((struct varlena *) PG_GETARG_POINTER(n)) |
280 | /* use this if you want the input datum de-toasted: */ |
281 | #define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n)) |
282 | /* and this if you can handle 1-byte-header datums: */ |
283 | #define PG_GETARG_VARLENA_PP(n) PG_DETOAST_DATUM_PACKED(PG_GETARG_DATUM(n)) |
284 | /* DatumGetFoo macros for varlena types will typically look like this: */ |
285 | #define DatumGetByteaPP(X) ((bytea *) PG_DETOAST_DATUM_PACKED(X)) |
286 | #define DatumGetTextPP(X) ((text *) PG_DETOAST_DATUM_PACKED(X)) |
287 | #define DatumGetBpCharPP(X) ((BpChar *) PG_DETOAST_DATUM_PACKED(X)) |
288 | #define DatumGetVarCharPP(X) ((VarChar *) PG_DETOAST_DATUM_PACKED(X)) |
289 | #define (X) ((HeapTupleHeader) PG_DETOAST_DATUM(X)) |
290 | /* And we also offer variants that return an OK-to-write copy */ |
291 | #define DatumGetByteaPCopy(X) ((bytea *) PG_DETOAST_DATUM_COPY(X)) |
292 | #define DatumGetTextPCopy(X) ((text *) PG_DETOAST_DATUM_COPY(X)) |
293 | #define DatumGetBpCharPCopy(X) ((BpChar *) PG_DETOAST_DATUM_COPY(X)) |
294 | #define DatumGetVarCharPCopy(X) ((VarChar *) PG_DETOAST_DATUM_COPY(X)) |
295 | #define (X) ((HeapTupleHeader) PG_DETOAST_DATUM_COPY(X)) |
296 | /* Variants which return n bytes starting at pos. m */ |
297 | #define DatumGetByteaPSlice(X,m,n) ((bytea *) PG_DETOAST_DATUM_SLICE(X,m,n)) |
298 | #define DatumGetTextPSlice(X,m,n) ((text *) PG_DETOAST_DATUM_SLICE(X,m,n)) |
299 | #define DatumGetBpCharPSlice(X,m,n) ((BpChar *) PG_DETOAST_DATUM_SLICE(X,m,n)) |
300 | #define DatumGetVarCharPSlice(X,m,n) ((VarChar *) PG_DETOAST_DATUM_SLICE(X,m,n)) |
301 | /* GETARG macros for varlena types will typically look like this: */ |
302 | #define PG_GETARG_BYTEA_PP(n) DatumGetByteaPP(PG_GETARG_DATUM(n)) |
303 | #define PG_GETARG_TEXT_PP(n) DatumGetTextPP(PG_GETARG_DATUM(n)) |
304 | #define PG_GETARG_BPCHAR_PP(n) DatumGetBpCharPP(PG_GETARG_DATUM(n)) |
305 | #define PG_GETARG_VARCHAR_PP(n) DatumGetVarCharPP(PG_GETARG_DATUM(n)) |
306 | #define (n) DatumGetHeapTupleHeader(PG_GETARG_DATUM(n)) |
307 | /* And we also offer variants that return an OK-to-write copy */ |
308 | #define PG_GETARG_BYTEA_P_COPY(n) DatumGetByteaPCopy(PG_GETARG_DATUM(n)) |
309 | #define PG_GETARG_TEXT_P_COPY(n) DatumGetTextPCopy(PG_GETARG_DATUM(n)) |
310 | #define PG_GETARG_BPCHAR_P_COPY(n) DatumGetBpCharPCopy(PG_GETARG_DATUM(n)) |
311 | #define PG_GETARG_VARCHAR_P_COPY(n) DatumGetVarCharPCopy(PG_GETARG_DATUM(n)) |
312 | #define (n) DatumGetHeapTupleHeaderCopy(PG_GETARG_DATUM(n)) |
313 | /* And a b-byte slice from position a -also OK to write */ |
314 | #define PG_GETARG_BYTEA_P_SLICE(n,a,b) DatumGetByteaPSlice(PG_GETARG_DATUM(n),a,b) |
315 | #define PG_GETARG_TEXT_P_SLICE(n,a,b) DatumGetTextPSlice(PG_GETARG_DATUM(n),a,b) |
316 | #define PG_GETARG_BPCHAR_P_SLICE(n,a,b) DatumGetBpCharPSlice(PG_GETARG_DATUM(n),a,b) |
317 | #define PG_GETARG_VARCHAR_P_SLICE(n,a,b) DatumGetVarCharPSlice(PG_GETARG_DATUM(n),a,b) |
318 | /* |
319 | * Obsolescent variants that guarantee INT alignment for the return value. |
320 | * Few operations on these particular types need alignment, mainly operations |
321 | * that cast the VARDATA pointer to a type like int16[]. Most code should use |
322 | * the ...PP(X) counterpart. Nonetheless, these appear frequently in code |
323 | * predating the PostgreSQL 8.3 introduction of the ...PP(X) variants. |
324 | */ |
325 | #define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X)) |
326 | #define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X)) |
327 | #define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X)) |
328 | #define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X)) |
329 | #define PG_GETARG_BYTEA_P(n) DatumGetByteaP(PG_GETARG_DATUM(n)) |
330 | #define PG_GETARG_TEXT_P(n) DatumGetTextP(PG_GETARG_DATUM(n)) |
331 | #define PG_GETARG_BPCHAR_P(n) DatumGetBpCharP(PG_GETARG_DATUM(n)) |
332 | #define PG_GETARG_VARCHAR_P(n) DatumGetVarCharP(PG_GETARG_DATUM(n)) |
333 | |
334 | /* To return a NULL do this: */ |
335 | #define PG_RETURN_NULL() \ |
336 | do { fcinfo->isnull = true; return (Datum) 0; } while (0) |
337 | |
338 | /* A few internal functions return void (which is not the same as NULL!) */ |
339 | #define PG_RETURN_VOID() return (Datum) 0 |
340 | |
341 | /* Macros for returning results of standard types */ |
342 | |
343 | #define PG_RETURN_DATUM(x) return (x) |
344 | #define PG_RETURN_INT32(x) return Int32GetDatum(x) |
345 | #define PG_RETURN_UINT32(x) return UInt32GetDatum(x) |
346 | #define PG_RETURN_INT16(x) return Int16GetDatum(x) |
347 | #define PG_RETURN_UINT16(x) return UInt16GetDatum(x) |
348 | #define PG_RETURN_CHAR(x) return CharGetDatum(x) |
349 | #define PG_RETURN_BOOL(x) return BoolGetDatum(x) |
350 | #define PG_RETURN_OID(x) return ObjectIdGetDatum(x) |
351 | #define PG_RETURN_POINTER(x) return PointerGetDatum(x) |
352 | #define PG_RETURN_CSTRING(x) return CStringGetDatum(x) |
353 | #define PG_RETURN_NAME(x) return NameGetDatum(x) |
354 | /* these macros hide the pass-by-reference-ness of the datatype: */ |
355 | #define PG_RETURN_FLOAT4(x) return Float4GetDatum(x) |
356 | #define PG_RETURN_FLOAT8(x) return Float8GetDatum(x) |
357 | #define PG_RETURN_INT64(x) return Int64GetDatum(x) |
358 | #define PG_RETURN_UINT64(x) return UInt64GetDatum(x) |
359 | /* RETURN macros for other pass-by-ref types will typically look like this: */ |
360 | #define PG_RETURN_BYTEA_P(x) PG_RETURN_POINTER(x) |
361 | #define PG_RETURN_TEXT_P(x) PG_RETURN_POINTER(x) |
362 | #define PG_RETURN_BPCHAR_P(x) PG_RETURN_POINTER(x) |
363 | #define PG_RETURN_VARCHAR_P(x) PG_RETURN_POINTER(x) |
364 | #define (x) return HeapTupleHeaderGetDatum(x) |
365 | |
366 | |
367 | /*------------------------------------------------------------------------- |
368 | * Support for detecting call convention of dynamically-loaded functions |
369 | * |
370 | * Dynamically loaded functions currently can only use the version-1 ("new |
371 | * style") calling convention. Version-0 ("old style") is not supported |
372 | * anymore. Version 1 is the call convention defined in this header file, and |
373 | * must be accompanied by the macro call |
374 | * |
375 | * PG_FUNCTION_INFO_V1(function_name); |
376 | * |
377 | * Note that internal functions do not need this decoration since they are |
378 | * assumed to be version-1. |
379 | * |
380 | *------------------------------------------------------------------------- |
381 | */ |
382 | |
383 | typedef struct |
384 | { |
385 | int api_version; /* specifies call convention version number */ |
386 | /* More fields may be added later, for version numbers > 1. */ |
387 | } Pg_finfo_record; |
388 | |
389 | /* Expected signature of an info function */ |
390 | typedef const Pg_finfo_record *(*PGFInfoFunction) (void); |
391 | |
392 | /* |
393 | * Macro to build an info function associated with the given function name. |
394 | * |
395 | * As a convenience, also provide an "extern" declaration for the given |
396 | * function name, so that writers of C functions need not write that too. |
397 | * |
398 | * On Windows, the function and info function must be exported. Our normal |
399 | * build processes take care of that via .DEF files or --export-all-symbols. |
400 | * Module authors using a different build process might need to manually |
401 | * declare the function PGDLLEXPORT. We do that automatically here for the |
402 | * info function, since authors shouldn't need to be explicitly aware of it. |
403 | */ |
404 | #define PG_FUNCTION_INFO_V1(funcname) \ |
405 | extern Datum funcname(PG_FUNCTION_ARGS); \ |
406 | extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \ |
407 | const Pg_finfo_record * \ |
408 | CppConcat(pg_finfo_,funcname) (void) \ |
409 | { \ |
410 | static const Pg_finfo_record my_finfo = { 1 }; \ |
411 | return &my_finfo; \ |
412 | } \ |
413 | extern int no_such_variable |
414 | |
415 | |
416 | /*------------------------------------------------------------------------- |
417 | * Support for verifying backend compatibility of loaded modules |
418 | * |
419 | * We require dynamically-loaded modules to include the macro call |
420 | * PG_MODULE_MAGIC; |
421 | * so that we can check for obvious incompatibility, such as being compiled |
422 | * for a different major PostgreSQL version. |
423 | * |
424 | * To compile with versions of PostgreSQL that do not support this, |
425 | * you may put an #ifdef/#endif test around it. Note that in a multiple- |
426 | * source-file module, the macro call should only appear once. |
427 | * |
428 | * The specific items included in the magic block are intended to be ones that |
429 | * are custom-configurable and especially likely to break dynamically loaded |
430 | * modules if they were compiled with other values. Also, the length field |
431 | * can be used to detect definition changes. |
432 | * |
433 | * Note: we compare magic blocks with memcmp(), so there had better not be |
434 | * any alignment pad bytes in them. |
435 | * |
436 | * Note: when changing the contents of magic blocks, be sure to adjust the |
437 | * incompatible_module_error() function in dfmgr.c. |
438 | *------------------------------------------------------------------------- |
439 | */ |
440 | |
441 | /* Definition of the magic block structure */ |
442 | typedef struct |
443 | { |
444 | int len; /* sizeof(this struct) */ |
445 | int version; /* PostgreSQL major version */ |
446 | int funcmaxargs; /* FUNC_MAX_ARGS */ |
447 | int indexmaxkeys; /* INDEX_MAX_KEYS */ |
448 | int namedatalen; /* NAMEDATALEN */ |
449 | int float4byval; /* FLOAT4PASSBYVAL */ |
450 | int float8byval; /* FLOAT8PASSBYVAL */ |
451 | } Pg_magic_struct; |
452 | |
453 | /* The actual data block contents */ |
454 | #define PG_MODULE_MAGIC_DATA \ |
455 | { \ |
456 | sizeof(Pg_magic_struct), \ |
457 | PG_VERSION_NUM / 100, \ |
458 | FUNC_MAX_ARGS, \ |
459 | INDEX_MAX_KEYS, \ |
460 | NAMEDATALEN, \ |
461 | FLOAT4PASSBYVAL, \ |
462 | FLOAT8PASSBYVAL \ |
463 | } |
464 | |
465 | /* |
466 | * Declare the module magic function. It needs to be a function as the dlsym |
467 | * in the backend is only guaranteed to work on functions, not data |
468 | */ |
469 | typedef const Pg_magic_struct *(*PGModuleMagicFunction) (void); |
470 | |
471 | #define PG_MAGIC_FUNCTION_NAME Pg_magic_func |
472 | #define PG_MAGIC_FUNCTION_NAME_STRING "Pg_magic_func" |
473 | |
474 | #define PG_MODULE_MAGIC \ |
475 | extern PGDLLEXPORT const Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \ |
476 | const Pg_magic_struct * \ |
477 | PG_MAGIC_FUNCTION_NAME(void) \ |
478 | { \ |
479 | static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \ |
480 | return &Pg_magic_data; \ |
481 | } \ |
482 | extern int no_such_variable |
483 | |
484 | |
485 | /*------------------------------------------------------------------------- |
486 | * Support routines and macros for callers of fmgr-compatible functions |
487 | *------------------------------------------------------------------------- |
488 | */ |
489 | |
490 | /* These are for invocation of a specifically named function with a |
491 | * directly-computed parameter list. Note that neither arguments nor result |
492 | * are allowed to be NULL. |
493 | */ |
494 | extern Datum DirectFunctionCall1Coll(PGFunction func, Oid collation, |
495 | Datum arg1); |
496 | extern Datum DirectFunctionCall2Coll(PGFunction func, Oid collation, |
497 | Datum arg1, Datum arg2); |
498 | extern Datum DirectFunctionCall3Coll(PGFunction func, Oid collation, |
499 | Datum arg1, Datum arg2, |
500 | Datum arg3); |
501 | extern Datum DirectFunctionCall4Coll(PGFunction func, Oid collation, |
502 | Datum arg1, Datum arg2, |
503 | Datum arg3, Datum arg4); |
504 | extern Datum DirectFunctionCall5Coll(PGFunction func, Oid collation, |
505 | Datum arg1, Datum arg2, |
506 | Datum arg3, Datum arg4, Datum arg5); |
507 | extern Datum DirectFunctionCall6Coll(PGFunction func, Oid collation, |
508 | Datum arg1, Datum arg2, |
509 | Datum arg3, Datum arg4, Datum arg5, |
510 | Datum arg6); |
511 | extern Datum DirectFunctionCall7Coll(PGFunction func, Oid collation, |
512 | Datum arg1, Datum arg2, |
513 | Datum arg3, Datum arg4, Datum arg5, |
514 | Datum arg6, Datum arg7); |
515 | extern Datum DirectFunctionCall8Coll(PGFunction func, Oid collation, |
516 | Datum arg1, Datum arg2, |
517 | Datum arg3, Datum arg4, Datum arg5, |
518 | Datum arg6, Datum arg7, Datum arg8); |
519 | extern Datum DirectFunctionCall9Coll(PGFunction func, Oid collation, |
520 | Datum arg1, Datum arg2, |
521 | Datum arg3, Datum arg4, Datum arg5, |
522 | Datum arg6, Datum arg7, Datum arg8, |
523 | Datum arg9); |
524 | |
525 | /* |
526 | * These functions work like the DirectFunctionCall functions except that |
527 | * they use the flinfo parameter to initialise the fcinfo for the call. |
528 | * It's recommended that the callee only use the fn_extra and fn_mcxt |
529 | * fields, as other fields will typically describe the calling function |
530 | * not the callee. Conversely, the calling function should not have |
531 | * used fn_extra, unless its use is known to be compatible with the callee's. |
532 | */ |
533 | extern Datum CallerFInfoFunctionCall1(PGFunction func, FmgrInfo *flinfo, |
534 | Oid collation, Datum arg1); |
535 | extern Datum CallerFInfoFunctionCall2(PGFunction func, FmgrInfo *flinfo, |
536 | Oid collation, Datum arg1, Datum arg2); |
537 | |
538 | /* These are for invocation of a previously-looked-up function with a |
539 | * directly-computed parameter list. Note that neither arguments nor result |
540 | * are allowed to be NULL. |
541 | */ |
542 | extern Datum FunctionCall0Coll(FmgrInfo *flinfo, Oid collation); |
543 | extern Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, |
544 | Datum arg1); |
545 | extern Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, |
546 | Datum arg1, Datum arg2); |
547 | extern Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, |
548 | Datum arg1, Datum arg2, |
549 | Datum arg3); |
550 | extern Datum FunctionCall4Coll(FmgrInfo *flinfo, Oid collation, |
551 | Datum arg1, Datum arg2, |
552 | Datum arg3, Datum arg4); |
553 | extern Datum FunctionCall5Coll(FmgrInfo *flinfo, Oid collation, |
554 | Datum arg1, Datum arg2, |
555 | Datum arg3, Datum arg4, Datum arg5); |
556 | extern Datum FunctionCall6Coll(FmgrInfo *flinfo, Oid collation, |
557 | Datum arg1, Datum arg2, |
558 | Datum arg3, Datum arg4, Datum arg5, |
559 | Datum arg6); |
560 | extern Datum FunctionCall7Coll(FmgrInfo *flinfo, Oid collation, |
561 | Datum arg1, Datum arg2, |
562 | Datum arg3, Datum arg4, Datum arg5, |
563 | Datum arg6, Datum arg7); |
564 | extern Datum FunctionCall8Coll(FmgrInfo *flinfo, Oid collation, |
565 | Datum arg1, Datum arg2, |
566 | Datum arg3, Datum arg4, Datum arg5, |
567 | Datum arg6, Datum arg7, Datum arg8); |
568 | extern Datum FunctionCall9Coll(FmgrInfo *flinfo, Oid collation, |
569 | Datum arg1, Datum arg2, |
570 | Datum arg3, Datum arg4, Datum arg5, |
571 | Datum arg6, Datum arg7, Datum arg8, |
572 | Datum arg9); |
573 | |
574 | /* These are for invocation of a function identified by OID with a |
575 | * directly-computed parameter list. Note that neither arguments nor result |
576 | * are allowed to be NULL. These are essentially fmgr_info() followed by |
577 | * FunctionCallN(). If the same function is to be invoked repeatedly, do the |
578 | * fmgr_info() once and then use FunctionCallN(). |
579 | */ |
580 | extern Datum OidFunctionCall0Coll(Oid functionId, Oid collation); |
581 | extern Datum OidFunctionCall1Coll(Oid functionId, Oid collation, |
582 | Datum arg1); |
583 | extern Datum OidFunctionCall2Coll(Oid functionId, Oid collation, |
584 | Datum arg1, Datum arg2); |
585 | extern Datum OidFunctionCall3Coll(Oid functionId, Oid collation, |
586 | Datum arg1, Datum arg2, |
587 | Datum arg3); |
588 | extern Datum OidFunctionCall4Coll(Oid functionId, Oid collation, |
589 | Datum arg1, Datum arg2, |
590 | Datum arg3, Datum arg4); |
591 | extern Datum OidFunctionCall5Coll(Oid functionId, Oid collation, |
592 | Datum arg1, Datum arg2, |
593 | Datum arg3, Datum arg4, Datum arg5); |
594 | extern Datum OidFunctionCall6Coll(Oid functionId, Oid collation, |
595 | Datum arg1, Datum arg2, |
596 | Datum arg3, Datum arg4, Datum arg5, |
597 | Datum arg6); |
598 | extern Datum OidFunctionCall7Coll(Oid functionId, Oid collation, |
599 | Datum arg1, Datum arg2, |
600 | Datum arg3, Datum arg4, Datum arg5, |
601 | Datum arg6, Datum arg7); |
602 | extern Datum OidFunctionCall8Coll(Oid functionId, Oid collation, |
603 | Datum arg1, Datum arg2, |
604 | Datum arg3, Datum arg4, Datum arg5, |
605 | Datum arg6, Datum arg7, Datum arg8); |
606 | extern Datum OidFunctionCall9Coll(Oid functionId, Oid collation, |
607 | Datum arg1, Datum arg2, |
608 | Datum arg3, Datum arg4, Datum arg5, |
609 | Datum arg6, Datum arg7, Datum arg8, |
610 | Datum arg9); |
611 | |
612 | /* These macros allow the collation argument to be omitted (with a default of |
613 | * InvalidOid, ie, no collation). They exist mostly for backwards |
614 | * compatibility of source code. |
615 | */ |
616 | #define DirectFunctionCall1(func, arg1) \ |
617 | DirectFunctionCall1Coll(func, InvalidOid, arg1) |
618 | #define DirectFunctionCall2(func, arg1, arg2) \ |
619 | DirectFunctionCall2Coll(func, InvalidOid, arg1, arg2) |
620 | #define DirectFunctionCall3(func, arg1, arg2, arg3) \ |
621 | DirectFunctionCall3Coll(func, InvalidOid, arg1, arg2, arg3) |
622 | #define DirectFunctionCall4(func, arg1, arg2, arg3, arg4) \ |
623 | DirectFunctionCall4Coll(func, InvalidOid, arg1, arg2, arg3, arg4) |
624 | #define DirectFunctionCall5(func, arg1, arg2, arg3, arg4, arg5) \ |
625 | DirectFunctionCall5Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5) |
626 | #define DirectFunctionCall6(func, arg1, arg2, arg3, arg4, arg5, arg6) \ |
627 | DirectFunctionCall6Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6) |
628 | #define DirectFunctionCall7(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ |
629 | DirectFunctionCall7Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7) |
630 | #define DirectFunctionCall8(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ |
631 | DirectFunctionCall8Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) |
632 | #define DirectFunctionCall9(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ |
633 | DirectFunctionCall9Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) |
634 | #define FunctionCall1(flinfo, arg1) \ |
635 | FunctionCall1Coll(flinfo, InvalidOid, arg1) |
636 | #define FunctionCall2(flinfo, arg1, arg2) \ |
637 | FunctionCall2Coll(flinfo, InvalidOid, arg1, arg2) |
638 | #define FunctionCall3(flinfo, arg1, arg2, arg3) \ |
639 | FunctionCall3Coll(flinfo, InvalidOid, arg1, arg2, arg3) |
640 | #define FunctionCall4(flinfo, arg1, arg2, arg3, arg4) \ |
641 | FunctionCall4Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4) |
642 | #define FunctionCall5(flinfo, arg1, arg2, arg3, arg4, arg5) \ |
643 | FunctionCall5Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5) |
644 | #define FunctionCall6(flinfo, arg1, arg2, arg3, arg4, arg5, arg6) \ |
645 | FunctionCall6Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6) |
646 | #define FunctionCall7(flinfo, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ |
647 | FunctionCall7Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7) |
648 | #define FunctionCall8(flinfo, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ |
649 | FunctionCall8Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) |
650 | #define FunctionCall9(flinfo, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ |
651 | FunctionCall9Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) |
652 | #define OidFunctionCall0(functionId) \ |
653 | OidFunctionCall0Coll(functionId, InvalidOid) |
654 | #define OidFunctionCall1(functionId, arg1) \ |
655 | OidFunctionCall1Coll(functionId, InvalidOid, arg1) |
656 | #define OidFunctionCall2(functionId, arg1, arg2) \ |
657 | OidFunctionCall2Coll(functionId, InvalidOid, arg1, arg2) |
658 | #define OidFunctionCall3(functionId, arg1, arg2, arg3) \ |
659 | OidFunctionCall3Coll(functionId, InvalidOid, arg1, arg2, arg3) |
660 | #define OidFunctionCall4(functionId, arg1, arg2, arg3, arg4) \ |
661 | OidFunctionCall4Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4) |
662 | #define OidFunctionCall5(functionId, arg1, arg2, arg3, arg4, arg5) \ |
663 | OidFunctionCall5Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5) |
664 | #define OidFunctionCall6(functionId, arg1, arg2, arg3, arg4, arg5, arg6) \ |
665 | OidFunctionCall6Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6) |
666 | #define OidFunctionCall7(functionId, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ |
667 | OidFunctionCall7Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7) |
668 | #define OidFunctionCall8(functionId, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ |
669 | OidFunctionCall8Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) |
670 | #define OidFunctionCall9(functionId, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ |
671 | OidFunctionCall9Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) |
672 | |
673 | |
674 | /* Special cases for convenient invocation of datatype I/O functions. */ |
675 | extern Datum InputFunctionCall(FmgrInfo *flinfo, char *str, |
676 | Oid typioparam, int32 typmod); |
677 | extern Datum OidInputFunctionCall(Oid functionId, char *str, |
678 | Oid typioparam, int32 typmod); |
679 | extern char *OutputFunctionCall(FmgrInfo *flinfo, Datum val); |
680 | extern char *OidOutputFunctionCall(Oid functionId, Datum val); |
681 | extern Datum ReceiveFunctionCall(FmgrInfo *flinfo, fmStringInfo buf, |
682 | Oid typioparam, int32 typmod); |
683 | extern Datum OidReceiveFunctionCall(Oid functionId, fmStringInfo buf, |
684 | Oid typioparam, int32 typmod); |
685 | extern bytea *SendFunctionCall(FmgrInfo *flinfo, Datum val); |
686 | extern bytea *OidSendFunctionCall(Oid functionId, Datum val); |
687 | |
688 | |
689 | /* |
690 | * Routines in fmgr.c |
691 | */ |
692 | extern const Pg_finfo_record *fetch_finfo_record(void *filehandle, const char *funcname); |
693 | extern void clear_external_function_hash(void *filehandle); |
694 | extern Oid fmgr_internal_function(const char *proname); |
695 | extern Oid get_fn_expr_rettype(FmgrInfo *flinfo); |
696 | extern Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum); |
697 | extern Oid get_call_expr_argtype(fmNodePtr expr, int argnum); |
698 | extern bool get_fn_expr_arg_stable(FmgrInfo *flinfo, int argnum); |
699 | extern bool get_call_expr_arg_stable(fmNodePtr expr, int argnum); |
700 | extern bool get_fn_expr_variadic(FmgrInfo *flinfo); |
701 | extern bool CheckFunctionValidatorAccess(Oid validatorOid, Oid functionOid); |
702 | |
703 | /* |
704 | * Routines in dfmgr.c |
705 | */ |
706 | extern char *Dynamic_library_path; |
707 | |
708 | extern PGFunction load_external_function(const char *filename, const char *funcname, |
709 | bool signalNotFound, void **filehandle); |
710 | extern PGFunction lookup_external_function(void *filehandle, const char *funcname); |
711 | extern void load_file(const char *filename, bool restricted); |
712 | extern void **find_rendezvous_variable(const char *varName); |
713 | extern Size EstimateLibraryStateSpace(void); |
714 | extern void SerializeLibraryState(Size maxsize, char *start_address); |
715 | extern void RestoreLibraryState(char *start_address); |
716 | |
717 | /* |
718 | * Support for aggregate functions |
719 | * |
720 | * These are actually in executor/nodeAgg.c, but we declare them here since |
721 | * the whole point is for callers to not be overly friendly with nodeAgg. |
722 | */ |
723 | |
724 | /* AggCheckCallContext can return one of the following codes, or 0: */ |
725 | #define AGG_CONTEXT_AGGREGATE 1 /* regular aggregate */ |
726 | #define AGG_CONTEXT_WINDOW 2 /* window function */ |
727 | |
728 | extern int AggCheckCallContext(FunctionCallInfo fcinfo, |
729 | MemoryContext *aggcontext); |
730 | extern fmAggrefPtr AggGetAggref(FunctionCallInfo fcinfo); |
731 | extern MemoryContext AggGetTempMemoryContext(FunctionCallInfo fcinfo); |
732 | extern bool AggStateIsShared(FunctionCallInfo fcinfo); |
733 | extern void AggRegisterCallback(FunctionCallInfo fcinfo, |
734 | fmExprContextCallbackFunction func, |
735 | Datum arg); |
736 | |
737 | /* |
738 | * We allow plugin modules to hook function entry/exit. This is intended |
739 | * as support for loadable security policy modules, which may want to |
740 | * perform additional privilege checks on function entry or exit, or to do |
741 | * other internal bookkeeping. To make this possible, such modules must be |
742 | * able not only to support normal function entry and exit, but also to trap |
743 | * the case where we bail out due to an error; and they must also be able to |
744 | * prevent inlining. |
745 | */ |
746 | typedef enum FmgrHookEventType |
747 | { |
748 | FHET_START, |
749 | FHET_END, |
750 | FHET_ABORT |
751 | } FmgrHookEventType; |
752 | |
753 | typedef bool (*needs_fmgr_hook_type) (Oid fn_oid); |
754 | |
755 | typedef void (*fmgr_hook_type) (FmgrHookEventType event, |
756 | FmgrInfo *flinfo, Datum *arg); |
757 | |
758 | extern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook; |
759 | extern PGDLLIMPORT fmgr_hook_type fmgr_hook; |
760 | |
761 | #define FmgrHookIsNeeded(fn_oid) \ |
762 | (!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid)) |
763 | |
764 | #endif /* FMGR_H */ |
765 | |