PostgreSQL Source Code git master
Loading...
Searching...
No Matches
fmgr.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * fmgr.c
4 * The Postgres function manager.
5 *
6 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/utils/fmgr/fmgr.c
12 *
13 *-------------------------------------------------------------------------
14 */
15
16#include "postgres.h"
17
18#include "access/detoast.h"
19#include "access/htup_details.h"
20#include "catalog/pg_language.h"
21#include "catalog/pg_proc.h"
22#include "catalog/pg_type.h"
23#include "executor/functions.h"
24#include "lib/stringinfo.h"
25#include "miscadmin.h"
26#include "nodes/makefuncs.h"
27#include "nodes/miscnodes.h"
28#include "nodes/nodeFuncs.h"
29#include "pgstat.h"
30#include "utils/acl.h"
31#include "utils/builtins.h"
32#include "utils/fmgrtab.h"
33#include "utils/guc.h"
34#include "utils/hsearch.h"
35#include "utils/lsyscache.h"
36#include "utils/syscache.h"
37
38/*
39 * Hooks for function calls
40 */
43
44/*
45 * Hashtable for fast lookup of external C functions
46 */
47typedef struct
48{
49 /* fn_oid is the hash key and so must be first! */
50 Oid fn_oid; /* OID of an external C function */
51 TransactionId fn_xmin; /* for checking up-to-dateness */
53 PGFunction user_fn; /* the function's address */
54 const Pg_finfo_record *inforec; /* address of its info record */
56
58
59
61 bool ignore_security);
66 PGFunction user_fn, const Pg_finfo_record *inforec);
67
68/* extern so it's callable via JIT */
70
71
72/*
73 * Lookup routines for builtin-function table. We can search by either Oid
74 * or name, but search by Oid is much faster.
75 */
76
77static const FmgrBuiltin *
79{
81
82 /* fast lookup only possible if original oid still assigned */
83 if (id > fmgr_last_builtin_oid)
84 return NULL;
85
86 /*
87 * Lookup function data. If there's a miss in that range it's likely a
88 * nonexistent function, returning NULL here will trigger an ERROR later.
89 */
92 return NULL;
93
94 return &fmgr_builtins[index];
95}
96
97/*
98 * Lookup a builtin by name. Note there can be more than one entry in
99 * the array with the same name, but they should all point to the same
100 * routine.
101 */
102static const FmgrBuiltin *
104{
105 int i;
106
107 for (i = 0; i < fmgr_nbuiltins; i++)
108 {
109 if (strcmp(name, fmgr_builtins[i].funcName) == 0)
110 return fmgr_builtins + i;
111 }
112 return NULL;
113}
114
115/*
116 * This routine fills a FmgrInfo struct, given the OID
117 * of the function to be called.
118 *
119 * The caller's CurrentMemoryContext is used as the fn_mcxt of the info
120 * struct; this means that any subsidiary data attached to the info struct
121 * (either by fmgr_info itself, or later on by a function call handler)
122 * will be allocated in that context. The caller must ensure that this
123 * context is at least as long-lived as the info struct itself. This is
124 * not a problem in typical cases where the info struct is on the stack or
125 * in freshly-palloc'd space. However, if one intends to store an info
126 * struct in a long-lived table, it's better to use fmgr_info_cxt.
127 */
128void
133
134/*
135 * Fill a FmgrInfo struct, specifying a memory context in which its
136 * subsidiary data should go.
137 */
138void
140{
141 fmgr_info_cxt_security(functionId, finfo, mcxt, false);
142}
143
144/*
145 * This one does the actual work. ignore_security is ordinarily false
146 * but is set to true when we need to avoid recursion.
147 */
148static void
150 bool ignore_security)
151{
152 const FmgrBuiltin *fbp;
156 char *prosrc;
157
158 /*
159 * fn_oid *must* be filled in last. Some code assumes that if fn_oid is
160 * valid, the whole struct is valid. Some FmgrInfo struct's do survive
161 * elogs.
162 */
163 finfo->fn_oid = InvalidOid;
164 finfo->fn_extra = NULL;
165 finfo->fn_mcxt = mcxt;
166 finfo->fn_expr = NULL; /* caller may set this later */
167
168 if ((fbp = fmgr_isbuiltin(functionId)) != NULL)
169 {
170 /*
171 * Fast path for builtin functions: don't bother consulting pg_proc
172 */
173 finfo->fn_nargs = fbp->nargs;
174 finfo->fn_strict = fbp->strict;
175 finfo->fn_retset = fbp->retset;
176 finfo->fn_stats = TRACK_FUNC_ALL; /* ie, never track */
177 finfo->fn_addr = fbp->func;
178 finfo->fn_oid = functionId;
179 return;
180 }
181
182 /* Otherwise we need the pg_proc entry */
185 elog(ERROR, "cache lookup failed for function %u", functionId);
187
188 finfo->fn_nargs = procedureStruct->pronargs;
189 finfo->fn_strict = procedureStruct->proisstrict;
190 finfo->fn_retset = procedureStruct->proretset;
191
192 /*
193 * If it has prosecdef set, non-null proconfig, or if a plugin wants to
194 * hook function entry/exit, use fmgr_security_definer call handler ---
195 * unless we are being called again by fmgr_security_definer or
196 * fmgr_info_other_lang.
197 *
198 * When using fmgr_security_definer, function stats tracking is always
199 * disabled at the outer level, and instead we set the flag properly in
200 * fmgr_security_definer's private flinfo and implement the tracking
201 * inside fmgr_security_definer. This loses the ability to charge the
202 * overhead of fmgr_security_definer to the function, but gains the
203 * ability to set the track_functions GUC as a local GUC parameter of an
204 * interesting function and have the right things happen.
205 */
206 if (!ignore_security &&
207 (procedureStruct->prosecdef ||
210 {
212 finfo->fn_stats = TRACK_FUNC_ALL; /* ie, never track */
213 finfo->fn_oid = functionId;
215 return;
216 }
217
218 switch (procedureStruct->prolang)
219 {
221
222 /*
223 * For an ordinary builtin function, we should never get here
224 * because the fmgr_isbuiltin() search above will have succeeded.
225 * However, if the user has done a CREATE FUNCTION to create an
226 * alias for a builtin function, we can end up here. In that case
227 * we have to look up the function by name. The name of the
228 * internal function is stored in prosrc (it doesn't have to be
229 * the same as the name of the alias!)
230 */
234 fbp = fmgr_lookupByName(prosrc);
235 if (fbp == NULL)
238 errmsg("internal function \"%s\" is not in internal lookup table",
239 prosrc)));
240 pfree(prosrc);
241 /* Should we check that nargs, strict, retset match the table? */
242 finfo->fn_addr = fbp->func;
243 /* note this policy is also assumed in fast path above */
244 finfo->fn_stats = TRACK_FUNC_ALL; /* ie, never track */
245 break;
246
247 case ClanguageId:
249 finfo->fn_stats = TRACK_FUNC_PL; /* ie, track if ALL */
250 break;
251
252 case SQLlanguageId:
253 finfo->fn_addr = fmgr_sql;
254 finfo->fn_stats = TRACK_FUNC_PL; /* ie, track if ALL */
255 break;
256
257 default:
259 finfo->fn_stats = TRACK_FUNC_OFF; /* ie, track if not OFF */
260 break;
261 }
262
263 finfo->fn_oid = functionId;
265}
266
267/*
268 * Return module and C function name providing implementation of functionId.
269 *
270 * If *mod == NULL and *fn == NULL, no C symbol is known to implement
271 * function.
272 *
273 * If *mod == NULL and *fn != NULL, the function is implemented by a symbol in
274 * the main binary.
275 *
276 * If *mod != NULL and *fn != NULL the function is implemented in an extension
277 * shared object.
278 *
279 * The returned module and function names are pstrdup'ed into the current
280 * memory context.
281 */
282void
284{
289
292 elog(ERROR, "cache lookup failed for function %u", functionId);
294
295 if (procedureStruct->prosecdef ||
298 {
299 *mod = NULL; /* core binary */
300 *fn = pstrdup("fmgr_security_definer");
302 return;
303 }
304
305 /* see fmgr_info_cxt_security for the individual cases */
306 switch (procedureStruct->prolang)
307 {
311
312 *mod = NULL; /* core binary */
314 break;
315
316 case ClanguageId:
319
322
323 /*
324 * No need to check symbol presence / API version here, already
325 * checked in fmgr_info_cxt_security.
326 */
329 break;
330
331 case SQLlanguageId:
332 *mod = NULL; /* core binary */
333 *fn = pstrdup("fmgr_sql");
334 break;
335
336 default:
337 *mod = NULL;
338 *fn = NULL; /* unknown, pass pointer */
339 break;
340 }
341
343}
344
345
346/*
347 * Special fmgr_info processing for C-language functions. Note that
348 * finfo->fn_oid is not valid yet.
349 */
350static void
352{
354 PGFunction user_fn;
355 const Pg_finfo_record *inforec;
356
357 /*
358 * See if we have the function address cached already
359 */
361 if (hashentry)
362 {
363 user_fn = hashentry->user_fn;
364 inforec = hashentry->inforec;
365 }
366 else
367 {
370 char *prosrcstring,
372 void *libraryhandle;
373
374 /*
375 * Get prosrc and probin strings (link symbol and library filename).
376 * While in general these columns might be null, that's not allowed
377 * for C-language functions.
378 */
382
386
387 /* Look up the function itself */
390
391 /* Get the function information record (real or default) */
393
394 /* Cache the addresses for later calls */
395 record_C_func(procedureTuple, user_fn, inforec);
396
399 }
400
401 switch (inforec->api_version)
402 {
403 case 1:
404 /* New style: call directly */
405 finfo->fn_addr = user_fn;
406 break;
407 default:
408 /* Shouldn't get here if fetch_finfo_record did its job */
409 elog(ERROR, "unrecognized function API version: %d",
410 inforec->api_version);
411 break;
412 }
413}
414
415/*
416 * Special fmgr_info processing for other-language functions. Note
417 * that finfo->fn_oid is not valid yet.
418 */
419static void
421{
423 Oid language = procedureStruct->prolang;
427
430 elog(ERROR, "cache lookup failed for language %u", language);
432
433 /*
434 * Look up the language's call handler function, ignoring any attributes
435 * that would normally cause insertion of fmgr_security_definer. We need
436 * to get back a bare pointer to the actual C-language function.
437 */
440 finfo->fn_addr = plfinfo.fn_addr;
441
443}
444
445/*
446 * Fetch and validate the information record for the given external function.
447 * The function is specified by a handle for the containing library
448 * (obtained from load_external_function) as well as the function name.
449 *
450 * If no info function exists for the given name an error is raised.
451 *
452 * This function is broken out of fmgr_info_C_lang so that fmgr_c_validator
453 * can validate the information record for a function not yet entered into
454 * pg_proc.
455 */
456const Pg_finfo_record *
458{
459 char *infofuncname;
461 const Pg_finfo_record *inforec;
462
463 infofuncname = psprintf("pg_finfo_%s", funcname);
464
465 /* Try to look up the info function */
468 if (infofunc == NULL)
469 {
472 errmsg("could not find function information for function \"%s\"",
473 funcname),
474 errhint("SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname).")));
475 return NULL; /* silence compiler */
476 }
477
478 /* Found, so call it */
479 inforec = (*infofunc) ();
480
481 /* Validate result as best we can */
482 if (inforec == NULL)
483 elog(ERROR, "null result from info function \"%s\"", infofuncname);
484 switch (inforec->api_version)
485 {
486 case 1:
487 /* OK, no additional fields to validate */
488 break;
489 default:
492 errmsg("unrecognized API version %d reported by info function \"%s\"",
493 inforec->api_version, infofuncname)));
494 break;
495 }
496
498 return inforec;
499}
500
501
502/*-------------------------------------------------------------------------
503 * Routines for caching lookup information for external C functions.
504 *
505 * The routines in dfmgr.c are relatively slow, so we try to avoid running
506 * them more than once per external function per session. We use a hash table
507 * with the function OID as the lookup key.
508 *-------------------------------------------------------------------------
509 */
510
511/*
512 * lookup_C_func: try to find a C function in the hash table
513 *
514 * If an entry exists and is up to date, return it; else return NULL
515 */
516static CFuncHashTabEntry *
518{
519 Oid fn_oid = ((Form_pg_proc) GETSTRUCT(procedureTuple))->oid;
520 CFuncHashTabEntry *entry;
521
522 if (CFuncHash == NULL)
523 return NULL; /* no table yet */
524 entry = (CFuncHashTabEntry *)
526 &fn_oid,
527 HASH_FIND,
528 NULL);
529 if (entry == NULL)
530 return NULL; /* no such entry */
531 if (entry->fn_xmin == HeapTupleHeaderGetRawXmin(procedureTuple->t_data) &&
532 ItemPointerEquals(&entry->fn_tid, &procedureTuple->t_self))
533 return entry; /* OK */
534 return NULL; /* entry is out of date */
535}
536
537/*
538 * record_C_func: enter (or update) info about a C function in the hash table
539 */
540static void
542 PGFunction user_fn, const Pg_finfo_record *inforec)
543{
544 Oid fn_oid = ((Form_pg_proc) GETSTRUCT(procedureTuple))->oid;
545 CFuncHashTabEntry *entry;
546 bool found;
547
548 /* Create the hash table if it doesn't exist yet */
549 if (CFuncHash == NULL)
550 {
552
553 hash_ctl.keysize = sizeof(Oid);
554 hash_ctl.entrysize = sizeof(CFuncHashTabEntry);
555 CFuncHash = hash_create("CFuncHash",
556 100,
557 &hash_ctl,
559 }
560
561 entry = (CFuncHashTabEntry *)
563 &fn_oid,
565 &found);
566 /* OID is already filled in */
568 entry->fn_tid = procedureTuple->t_self;
569 entry->user_fn = user_fn;
570 entry->inforec = inforec;
571}
572
573
574/*
575 * Copy an FmgrInfo struct
576 *
577 * This is inherently somewhat bogus since we can't reliably duplicate
578 * language-dependent subsidiary info. We cheat by zeroing fn_extra,
579 * instead, meaning that subsidiary info will have to be recomputed.
580 */
581void
584{
585 memcpy(dstinfo, srcinfo, sizeof(FmgrInfo));
586 dstinfo->fn_mcxt = destcxt;
587 dstinfo->fn_extra = NULL;
588}
589
590
591/*
592 * Specialized lookup routine for fmgr_internal_validator: given the alleged
593 * name of an internal function, return the OID of the function.
594 * If the name is not recognized, return InvalidOid.
595 */
596Oid
598{
600
601 if (fbp == NULL)
602 return InvalidOid;
603 return fbp->foid;
604}
605
606
607/*
608 * Support for security-definer and proconfig-using functions. We support
609 * both of these features using the same call handler, because they are
610 * often used together and it would be inefficient (as well as notationally
611 * messy) to have two levels of call handler involved.
612 */
614{
615 FmgrInfo flinfo; /* lookup info for target function */
616 Oid userid; /* userid to set, or InvalidOid */
617 List *configNames; /* GUC names to set, or NIL */
618 List *configHandles; /* GUC handles to set, or NIL */
619 List *configValues; /* GUC values to set, or NIL */
620 Datum arg; /* passthrough argument for plugin modules */
621};
622
623/*
624 * Function handler for security-definer/proconfig/plugin-hooked functions.
625 * We extract the OID of the actual function and do a fmgr lookup again.
626 * Then we fetch the pg_proc row and copy the owner ID and proconfig fields.
627 * (All this info is cached for the duration of the current query.)
628 * To execute a call, we temporarily replace the flinfo with the cached
629 * and looked-up one, while keeping the outer fcinfo (which contains all
630 * the actual arguments, etc.) intact. This is not re-entrant, but then
631 * the fcinfo itself can't be used reentrantly anyway.
632 */
633extern Datum
635{
636 Datum result;
637 struct fmgr_security_definer_cache *volatile fcache;
639 Oid save_userid;
640 int save_sec_context;
641 ListCell *lc1,
642 *lc2,
643 *lc3;
644 int save_nestlevel;
646
647 if (!fcinfo->flinfo->fn_extra)
648 {
649 HeapTuple tuple;
651 Datum datum;
652 bool isnull;
654
655 fcache = MemoryContextAllocZero(fcinfo->flinfo->fn_mcxt,
656 sizeof(*fcache));
657
658 fmgr_info_cxt_security(fcinfo->flinfo->fn_oid, &fcache->flinfo,
659 fcinfo->flinfo->fn_mcxt, true);
660 fcache->flinfo.fn_expr = fcinfo->flinfo->fn_expr;
661
662 tuple = SearchSysCache1(PROCOID,
663 ObjectIdGetDatum(fcinfo->flinfo->fn_oid));
664 if (!HeapTupleIsValid(tuple))
665 elog(ERROR, "cache lookup failed for function %u",
666 fcinfo->flinfo->fn_oid);
668
669 if (procedureStruct->prosecdef)
670 fcache->userid = procedureStruct->proowner;
671
673 &isnull);
674 if (!isnull)
675 {
676 ArrayType *array;
677 ListCell *lc;
678
679 oldcxt = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
680 array = DatumGetArrayTypeP(datum);
681 TransformGUCArray(array, &fcache->configNames,
682 &fcache->configValues);
683
684 /* transform names to config handles to avoid lookup cost */
685 fcache->configHandles = NIL;
686 foreach(lc, fcache->configNames)
687 {
688 char *name = (char *) lfirst(lc);
689
690 fcache->configHandles = lappend(fcache->configHandles,
692 }
693
695 }
696
697 ReleaseSysCache(tuple);
698
699 fcinfo->flinfo->fn_extra = fcache;
700 }
701 else
702 fcache = fcinfo->flinfo->fn_extra;
703
704 /* GetUserIdAndSecContext is cheap enough that no harm in a wasted call */
705 GetUserIdAndSecContext(&save_userid, &save_sec_context);
706 if (fcache->configNames != NIL) /* Need a new GUC nesting level */
707 save_nestlevel = NewGUCNestLevel();
708 else
709 save_nestlevel = 0; /* keep compiler quiet */
710
711 if (OidIsValid(fcache->userid))
713 save_sec_context | SECURITY_LOCAL_USERID_CHANGE);
714
715 forthree(lc1, fcache->configNames,
716 lc2, fcache->configHandles,
717 lc3, fcache->configValues)
718 {
721 GucAction action = GUC_ACTION_SAVE;
722 char *name = lfirst(lc1);
723 config_handle *handle = lfirst(lc2);
724 char *value = lfirst(lc3);
725
727 context, source, GetUserId(),
728 action, true, 0, false);
729 }
730
731 /* function manager hook */
732 if (fmgr_hook)
733 (*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);
734
735 /*
736 * We don't need to restore GUC or userid settings on error, because the
737 * ensuing xact or subxact abort will do that. The PG_TRY block is only
738 * needed to clean up the flinfo link.
739 */
740 save_flinfo = fcinfo->flinfo;
741
742 PG_TRY();
743 {
744 fcinfo->flinfo = &fcache->flinfo;
745
746 /* See notes in fmgr_info_cxt_security */
748
749 result = FunctionCallInvoke(fcinfo);
750
751 /*
752 * We could be calling either a regular or a set-returning function,
753 * so we have to test to see what finalize flag to use.
754 */
756 (fcinfo->resultinfo == NULL ||
757 !IsA(fcinfo->resultinfo, ReturnSetInfo) ||
758 ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));
759 }
760 PG_CATCH();
761 {
762 fcinfo->flinfo = save_flinfo;
763 if (fmgr_hook)
764 (*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);
765 PG_RE_THROW();
766 }
767 PG_END_TRY();
768
769 fcinfo->flinfo = save_flinfo;
770
771 if (fcache->configNames != NIL)
772 AtEOXact_GUC(true, save_nestlevel);
773 if (OidIsValid(fcache->userid))
774 SetUserIdAndSecContext(save_userid, save_sec_context);
775 if (fmgr_hook)
776 (*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);
777
778 return result;
779}
780
781
782/*-------------------------------------------------------------------------
783 * Support routines for callers of fmgr-compatible functions
784 *-------------------------------------------------------------------------
785 */
786
787/*
788 * These are for invocation of a specifically named function with a
789 * directly-computed parameter list. Note that neither arguments nor result
790 * are allowed to be NULL. Also, the function cannot be one that needs to
791 * look at FmgrInfo, since there won't be any.
792 */
793Datum
795{
796 LOCAL_FCINFO(fcinfo, 1);
797 Datum result;
798
799 InitFunctionCallInfoData(*fcinfo, NULL, 1, collation, NULL, NULL);
800
801 fcinfo->args[0].value = arg1;
802 fcinfo->args[0].isnull = false;
803
804 result = (*func) (fcinfo);
805
806 /* Check for null result, since caller is clearly not expecting one */
807 if (fcinfo->isnull)
808 elog(ERROR, "function %p returned NULL", (void *) func);
809
810 return result;
811}
812
813Datum
815{
816 LOCAL_FCINFO(fcinfo, 2);
817 Datum result;
818
819 InitFunctionCallInfoData(*fcinfo, NULL, 2, collation, NULL, NULL);
820
821 fcinfo->args[0].value = arg1;
822 fcinfo->args[0].isnull = false;
823 fcinfo->args[1].value = arg2;
824 fcinfo->args[1].isnull = false;
825
826 result = (*func) (fcinfo);
827
828 /* Check for null result, since caller is clearly not expecting one */
829 if (fcinfo->isnull)
830 elog(ERROR, "function %p returned NULL", (void *) func);
831
832 return result;
833}
834
835Datum
837 Datum arg3)
838{
839 LOCAL_FCINFO(fcinfo, 3);
840 Datum result;
841
842 InitFunctionCallInfoData(*fcinfo, NULL, 3, collation, NULL, NULL);
843
844 fcinfo->args[0].value = arg1;
845 fcinfo->args[0].isnull = false;
846 fcinfo->args[1].value = arg2;
847 fcinfo->args[1].isnull = false;
848 fcinfo->args[2].value = arg3;
849 fcinfo->args[2].isnull = false;
850
851 result = (*func) (fcinfo);
852
853 /* Check for null result, since caller is clearly not expecting one */
854 if (fcinfo->isnull)
855 elog(ERROR, "function %p returned NULL", (void *) func);
856
857 return result;
858}
859
860Datum
863{
864 LOCAL_FCINFO(fcinfo, 4);
865 Datum result;
866
867 InitFunctionCallInfoData(*fcinfo, NULL, 4, collation, NULL, NULL);
868
869 fcinfo->args[0].value = arg1;
870 fcinfo->args[0].isnull = false;
871 fcinfo->args[1].value = arg2;
872 fcinfo->args[1].isnull = false;
873 fcinfo->args[2].value = arg3;
874 fcinfo->args[2].isnull = false;
875 fcinfo->args[3].value = arg4;
876 fcinfo->args[3].isnull = false;
877
878 result = (*func) (fcinfo);
879
880 /* Check for null result, since caller is clearly not expecting one */
881 if (fcinfo->isnull)
882 elog(ERROR, "function %p returned NULL", (void *) func);
883
884 return result;
885}
886
887Datum
890{
891 LOCAL_FCINFO(fcinfo, 5);
892 Datum result;
893
894 InitFunctionCallInfoData(*fcinfo, NULL, 5, collation, NULL, NULL);
895
896 fcinfo->args[0].value = arg1;
897 fcinfo->args[0].isnull = false;
898 fcinfo->args[1].value = arg2;
899 fcinfo->args[1].isnull = false;
900 fcinfo->args[2].value = arg3;
901 fcinfo->args[2].isnull = false;
902 fcinfo->args[3].value = arg4;
903 fcinfo->args[3].isnull = false;
904 fcinfo->args[4].value = arg5;
905 fcinfo->args[4].isnull = false;
906
907 result = (*func) (fcinfo);
908
909 /* Check for null result, since caller is clearly not expecting one */
910 if (fcinfo->isnull)
911 elog(ERROR, "function %p returned NULL", (void *) func);
912
913 return result;
914}
915
916Datum
919 Datum arg6)
920{
921 LOCAL_FCINFO(fcinfo, 6);
922 Datum result;
923
924 InitFunctionCallInfoData(*fcinfo, NULL, 6, collation, NULL, NULL);
925
926 fcinfo->args[0].value = arg1;
927 fcinfo->args[0].isnull = false;
928 fcinfo->args[1].value = arg2;
929 fcinfo->args[1].isnull = false;
930 fcinfo->args[2].value = arg3;
931 fcinfo->args[2].isnull = false;
932 fcinfo->args[3].value = arg4;
933 fcinfo->args[3].isnull = false;
934 fcinfo->args[4].value = arg5;
935 fcinfo->args[4].isnull = false;
936 fcinfo->args[5].value = arg6;
937 fcinfo->args[5].isnull = false;
938
939 result = (*func) (fcinfo);
940
941 /* Check for null result, since caller is clearly not expecting one */
942 if (fcinfo->isnull)
943 elog(ERROR, "function %p returned NULL", (void *) func);
944
945 return result;
946}
947
948Datum
952{
953 LOCAL_FCINFO(fcinfo, 7);
954 Datum result;
955
956 InitFunctionCallInfoData(*fcinfo, NULL, 7, collation, NULL, NULL);
957
958 fcinfo->args[0].value = arg1;
959 fcinfo->args[0].isnull = false;
960 fcinfo->args[1].value = arg2;
961 fcinfo->args[1].isnull = false;
962 fcinfo->args[2].value = arg3;
963 fcinfo->args[2].isnull = false;
964 fcinfo->args[3].value = arg4;
965 fcinfo->args[3].isnull = false;
966 fcinfo->args[4].value = arg5;
967 fcinfo->args[4].isnull = false;
968 fcinfo->args[5].value = arg6;
969 fcinfo->args[5].isnull = false;
970 fcinfo->args[6].value = arg7;
971 fcinfo->args[6].isnull = false;
972
973 result = (*func) (fcinfo);
974
975 /* Check for null result, since caller is clearly not expecting one */
976 if (fcinfo->isnull)
977 elog(ERROR, "function %p returned NULL", (void *) func);
978
979 return result;
980}
981
982Datum
986{
987 LOCAL_FCINFO(fcinfo, 8);
988 Datum result;
989
990 InitFunctionCallInfoData(*fcinfo, NULL, 8, collation, NULL, NULL);
991
992 fcinfo->args[0].value = arg1;
993 fcinfo->args[0].isnull = false;
994 fcinfo->args[1].value = arg2;
995 fcinfo->args[1].isnull = false;
996 fcinfo->args[2].value = arg3;
997 fcinfo->args[2].isnull = false;
998 fcinfo->args[3].value = arg4;
999 fcinfo->args[3].isnull = false;
1000 fcinfo->args[4].value = arg5;
1001 fcinfo->args[4].isnull = false;
1002 fcinfo->args[5].value = arg6;
1003 fcinfo->args[5].isnull = false;
1004 fcinfo->args[6].value = arg7;
1005 fcinfo->args[6].isnull = false;
1006 fcinfo->args[7].value = arg8;
1007 fcinfo->args[7].isnull = false;
1008
1009 result = (*func) (fcinfo);
1010
1011 /* Check for null result, since caller is clearly not expecting one */
1012 if (fcinfo->isnull)
1013 elog(ERROR, "function %p returned NULL", (void *) func);
1014
1015 return result;
1016}
1017
1018Datum
1022 Datum arg9)
1023{
1024 LOCAL_FCINFO(fcinfo, 9);
1025 Datum result;
1026
1027 InitFunctionCallInfoData(*fcinfo, NULL, 9, collation, NULL, NULL);
1028
1029 fcinfo->args[0].value = arg1;
1030 fcinfo->args[0].isnull = false;
1031 fcinfo->args[1].value = arg2;
1032 fcinfo->args[1].isnull = false;
1033 fcinfo->args[2].value = arg3;
1034 fcinfo->args[2].isnull = false;
1035 fcinfo->args[3].value = arg4;
1036 fcinfo->args[3].isnull = false;
1037 fcinfo->args[4].value = arg5;
1038 fcinfo->args[4].isnull = false;
1039 fcinfo->args[5].value = arg6;
1040 fcinfo->args[5].isnull = false;
1041 fcinfo->args[6].value = arg7;
1042 fcinfo->args[6].isnull = false;
1043 fcinfo->args[7].value = arg8;
1044 fcinfo->args[7].isnull = false;
1045 fcinfo->args[8].value = arg9;
1046 fcinfo->args[8].isnull = false;
1047
1048 result = (*func) (fcinfo);
1049
1050 /* Check for null result, since caller is clearly not expecting one */
1051 if (fcinfo->isnull)
1052 elog(ERROR, "function %p returned NULL", (void *) func);
1053
1054 return result;
1055}
1056
1057/*
1058 * These functions work like the DirectFunctionCall functions except that
1059 * they use the flinfo parameter to initialise the fcinfo for the call.
1060 * It's recommended that the callee only use the fn_extra and fn_mcxt
1061 * fields, as other fields will typically describe the calling function
1062 * not the callee. Conversely, the calling function should not have
1063 * used fn_extra, unless its use is known to be compatible with the callee's.
1064 */
1065
1066Datum
1068{
1069 LOCAL_FCINFO(fcinfo, 1);
1070 Datum result;
1071
1072 InitFunctionCallInfoData(*fcinfo, flinfo, 1, collation, NULL, NULL);
1073
1074 fcinfo->args[0].value = arg1;
1075 fcinfo->args[0].isnull = false;
1076
1077 result = (*func) (fcinfo);
1078
1079 /* Check for null result, since caller is clearly not expecting one */
1080 if (fcinfo->isnull)
1081 elog(ERROR, "function %p returned NULL", (void *) func);
1082
1083 return result;
1084}
1085
1086Datum
1088{
1089 LOCAL_FCINFO(fcinfo, 2);
1090 Datum result;
1091
1092 InitFunctionCallInfoData(*fcinfo, flinfo, 2, collation, NULL, NULL);
1093
1094 fcinfo->args[0].value = arg1;
1095 fcinfo->args[0].isnull = false;
1096 fcinfo->args[1].value = arg2;
1097 fcinfo->args[1].isnull = false;
1098
1099 result = (*func) (fcinfo);
1100
1101 /* Check for null result, since caller is clearly not expecting one */
1102 if (fcinfo->isnull)
1103 elog(ERROR, "function %p returned NULL", (void *) func);
1104
1105 return result;
1106}
1107
1108/*
1109 * These are for invocation of a previously-looked-up function with a
1110 * directly-computed parameter list. Note that neither arguments nor result
1111 * are allowed to be NULL.
1112 */
1113Datum
1115{
1116 LOCAL_FCINFO(fcinfo, 0);
1117 Datum result;
1118
1119 InitFunctionCallInfoData(*fcinfo, flinfo, 0, collation, NULL, NULL);
1120
1121 result = FunctionCallInvoke(fcinfo);
1122
1123 /* Check for null result, since caller is clearly not expecting one */
1124 if (fcinfo->isnull)
1125 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1126
1127 return result;
1128}
1129
1130Datum
1132{
1133 LOCAL_FCINFO(fcinfo, 1);
1134 Datum result;
1135
1136 InitFunctionCallInfoData(*fcinfo, flinfo, 1, collation, NULL, NULL);
1137
1138 fcinfo->args[0].value = arg1;
1139 fcinfo->args[0].isnull = false;
1140
1141 result = FunctionCallInvoke(fcinfo);
1142
1143 /* Check for null result, since caller is clearly not expecting one */
1144 if (fcinfo->isnull)
1145 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1146
1147 return result;
1148}
1149
1150Datum
1152{
1153 LOCAL_FCINFO(fcinfo, 2);
1154 Datum result;
1155
1156 InitFunctionCallInfoData(*fcinfo, flinfo, 2, collation, NULL, NULL);
1157
1158 fcinfo->args[0].value = arg1;
1159 fcinfo->args[0].isnull = false;
1160 fcinfo->args[1].value = arg2;
1161 fcinfo->args[1].isnull = false;
1162
1163 result = FunctionCallInvoke(fcinfo);
1164
1165 /* Check for null result, since caller is clearly not expecting one */
1166 if (fcinfo->isnull)
1167 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1168
1169 return result;
1170}
1171
1172Datum
1174 Datum arg3)
1175{
1176 LOCAL_FCINFO(fcinfo, 3);
1177 Datum result;
1178
1179 InitFunctionCallInfoData(*fcinfo, flinfo, 3, collation, NULL, NULL);
1180
1181 fcinfo->args[0].value = arg1;
1182 fcinfo->args[0].isnull = false;
1183 fcinfo->args[1].value = arg2;
1184 fcinfo->args[1].isnull = false;
1185 fcinfo->args[2].value = arg3;
1186 fcinfo->args[2].isnull = false;
1187
1188 result = FunctionCallInvoke(fcinfo);
1189
1190 /* Check for null result, since caller is clearly not expecting one */
1191 if (fcinfo->isnull)
1192 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1193
1194 return result;
1195}
1196
1197Datum
1200{
1201 LOCAL_FCINFO(fcinfo, 4);
1202 Datum result;
1203
1204 InitFunctionCallInfoData(*fcinfo, flinfo, 4, collation, NULL, NULL);
1205
1206 fcinfo->args[0].value = arg1;
1207 fcinfo->args[0].isnull = false;
1208 fcinfo->args[1].value = arg2;
1209 fcinfo->args[1].isnull = false;
1210 fcinfo->args[2].value = arg3;
1211 fcinfo->args[2].isnull = false;
1212 fcinfo->args[3].value = arg4;
1213 fcinfo->args[3].isnull = false;
1214
1215 result = FunctionCallInvoke(fcinfo);
1216
1217 /* Check for null result, since caller is clearly not expecting one */
1218 if (fcinfo->isnull)
1219 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1220
1221 return result;
1222}
1223
1224Datum
1227{
1228 LOCAL_FCINFO(fcinfo, 5);
1229 Datum result;
1230
1231 InitFunctionCallInfoData(*fcinfo, flinfo, 5, collation, NULL, NULL);
1232
1233 fcinfo->args[0].value = arg1;
1234 fcinfo->args[0].isnull = false;
1235 fcinfo->args[1].value = arg2;
1236 fcinfo->args[1].isnull = false;
1237 fcinfo->args[2].value = arg3;
1238 fcinfo->args[2].isnull = false;
1239 fcinfo->args[3].value = arg4;
1240 fcinfo->args[3].isnull = false;
1241 fcinfo->args[4].value = arg5;
1242 fcinfo->args[4].isnull = false;
1243
1244 result = FunctionCallInvoke(fcinfo);
1245
1246 /* Check for null result, since caller is clearly not expecting one */
1247 if (fcinfo->isnull)
1248 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1249
1250 return result;
1251}
1252
1253Datum
1256 Datum arg6)
1257{
1258 LOCAL_FCINFO(fcinfo, 6);
1259 Datum result;
1260
1261 InitFunctionCallInfoData(*fcinfo, flinfo, 6, collation, NULL, NULL);
1262
1263 fcinfo->args[0].value = arg1;
1264 fcinfo->args[0].isnull = false;
1265 fcinfo->args[1].value = arg2;
1266 fcinfo->args[1].isnull = false;
1267 fcinfo->args[2].value = arg3;
1268 fcinfo->args[2].isnull = false;
1269 fcinfo->args[3].value = arg4;
1270 fcinfo->args[3].isnull = false;
1271 fcinfo->args[4].value = arg5;
1272 fcinfo->args[4].isnull = false;
1273 fcinfo->args[5].value = arg6;
1274 fcinfo->args[5].isnull = false;
1275
1276 result = FunctionCallInvoke(fcinfo);
1277
1278 /* Check for null result, since caller is clearly not expecting one */
1279 if (fcinfo->isnull)
1280 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1281
1282 return result;
1283}
1284
1285Datum
1289{
1290 LOCAL_FCINFO(fcinfo, 7);
1291 Datum result;
1292
1293 InitFunctionCallInfoData(*fcinfo, flinfo, 7, collation, NULL, NULL);
1294
1295 fcinfo->args[0].value = arg1;
1296 fcinfo->args[0].isnull = false;
1297 fcinfo->args[1].value = arg2;
1298 fcinfo->args[1].isnull = false;
1299 fcinfo->args[2].value = arg3;
1300 fcinfo->args[2].isnull = false;
1301 fcinfo->args[3].value = arg4;
1302 fcinfo->args[3].isnull = false;
1303 fcinfo->args[4].value = arg5;
1304 fcinfo->args[4].isnull = false;
1305 fcinfo->args[5].value = arg6;
1306 fcinfo->args[5].isnull = false;
1307 fcinfo->args[6].value = arg7;
1308 fcinfo->args[6].isnull = false;
1309
1310 result = FunctionCallInvoke(fcinfo);
1311
1312 /* Check for null result, since caller is clearly not expecting one */
1313 if (fcinfo->isnull)
1314 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1315
1316 return result;
1317}
1318
1319Datum
1323{
1324 LOCAL_FCINFO(fcinfo, 8);
1325 Datum result;
1326
1327 InitFunctionCallInfoData(*fcinfo, flinfo, 8, collation, NULL, NULL);
1328
1329 fcinfo->args[0].value = arg1;
1330 fcinfo->args[0].isnull = false;
1331 fcinfo->args[1].value = arg2;
1332 fcinfo->args[1].isnull = false;
1333 fcinfo->args[2].value = arg3;
1334 fcinfo->args[2].isnull = false;
1335 fcinfo->args[3].value = arg4;
1336 fcinfo->args[3].isnull = false;
1337 fcinfo->args[4].value = arg5;
1338 fcinfo->args[4].isnull = false;
1339 fcinfo->args[5].value = arg6;
1340 fcinfo->args[5].isnull = false;
1341 fcinfo->args[6].value = arg7;
1342 fcinfo->args[6].isnull = false;
1343 fcinfo->args[7].value = arg8;
1344 fcinfo->args[7].isnull = false;
1345
1346 result = FunctionCallInvoke(fcinfo);
1347
1348 /* Check for null result, since caller is clearly not expecting one */
1349 if (fcinfo->isnull)
1350 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1351
1352 return result;
1353}
1354
1355Datum
1359 Datum arg9)
1360{
1361 LOCAL_FCINFO(fcinfo, 9);
1362 Datum result;
1363
1364 InitFunctionCallInfoData(*fcinfo, flinfo, 9, collation, NULL, NULL);
1365
1366 fcinfo->args[0].value = arg1;
1367 fcinfo->args[0].isnull = false;
1368 fcinfo->args[1].value = arg2;
1369 fcinfo->args[1].isnull = false;
1370 fcinfo->args[2].value = arg3;
1371 fcinfo->args[2].isnull = false;
1372 fcinfo->args[3].value = arg4;
1373 fcinfo->args[3].isnull = false;
1374 fcinfo->args[4].value = arg5;
1375 fcinfo->args[4].isnull = false;
1376 fcinfo->args[5].value = arg6;
1377 fcinfo->args[5].isnull = false;
1378 fcinfo->args[6].value = arg7;
1379 fcinfo->args[6].isnull = false;
1380 fcinfo->args[7].value = arg8;
1381 fcinfo->args[7].isnull = false;
1382 fcinfo->args[8].value = arg9;
1383 fcinfo->args[8].isnull = false;
1384
1385 result = FunctionCallInvoke(fcinfo);
1386
1387 /* Check for null result, since caller is clearly not expecting one */
1388 if (fcinfo->isnull)
1389 elog(ERROR, "function %u returned NULL", flinfo->fn_oid);
1390
1391 return result;
1392}
1393
1394
1395/*
1396 * These are for invocation of a function identified by OID with a
1397 * directly-computed parameter list. Note that neither arguments nor result
1398 * are allowed to be NULL. These are essentially fmgr_info() followed
1399 * by FunctionCallN(). If the same function is to be invoked repeatedly,
1400 * do the fmgr_info() once and then use FunctionCallN().
1401 */
1402Datum
1404{
1406
1408
1409 return FunctionCall0Coll(&flinfo, collation);
1410}
1411
1412Datum
1414{
1416
1418
1419 return FunctionCall1Coll(&flinfo, collation, arg1);
1420}
1421
1422Datum
1424{
1426
1428
1429 return FunctionCall2Coll(&flinfo, collation, arg1, arg2);
1430}
1431
1432Datum
1434 Datum arg3)
1435{
1437
1439
1440 return FunctionCall3Coll(&flinfo, collation, arg1, arg2, arg3);
1441}
1442
1443Datum
1446{
1448
1450
1451 return FunctionCall4Coll(&flinfo, collation, arg1, arg2, arg3, arg4);
1452}
1453
1454Datum
1457{
1459
1461
1462 return FunctionCall5Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5);
1463}
1464
1465Datum
1468 Datum arg6)
1469{
1471
1473
1474 return FunctionCall6Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
1475 arg6);
1476}
1477
1478Datum
1482{
1484
1486
1487 return FunctionCall7Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
1488 arg6, arg7);
1489}
1490
1491Datum
1495{
1497
1499
1500 return FunctionCall8Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
1501 arg6, arg7, arg8);
1502}
1503
1504Datum
1508 Datum arg9)
1509{
1511
1513
1514 return FunctionCall9Coll(&flinfo, collation, arg1, arg2, arg3, arg4, arg5,
1515 arg6, arg7, arg8, arg9);
1516}
1517
1518
1519/*
1520 * Special cases for convenient invocation of datatype I/O functions.
1521 */
1522
1523/*
1524 * Call a previously-looked-up datatype input function.
1525 *
1526 * "str" may be NULL to indicate we are reading a NULL. In this case
1527 * the caller should assume the result is NULL, but we'll call the input
1528 * function anyway if it's not strict. So this is almost but not quite
1529 * the same as FunctionCall3.
1530 */
1531Datum
1532InputFunctionCall(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod)
1533{
1534 LOCAL_FCINFO(fcinfo, 3);
1535 Datum result;
1536
1537 if (str == NULL && flinfo->fn_strict)
1538 return (Datum) 0; /* just return null result */
1539
1541
1542 fcinfo->args[0].value = CStringGetDatum(str);
1543 fcinfo->args[0].isnull = false;
1544 fcinfo->args[1].value = ObjectIdGetDatum(typioparam);
1545 fcinfo->args[1].isnull = false;
1546 fcinfo->args[2].value = Int32GetDatum(typmod);
1547 fcinfo->args[2].isnull = false;
1548
1549 result = FunctionCallInvoke(fcinfo);
1550
1551 /* Should get null result if and only if str is NULL */
1552 if (str == NULL)
1553 {
1554 if (!fcinfo->isnull)
1555 elog(ERROR, "input function %u returned non-NULL",
1556 flinfo->fn_oid);
1557 }
1558 else
1559 {
1560 if (fcinfo->isnull)
1561 elog(ERROR, "input function %u returned NULL",
1562 flinfo->fn_oid);
1563 }
1564
1565 return result;
1566}
1567
1568/*
1569 * Call a previously-looked-up datatype input function, with non-exception
1570 * handling of "soft" errors.
1571 *
1572 * This is basically like InputFunctionCall, but the converted Datum is
1573 * returned into *result while the function result is true for success or
1574 * false for failure. Also, the caller may pass an ErrorSaveContext node.
1575 *
1576 * If escontext points to an ErrorSaveContext, any "soft" errors detected by
1577 * the input function will be reported by filling the escontext struct and
1578 * returning false. (The caller can choose to test SOFT_ERROR_OCCURRED(),
1579 * but checking the function result instead is usually cheaper.)
1580 *
1581 * If escontext does not point to an ErrorSaveContext, errors are reported
1582 * via ereport(ERROR), so that there is no functional difference from
1583 * InputFunctionCall; the result will always be true if control returns.
1584 */
1585bool
1587 Oid typioparam, int32 typmod,
1588 Node *escontext,
1589 Datum *result)
1590{
1591 LOCAL_FCINFO(fcinfo, 3);
1592
1593 if (str == NULL && flinfo->fn_strict)
1594 {
1595 *result = (Datum) 0; /* just return null result */
1596 return true;
1597 }
1598
1599 InitFunctionCallInfoData(*fcinfo, flinfo, 3, InvalidOid, escontext, NULL);
1600
1601 fcinfo->args[0].value = CStringGetDatum(str);
1602 fcinfo->args[0].isnull = false;
1603 fcinfo->args[1].value = ObjectIdGetDatum(typioparam);
1604 fcinfo->args[1].isnull = false;
1605 fcinfo->args[2].value = Int32GetDatum(typmod);
1606 fcinfo->args[2].isnull = false;
1607
1608 *result = FunctionCallInvoke(fcinfo);
1609
1610 /* Result value is garbage, and could be null, if an error was reported */
1611 if (SOFT_ERROR_OCCURRED(escontext))
1612 return false;
1613
1614 /* Otherwise, should get null result if and only if str is NULL */
1615 if (str == NULL)
1616 {
1617 if (!fcinfo->isnull)
1618 elog(ERROR, "input function %u returned non-NULL",
1619 flinfo->fn_oid);
1620 }
1621 else
1622 {
1623 if (fcinfo->isnull)
1624 elog(ERROR, "input function %u returned NULL",
1625 flinfo->fn_oid);
1626 }
1627
1628 return true;
1629}
1630
1631/*
1632 * Call a directly-named datatype input function, with non-exception
1633 * handling of "soft" errors.
1634 *
1635 * This is like InputFunctionCallSafe, except that it is given a direct
1636 * pointer to the C function to call. We assume that that function is
1637 * strict. Also, the function cannot be one that needs to
1638 * look at FmgrInfo, since there won't be any.
1639 */
1640bool
1642 Oid typioparam, int32 typmod,
1643 Node *escontext,
1644 Datum *result)
1645{
1646 LOCAL_FCINFO(fcinfo, 3);
1647
1648 if (str == NULL)
1649 {
1650 *result = (Datum) 0; /* just return null result */
1651 return true;
1652 }
1653
1654 InitFunctionCallInfoData(*fcinfo, NULL, 3, InvalidOid, escontext, NULL);
1655
1656 fcinfo->args[0].value = CStringGetDatum(str);
1657 fcinfo->args[0].isnull = false;
1658 fcinfo->args[1].value = ObjectIdGetDatum(typioparam);
1659 fcinfo->args[1].isnull = false;
1660 fcinfo->args[2].value = Int32GetDatum(typmod);
1661 fcinfo->args[2].isnull = false;
1662
1663 *result = (*func) (fcinfo);
1664
1665 /* Result value is garbage, and could be null, if an error was reported */
1666 if (SOFT_ERROR_OCCURRED(escontext))
1667 return false;
1668
1669 /* Otherwise, shouldn't get null result */
1670 if (fcinfo->isnull)
1671 elog(ERROR, "input function %p returned NULL", (void *) func);
1672
1673 return true;
1674}
1675
1676/*
1677 * Call a previously-looked-up datatype output function.
1678 *
1679 * Do not call this on NULL datums.
1680 *
1681 * This is currently little more than window dressing for FunctionCall1.
1682 */
1683char *
1688
1689/*
1690 * Call a previously-looked-up datatype binary-input function.
1691 *
1692 * "buf" may be NULL to indicate we are reading a NULL. In this case
1693 * the caller should assume the result is NULL, but we'll call the receive
1694 * function anyway if it's not strict. So this is almost but not quite
1695 * the same as FunctionCall3.
1696 */
1697Datum
1699 Oid typioparam, int32 typmod)
1700{
1701 LOCAL_FCINFO(fcinfo, 3);
1702 Datum result;
1703
1704 if (buf == NULL && flinfo->fn_strict)
1705 return (Datum) 0; /* just return null result */
1706
1708
1709 fcinfo->args[0].value = PointerGetDatum(buf);
1710 fcinfo->args[0].isnull = false;
1711 fcinfo->args[1].value = ObjectIdGetDatum(typioparam);
1712 fcinfo->args[1].isnull = false;
1713 fcinfo->args[2].value = Int32GetDatum(typmod);
1714 fcinfo->args[2].isnull = false;
1715
1716 result = FunctionCallInvoke(fcinfo);
1717
1718 /* Should get null result if and only if buf is NULL */
1719 if (buf == NULL)
1720 {
1721 if (!fcinfo->isnull)
1722 elog(ERROR, "receive function %u returned non-NULL",
1723 flinfo->fn_oid);
1724 }
1725 else
1726 {
1727 if (fcinfo->isnull)
1728 elog(ERROR, "receive function %u returned NULL",
1729 flinfo->fn_oid);
1730 }
1731
1732 return result;
1733}
1734
1735/*
1736 * Call a previously-looked-up datatype binary-output function.
1737 *
1738 * Do not call this on NULL datums.
1739 *
1740 * This is little more than window dressing for FunctionCall1, but it does
1741 * guarantee a non-toasted result, which strictly speaking the underlying
1742 * function doesn't.
1743 */
1744bytea *
1749
1750/*
1751 * As above, for I/O functions identified by OID. These are only to be used
1752 * in seldom-executed code paths. They are not only slow but leak memory.
1753 */
1754Datum
1755OidInputFunctionCall(Oid functionId, char *str, Oid typioparam, int32 typmod)
1756{
1758
1760 return InputFunctionCall(&flinfo, str, typioparam, typmod);
1761}
1762
1763char *
1771
1772Datum
1774 Oid typioparam, int32 typmod)
1775{
1777
1779 return ReceiveFunctionCall(&flinfo, buf, typioparam, typmod);
1780}
1781
1782bytea *
1790
1791
1792/*-------------------------------------------------------------------------
1793 * Support routines for toastable datatypes
1794 *-------------------------------------------------------------------------
1795 */
1796
1797varlena *
1799{
1800 if (VARATT_IS_EXTENDED(datum))
1801 return detoast_attr(datum);
1802 else
1803 return datum;
1804}
1805
1806varlena *
1808{
1809 if (VARATT_IS_EXTENDED(datum))
1810 return detoast_attr(datum);
1811 else
1812 {
1813 /* Make a modifiable copy of the varlena object */
1814 Size len = VARSIZE(datum);
1815 varlena *result = (varlena *) palloc(len);
1816
1817 memcpy(result, datum, len);
1818 return result;
1819 }
1820}
1821
1822varlena *
1824{
1825 /* Only get the specified portion from the toast rel */
1826 return detoast_attr_slice(datum, first, count);
1827}
1828
1829varlena *
1831{
1832 if (VARATT_IS_COMPRESSED(datum) || VARATT_IS_EXTERNAL(datum))
1833 return detoast_attr(datum);
1834 else
1835 return datum;
1836}
1837
1838/*-------------------------------------------------------------------------
1839 * Support routines for extracting info from fn_expr parse tree
1840 *
1841 * These are needed by polymorphic functions, which accept multiple possible
1842 * input types and need help from the parser to know what they've got.
1843 * Also, some functions might be interested in whether a parameter is constant.
1844 * Functions taking VARIADIC ANY also need to know about the VARIADIC keyword.
1845 *-------------------------------------------------------------------------
1846 */
1847
1848/*
1849 * Get the actual type OID of the function return type
1850 *
1851 * Returns InvalidOid if information is not available
1852 */
1853Oid
1855{
1856 Node *expr;
1857
1858 /*
1859 * can't return anything useful if we have no FmgrInfo or if its fn_expr
1860 * node has not been initialized
1861 */
1862 if (!flinfo || !flinfo->fn_expr)
1863 return InvalidOid;
1864
1865 expr = flinfo->fn_expr;
1866
1867 return exprType(expr);
1868}
1869
1870/*
1871 * Get the actual type OID of a specific function argument (counting from 0)
1872 *
1873 * Returns InvalidOid if information is not available
1874 */
1875Oid
1877{
1878 /*
1879 * can't return anything useful if we have no FmgrInfo or if its fn_expr
1880 * node has not been initialized
1881 */
1882 if (!flinfo || !flinfo->fn_expr)
1883 return InvalidOid;
1884
1886}
1887
1888/*
1889 * Get the actual type OID of a specific function argument (counting from 0),
1890 * but working from the calling expression tree instead of FmgrInfo
1891 *
1892 * Returns InvalidOid if information is not available
1893 */
1894Oid
1896{
1897 List *args;
1898 Oid argtype;
1899
1900 if (expr == NULL)
1901 return InvalidOid;
1902
1903 if (IsA(expr, FuncExpr))
1904 args = ((FuncExpr *) expr)->args;
1905 else if (IsA(expr, OpExpr))
1906 args = ((OpExpr *) expr)->args;
1907 else if (IsA(expr, DistinctExpr))
1908 args = ((DistinctExpr *) expr)->args;
1909 else if (IsA(expr, ScalarArrayOpExpr))
1910 args = ((ScalarArrayOpExpr *) expr)->args;
1911 else if (IsA(expr, NullIfExpr))
1912 args = ((NullIfExpr *) expr)->args;
1913 else if (IsA(expr, WindowFunc))
1914 args = ((WindowFunc *) expr)->args;
1915 else
1916 return InvalidOid;
1917
1919 return InvalidOid;
1920
1921 argtype = exprType((Node *) list_nth(args, argnum));
1922
1923 /*
1924 * special hack for ScalarArrayOpExpr: what the underlying function will
1925 * actually get passed is the element type of the array.
1926 */
1927 if (IsA(expr, ScalarArrayOpExpr) &&
1928 argnum == 1)
1929 argtype = get_base_element_type(argtype);
1930
1931 return argtype;
1932}
1933
1934/*
1935 * Find out whether a specific function argument is constant for the
1936 * duration of a query
1937 *
1938 * Returns false if information is not available
1939 */
1940bool
1942{
1943 /*
1944 * can't return anything useful if we have no FmgrInfo or if its fn_expr
1945 * node has not been initialized
1946 */
1947 if (!flinfo || !flinfo->fn_expr)
1948 return false;
1949
1951}
1952
1953/*
1954 * Find out whether a specific function argument is constant for the
1955 * duration of a query, but working from the calling expression tree
1956 *
1957 * Returns false if information is not available
1958 */
1959bool
1961{
1962 List *args;
1963 Node *arg;
1964
1965 if (expr == NULL)
1966 return false;
1967
1968 if (IsA(expr, FuncExpr))
1969 args = ((FuncExpr *) expr)->args;
1970 else if (IsA(expr, OpExpr))
1971 args = ((OpExpr *) expr)->args;
1972 else if (IsA(expr, DistinctExpr))
1973 args = ((DistinctExpr *) expr)->args;
1974 else if (IsA(expr, ScalarArrayOpExpr))
1975 args = ((ScalarArrayOpExpr *) expr)->args;
1976 else if (IsA(expr, NullIfExpr))
1977 args = ((NullIfExpr *) expr)->args;
1978 else if (IsA(expr, WindowFunc))
1979 args = ((WindowFunc *) expr)->args;
1980 else
1981 return false;
1982
1984 return false;
1985
1986 arg = (Node *) list_nth(args, argnum);
1987
1988 /*
1989 * Either a true Const or an external Param will have a value that doesn't
1990 * change during the execution of the query. In future we might want to
1991 * consider other cases too, e.g. now().
1992 */
1993 if (IsA(arg, Const))
1994 return true;
1995 if (IsA(arg, Param) &&
1996 ((Param *) arg)->paramkind == PARAM_EXTERN)
1997 return true;
1998
1999 return false;
2000}
2001
2002/*
2003 * Get the VARIADIC flag from the function invocation
2004 *
2005 * Returns false (the default assumption) if information is not available
2006 *
2007 * Note this is generally only of interest to VARIADIC ANY functions
2008 */
2009bool
2011{
2012 Node *expr;
2013
2014 /*
2015 * can't return anything useful if we have no FmgrInfo or if its fn_expr
2016 * node has not been initialized
2017 */
2018 if (!flinfo || !flinfo->fn_expr)
2019 return false;
2020
2021 expr = flinfo->fn_expr;
2022
2023 if (IsA(expr, FuncExpr))
2024 return ((FuncExpr *) expr)->funcvariadic;
2025 else
2026 return false;
2027}
2028
2029/*
2030 * Set options to FmgrInfo of opclass support function.
2031 *
2032 * Opclass support functions are called outside of expressions. Thanks to that
2033 * we can use fn_expr to store opclass options as bytea constant.
2034 */
2035void
2042
2043/*
2044 * Check if options are defined for opclass support function.
2045 */
2046bool
2048{
2049 if (flinfo && flinfo->fn_expr && IsA(flinfo->fn_expr, Const))
2050 {
2051 Const *expr = (Const *) flinfo->fn_expr;
2052
2053 if (expr->consttype == BYTEAOID)
2054 return !expr->constisnull;
2055 }
2056 return false;
2057}
2058
2059/*
2060 * Get options for opclass support function.
2061 */
2062bytea *
2064{
2065 if (flinfo && flinfo->fn_expr && IsA(flinfo->fn_expr, Const))
2066 {
2067 Const *expr = (Const *) flinfo->fn_expr;
2068
2069 if (expr->consttype == BYTEAOID)
2070 return expr->constisnull ? NULL : DatumGetByteaP(expr->constvalue);
2071 }
2072
2073 ereport(ERROR,
2075 errmsg("operator class options info is absent in function call context")));
2076
2077 return NULL;
2078}
2079
2080/*-------------------------------------------------------------------------
2081 * Support routines for procedural language implementations
2082 *-------------------------------------------------------------------------
2083 */
2084
2085/*
2086 * Verify that a validator is actually associated with the language of a
2087 * particular function and that the user has access to both the language and
2088 * the function. All validators should call this before doing anything
2089 * substantial. Doing so ensures a user cannot achieve anything with explicit
2090 * calls to validators that he could not achieve with CREATE FUNCTION or by
2091 * simply calling an existing function.
2092 *
2093 * When this function returns false, callers should skip all validation work
2094 * and call PG_RETURN_VOID(). This never happens at present; it is reserved
2095 * for future expansion.
2096 *
2097 * In particular, checking that the validator corresponds to the function's
2098 * language allows untrusted language validators to assume they process only
2099 * superuser-chosen source code. (Untrusted language call handlers, by
2100 * definition, do assume that.) A user lacking the USAGE language privilege
2101 * would be unable to reach the validator through CREATE FUNCTION, so we check
2102 * that to block explicit calls as well. Checking the EXECUTE privilege on
2103 * the function is often superfluous, because most users can clone the
2104 * function to get an executable copy. It is meaningful against users with no
2105 * database TEMP right and no permanent schema CREATE right, thereby unable to
2106 * create any function. Also, if the function tracks persistent state by
2107 * function OID or name, validating the original function might permit more
2108 * mischief than creating and validating a clone thereof.
2109 */
2110bool
2112{
2118
2119 /*
2120 * Get the function's pg_proc entry. Throw a user-facing error for bad
2121 * OID, because validators can be called with user-specified OIDs.
2122 */
2125 ereport(ERROR,
2127 errmsg("function with OID %u does not exist", functionOid)));
2129
2130 /*
2131 * Fetch pg_language entry to know if this is the correct validation
2132 * function for that pg_proc entry.
2133 */
2136 elog(ERROR, "cache lookup failed for language %u", procStruct->prolang);
2138
2139 if (langStruct->lanvalidator != validatorOid)
2140 ereport(ERROR,
2142 errmsg("language validation function %u called for language %u instead of %u",
2143 validatorOid, procStruct->prolang,
2144 langStruct->lanvalidator)));
2145
2146 /* first validate that we have permissions to use the language */
2148 ACL_USAGE);
2149 if (aclresult != ACLCHECK_OK)
2151 NameStr(langStruct->lanname));
2152
2153 /*
2154 * Check whether we are allowed to execute the function itself. If we can
2155 * execute it, there should be no possible side-effect of
2156 * compiling/validation that execution can't have.
2157 */
2159 if (aclresult != ACLCHECK_OK)
2161
2164
2165 return true;
2166}
AclResult
Definition acl.h:183
@ ACLCHECK_OK
Definition acl.h:184
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
Definition aclchk.c:2672
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
Definition aclchk.c:3879
#define DatumGetArrayTypeP(X)
Definition array.h:261
#define TextDatumGetCString(d)
Definition builtins.h:99
#define NameStr(name)
Definition c.h:837
#define PGDLLIMPORT
Definition c.h:1423
int32_t int32
Definition c.h:614
uint16_t uint16
Definition c.h:617
uint32 TransactionId
Definition c.h:738
#define OidIsValid(objectId)
Definition c.h:860
size_t Size
Definition c.h:691
varlena * detoast_attr(varlena *attr)
Definition detoast.c:116
varlena * detoast_attr_slice(varlena *attr, int32 sliceoffset, int32 slicelength)
Definition detoast.c:205
void * lookup_external_function(void *filehandle, const char *funcname)
Definition dfmgr.c:171
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
Definition dfmgr.c:95
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition dynahash.c:952
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
Definition dynahash.c:358
Datum arg
Definition elog.c:1322
int errcode(int sqlerrcode)
Definition elog.c:874
#define PG_RE_THROW()
Definition elog.h:405
int errhint(const char *fmt,...) pg_attribute_printf(1
#define PG_TRY(...)
Definition elog.h:372
#define PG_END_TRY(...)
Definition elog.h:397
#define ERROR
Definition elog.h:39
#define PG_CATCH(...)
Definition elog.h:382
#define elog(elevel,...)
Definition elog.h:226
#define ereport(elevel,...)
Definition elog.h:150
@ ExprMultipleResult
Definition execnodes.h:339
Datum FunctionCall4Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4)
Definition fmgr.c:1198
Datum OidFunctionCall2Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2)
Definition fmgr.c:1423
void set_fn_opclass_options(FmgrInfo *flinfo, bytea *options)
Definition fmgr.c:2036
Oid fmgr_internal_function(const char *proname)
Definition fmgr.c:597
Datum OidFunctionCall9Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8, Datum arg9)
Definition fmgr.c:1505
bool get_fn_expr_arg_stable(FmgrInfo *flinfo, int argnum)
Definition fmgr.c:1941
Datum OidFunctionCall6Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6)
Definition fmgr.c:1466
Datum FunctionCall6Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6)
Definition fmgr.c:1254
Datum OidFunctionCall5Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5)
Definition fmgr.c:1455
Datum FunctionCall8Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8)
Definition fmgr.c:1320
bool CheckFunctionValidatorAccess(Oid validatorOid, Oid functionOid)
Definition fmgr.c:2111
Datum OidReceiveFunctionCall(Oid functionId, StringInfo buf, Oid typioparam, int32 typmod)
Definition fmgr.c:1773
Datum InputFunctionCall(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod)
Definition fmgr.c:1532
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
Definition fmgr.c:1151
static const FmgrBuiltin * fmgr_lookupByName(const char *name)
Definition fmgr.c:103
void fmgr_info(Oid functionId, FmgrInfo *finfo)
Definition fmgr.c:129
varlena * pg_detoast_datum(varlena *datum)
Definition fmgr.c:1798
Datum OidInputFunctionCall(Oid functionId, char *str, Oid typioparam, int32 typmod)
Definition fmgr.c:1755
PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook
Definition fmgr.c:41
Datum DirectFunctionCall2Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2)
Definition fmgr.c:814
static void fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
Definition fmgr.c:351
bool DirectInputFunctionCallSafe(PGFunction func, char *str, Oid typioparam, int32 typmod, Node *escontext, Datum *result)
Definition fmgr.c:1641
varlena * pg_detoast_datum_copy(varlena *datum)
Definition fmgr.c:1807
char * OidOutputFunctionCall(Oid functionId, Datum val)
Definition fmgr.c:1764
Datum FunctionCall5Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5)
Definition fmgr.c:1225
static void fmgr_info_other_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
Definition fmgr.c:420
varlena * pg_detoast_datum_packed(varlena *datum)
Definition fmgr.c:1830
varlena * pg_detoast_datum_slice(varlena *datum, int32 first, int32 count)
Definition fmgr.c:1823
const Pg_finfo_record * fetch_finfo_record(void *filehandle, const char *funcname)
Definition fmgr.c:457
Datum OidFunctionCall3Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3)
Definition fmgr.c:1433
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
Definition fmgr.c:139
Datum OidFunctionCall8Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8)
Definition fmgr.c:1492
bytea * SendFunctionCall(FmgrInfo *flinfo, Datum val)
Definition fmgr.c:1745
Datum OidFunctionCall4Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4)
Definition fmgr.c:1444
Datum DirectFunctionCall4Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4)
Definition fmgr.c:861
Datum OidFunctionCall7Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7)
Definition fmgr.c:1479
PGDLLIMPORT fmgr_hook_type fmgr_hook
Definition fmgr.c:42
bool has_fn_opclass_options(FmgrInfo *flinfo)
Definition fmgr.c:2047
bool InputFunctionCallSafe(FmgrInfo *flinfo, char *str, Oid typioparam, int32 typmod, Node *escontext, Datum *result)
Definition fmgr.c:1586
Datum CallerFInfoFunctionCall2(PGFunction func, FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
Definition fmgr.c:1087
Datum CallerFInfoFunctionCall1(PGFunction func, FmgrInfo *flinfo, Oid collation, Datum arg1)
Definition fmgr.c:1067
Datum DirectFunctionCall6Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6)
Definition fmgr.c:917
Datum DirectFunctionCall5Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5)
Definition fmgr.c:888
static HTAB * CFuncHash
Definition fmgr.c:57
Datum OidFunctionCall1Coll(Oid functionId, Oid collation, Datum arg1)
Definition fmgr.c:1413
char * OutputFunctionCall(FmgrInfo *flinfo, Datum val)
Definition fmgr.c:1684
bool get_fn_expr_variadic(FmgrInfo *flinfo)
Definition fmgr.c:2010
Datum DirectFunctionCall1Coll(PGFunction func, Oid collation, Datum arg1)
Definition fmgr.c:794
bytea * get_fn_opclass_options(FmgrInfo *flinfo)
Definition fmgr.c:2063
Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3)
Definition fmgr.c:1173
Datum DirectFunctionCall3Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3)
Definition fmgr.c:836
Oid get_call_expr_argtype(Node *expr, int argnum)
Definition fmgr.c:1895
Datum FunctionCall7Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7)
Definition fmgr.c:1286
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
Definition fmgr.c:1876
Datum OidFunctionCall0Coll(Oid functionId, Oid collation)
Definition fmgr.c:1403
void fmgr_symbol(Oid functionId, char **mod, char **fn)
Definition fmgr.c:283
Datum DirectFunctionCall9Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8, Datum arg9)
Definition fmgr.c:1019
bytea * OidSendFunctionCall(Oid functionId, Datum val)
Definition fmgr.c:1783
Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation, Datum arg1)
Definition fmgr.c:1131
Datum fmgr_security_definer(PG_FUNCTION_ARGS)
Definition fmgr.c:634
Oid get_fn_expr_rettype(FmgrInfo *flinfo)
Definition fmgr.c:1854
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
Definition fmgr.c:582
static void record_C_func(HeapTuple procedureTuple, PGFunction user_fn, const Pg_finfo_record *inforec)
Definition fmgr.c:541
static void fmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt, bool ignore_security)
Definition fmgr.c:149
Datum FunctionCall0Coll(FmgrInfo *flinfo, Oid collation)
Definition fmgr.c:1114
Datum FunctionCall9Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8, Datum arg9)
Definition fmgr.c:1356
Datum DirectFunctionCall7Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7)
Definition fmgr.c:949
static CFuncHashTabEntry * lookup_C_func(HeapTuple procedureTuple)
Definition fmgr.c:517
static const FmgrBuiltin * fmgr_isbuiltin(Oid id)
Definition fmgr.c:78
bool get_call_expr_arg_stable(Node *expr, int argnum)
Definition fmgr.c:1960
Datum ReceiveFunctionCall(FmgrInfo *flinfo, StringInfo buf, Oid typioparam, int32 typmod)
Definition fmgr.c:1698
Datum DirectFunctionCall8Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5, Datum arg6, Datum arg7, Datum arg8)
Definition fmgr.c:983
const Pg_finfo_record *(* PGFInfoFunction)(void)
Definition fmgr.h:403
bool(* needs_fmgr_hook_type)(Oid fn_oid)
Definition fmgr.h:842
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
Definition fmgr.h:150
#define LOCAL_FCINFO(name, nargs)
Definition fmgr.h:110
@ FHET_END
Definition fmgr.h:838
@ FHET_ABORT
Definition fmgr.h:839
@ FHET_START
Definition fmgr.h:837
#define FunctionCall1(flinfo, arg1)
Definition fmgr.h:702
#define FunctionCallInvoke(fcinfo)
Definition fmgr.h:172
void(* fmgr_hook_type)(FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg)
Definition fmgr.h:844
Datum(* PGFunction)(FunctionCallInfo fcinfo)
Definition fmgr.h:40
#define FmgrHookIsNeeded(fn_oid)
Definition fmgr.h:850
#define PG_FUNCTION_ARGS
Definition fmgr.h:193
#define DatumGetByteaP(X)
Definition fmgr.h:332
PGDLLIMPORT const Oid fmgr_last_builtin_oid
PGDLLIMPORT const int fmgr_nbuiltins
PGDLLIMPORT const FmgrBuiltin fmgr_builtins[]
#define InvalidOidBuiltinMapping
Definition fmgrtab.h:46
PGDLLIMPORT const uint16 fmgr_builtin_oid_index[]
Datum fmgr_sql(PG_FUNCTION_ARGS)
Definition functions.c:1577
int NewGUCNestLevel(void)
Definition guc.c:2142
config_handle * get_config_handle(const char *name)
Definition guc.c:4180
int set_config_with_handle(const char *name, config_handle *handle, const char *value, GucContext context, GucSource source, Oid srole, GucAction action, bool changeVal, int elevel, bool is_reload)
Definition guc.c:3311
void TransformGUCArray(ArrayType *array, List **names, List **values)
Definition guc.c:6273
void AtEOXact_GUC(bool isCommit, int nestLevel)
Definition guc.c:2169
GucAction
Definition guc.h:201
@ GUC_ACTION_SAVE
Definition guc.h:205
GucSource
Definition guc.h:112
@ PGC_S_SESSION
Definition guc.h:126
GucContext
Definition guc.h:72
@ PGC_SUSET
Definition guc.h:78
@ PGC_USERSET
Definition guc.h:79
const char * str
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
Definition heaptuple.c:456
@ HASH_FIND
Definition hsearch.h:113
@ HASH_ENTER
Definition hsearch.h:114
#define HASH_ELEM
Definition hsearch.h:95
#define HASH_BLOBS
Definition hsearch.h:97
#define HeapTupleIsValid(tuple)
Definition htup.h:78
static TransactionId HeapTupleHeaderGetRawXmin(const HeapTupleHeaderData *tup)
static void * GETSTRUCT(const HeapTupleData *tuple)
#define funcname
long val
Definition informix.c:689
static struct @174 value
int i
Definition isn.c:77
bool ItemPointerEquals(const ItemPointerData *pointer1, const ItemPointerData *pointer2)
Definition itemptr.c:35
List * lappend(List *list, void *datum)
Definition list.c:339
Oid get_base_element_type(Oid typid)
Definition lsyscache.c:3054
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
Definition makefuncs.c:350
void * MemoryContextAllocZero(MemoryContext context, Size size)
Definition mcxt.c:1266
char * pstrdup(const char *in)
Definition mcxt.c:1781
void pfree(void *pointer)
Definition mcxt.c:1616
void * palloc(Size size)
Definition mcxt.c:1387
MemoryContext CurrentMemoryContext
Definition mcxt.c:160
#define SECURITY_LOCAL_USERID_CHANGE
Definition miscadmin.h:318
void GetUserIdAndSecContext(Oid *userid, int *sec_context)
Definition miscinit.c:613
Oid GetUserId(void)
Definition miscinit.c:470
void SetUserIdAndSecContext(Oid userid, int sec_context)
Definition miscinit.c:620
#define SOFT_ERROR_OCCURRED(escontext)
Definition miscnodes.h:53
Oid exprType(const Node *expr)
Definition nodeFuncs.c:42
#define IsA(nodeptr, _type_)
Definition nodes.h:164
static char * errmsg
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:124
#define ACL_USAGE
Definition parsenodes.h:84
@ OBJECT_LANGUAGE
@ OBJECT_FUNCTION
#define ACL_EXECUTE
Definition parsenodes.h:83
const void size_t len
END_CATALOG_STRUCT typedef FormData_pg_language * Form_pg_language
Definition pg_language.h:69
#define lfirst(lc)
Definition pg_list.h:172
static int list_length(const List *l)
Definition pg_list.h:152
#define NIL
Definition pg_list.h:68
#define forthree(cell1, list1, cell2, list2, cell3, list3)
Definition pg_list.h:563
static void * list_nth(const List *list, int n)
Definition pg_list.h:299
END_CATALOG_STRUCT typedef FormData_pg_proc * Form_pg_proc
Definition pg_proc.h:140
NameData proname
Definition pg_proc.h:37
static rewind_source * source
Definition pg_rewind.c:89
static char buf[DEFAULT_XLOG_SEG_SIZE]
@ TRACK_FUNC_PL
Definition pgstat.h:45
@ TRACK_FUNC_ALL
Definition pgstat.h:46
@ TRACK_FUNC_OFF
Definition pgstat.h:44
void pgstat_init_function_usage(FunctionCallInfo fcinfo, PgStat_FunctionCallUsage *fcu)
void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
static Datum PointerGetDatum(const void *X)
Definition postgres.h:342
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:252
static char * DatumGetCString(Datum X)
Definition postgres.h:355
uint64_t Datum
Definition postgres.h:70
static Datum CStringGetDatum(const char *X)
Definition postgres.h:370
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
#define InvalidOid
unsigned int Oid
static int fb(int x)
@ PARAM_EXTERN
Definition primnodes.h:385
char * psprintf(const char *fmt,...)
Definition psprintf.c:43
const Pg_finfo_record * inforec
Definition fmgr.c:54
TransactionId fn_xmin
Definition fmgr.c:51
ItemPointerData fn_tid
Definition fmgr.c:52
PGFunction user_fn
Definition fmgr.c:53
Oid consttype
Definition primnodes.h:330
void * fn_extra
Definition fmgr.h:64
short fn_nargs
Definition fmgr.h:60
PGFunction fn_addr
Definition fmgr.h:58
Node * fn_expr
Definition fmgr.h:66
unsigned char fn_stats
Definition fmgr.h:63
MemoryContext fn_mcxt
Definition fmgr.h:65
Oid fn_oid
Definition fmgr.h:59
bool fn_retset
Definition fmgr.h:62
bool fn_strict
Definition fmgr.h:61
Size keysize
Definition hsearch.h:75
Definition pg_list.h:54
Definition nodes.h:135
int api_version
Definition fmgr.h:398
Definition type.h:96
Definition c.h:778
bool superuser(void)
Definition superuser.c:47
void ReleaseSysCache(HeapTuple tuple)
Definition syscache.c:264
Datum SysCacheGetAttrNotNull(SysCacheIdentifier cacheId, HeapTuple tup, AttrNumber attributeNumber)
Definition syscache.c:625
HeapTuple SearchSysCache1(SysCacheIdentifier cacheId, Datum key1)
Definition syscache.c:220
Datum SysCacheGetAttr(SysCacheIdentifier cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition syscache.c:595
static void * fn(void *arg)
static bool VARATT_IS_EXTENDED(const void *PTR)
Definition varatt.h:410
static bool VARATT_IS_EXTERNAL(const void *PTR)
Definition varatt.h:354
static Size VARSIZE(const void *PTR)
Definition varatt.h:298
static bool VARATT_IS_COMPRESSED(const void *PTR)
Definition varatt.h:347
const char * name