LCOV - code coverage report
Current view: top level - src/include - funcapi.h (source / functions) Coverage Total Hit
Test: Code coverage Lines: 100.0 % 2 2
Test Date: 2026-01-26 10:56:24 Functions: 100.0 % 1 1
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * funcapi.h
       4              :  *        Definitions for functions which return composite type and/or sets
       5              :  *        or work on VARIADIC inputs.
       6              :  *
       7              :  * This file must be included by all Postgres modules that either define
       8              :  * or call FUNCAPI-callable functions or macros.
       9              :  *
      10              :  *
      11              :  * Copyright (c) 2002-2026, PostgreSQL Global Development Group
      12              :  *
      13              :  * src/include/funcapi.h
      14              :  *
      15              :  *-------------------------------------------------------------------------
      16              :  */
      17              : #ifndef FUNCAPI_H
      18              : #define FUNCAPI_H
      19              : 
      20              : #include "access/tupdesc.h"
      21              : #include "executor/executor.h"
      22              : #include "executor/tuptable.h"
      23              : #include "fmgr.h"
      24              : 
      25              : /*-------------------------------------------------------------------------
      26              :  *      Support to ease writing Functions returning composite types
      27              :  *-------------------------------------------------------------------------
      28              :  *
      29              :  * This struct holds arrays of individual attribute information
      30              :  * needed to create a tuple from raw C strings. It also requires
      31              :  * a copy of the TupleDesc. The information carried here
      32              :  * is derived from the TupleDesc, but it is stored here to
      33              :  * avoid redundant cpu cycles on each call to an SRF.
      34              :  */
      35              : typedef struct AttInMetadata
      36              : {
      37              :         /* full TupleDesc */
      38              :         TupleDesc       tupdesc;
      39              : 
      40              :         /* array of attribute type input function finfo */
      41              :         FmgrInfo   *attinfuncs;
      42              : 
      43              :         /* array of attribute type i/o parameter OIDs */
      44              :         Oid                *attioparams;
      45              : 
      46              :         /* array of attribute typmod */
      47              :         int32      *atttypmods;
      48              : } AttInMetadata;
      49              : 
      50              : /*-------------------------------------------------------------------------
      51              :  *              Support struct to ease writing Set Returning Functions (SRFs)
      52              :  *-------------------------------------------------------------------------
      53              :  *
      54              :  * This struct holds function context for Set Returning Functions.
      55              :  * Use fn_extra to hold a pointer to it across calls
      56              :  */
      57              : typedef struct FuncCallContext
      58              : {
      59              :         /*
      60              :          * Number of times we've been called before
      61              :          *
      62              :          * call_cntr is initialized to 0 for you by SRF_FIRSTCALL_INIT(), and
      63              :          * incremented for you every time SRF_RETURN_NEXT() is called.
      64              :          */
      65              :         uint64          call_cntr;
      66              : 
      67              :         /*
      68              :          * OPTIONAL maximum number of calls
      69              :          *
      70              :          * max_calls is here for convenience only and setting it is optional. If
      71              :          * not set, you must provide alternative means to know when the function
      72              :          * is done.
      73              :          */
      74              :         uint64          max_calls;
      75              : 
      76              :         /*
      77              :          * OPTIONAL pointer to miscellaneous user-provided context information
      78              :          *
      79              :          * user_fctx is for use as a pointer to your own struct to retain
      80              :          * arbitrary context information between calls of your function.
      81              :          */
      82              :         void       *user_fctx;
      83              : 
      84              :         /*
      85              :          * OPTIONAL pointer to struct containing attribute type input metadata
      86              :          *
      87              :          * attinmeta is for use when returning tuples (i.e. composite data types)
      88              :          * and is not used when returning base data types. It is only needed if
      89              :          * you intend to use BuildTupleFromCStrings() to create the return tuple.
      90              :          */
      91              :         AttInMetadata *attinmeta;
      92              : 
      93              :         /*
      94              :          * memory context used for structures that must live for multiple calls
      95              :          *
      96              :          * multi_call_memory_ctx is set by SRF_FIRSTCALL_INIT() for you, and used
      97              :          * by SRF_RETURN_DONE() for cleanup. It is the most appropriate memory
      98              :          * context for any memory that is to be reused across multiple calls of
      99              :          * the SRF.
     100              :          */
     101              :         MemoryContext multi_call_memory_ctx;
     102              : 
     103              :         /*
     104              :          * OPTIONAL pointer to struct containing tuple description
     105              :          *
     106              :          * tuple_desc is for use when returning tuples (i.e. composite data types)
     107              :          * and is only needed if you are going to build the tuples with
     108              :          * heap_form_tuple() rather than with BuildTupleFromCStrings(). Note that
     109              :          * the TupleDesc pointer stored here should usually have been run through
     110              :          * BlessTupleDesc() first.
     111              :          */
     112              :         TupleDesc       tuple_desc;
     113              : 
     114              : } FuncCallContext;
     115              : 
     116              : /*----------
     117              :  *      Support to ease writing functions returning composite types
     118              :  *
     119              :  * External declarations:
     120              :  * get_call_result_type:
     121              :  *              Given a function's call info record, determine the kind of datatype
     122              :  *              it is supposed to return.  If resultTypeId isn't NULL, *resultTypeId
     123              :  *              receives the actual datatype OID (this is mainly useful for scalar
     124              :  *              result types).  If resultTupleDesc isn't NULL, *resultTupleDesc
     125              :  *              receives a pointer to a TupleDesc when the result is of a composite
     126              :  *              type, or NULL when it's a scalar result or the rowtype could not be
     127              :  *              determined.  NB: the tupledesc should be copied if it is to be
     128              :  *              accessed over a long period.
     129              :  * get_expr_result_type:
     130              :  *              Given an expression node, return the same info as for
     131              :  *              get_call_result_type.  Note: the cases in which rowtypes cannot be
     132              :  *              determined are different from the cases for get_call_result_type.
     133              :  * get_func_result_type:
     134              :  *              Given only a function's OID, return the same info as for
     135              :  *              get_call_result_type.  Note: the cases in which rowtypes cannot be
     136              :  *              determined are different from the cases for get_call_result_type.
     137              :  *              Do *not* use this if you can use one of the others.
     138              :  *
     139              :  * See also get_expr_result_tupdesc(), which is a convenient wrapper around
     140              :  * get_expr_result_type() for use when the caller only cares about
     141              :  * determinable-rowtype cases.
     142              :  *----------
     143              :  */
     144              : 
     145              : /* Type categories for get_call_result_type and siblings */
     146              : typedef enum TypeFuncClass
     147              : {
     148              :         TYPEFUNC_SCALAR,                        /* scalar result type */
     149              :         TYPEFUNC_COMPOSITE,                     /* determinable rowtype result */
     150              :         TYPEFUNC_COMPOSITE_DOMAIN,      /* domain over determinable rowtype result */
     151              :         TYPEFUNC_RECORD,                        /* indeterminate rowtype result */
     152              :         TYPEFUNC_OTHER,                         /* bogus type, eg pseudotype */
     153              : } TypeFuncClass;
     154              : 
     155              : extern TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo,
     156              :                                                                                   Oid *resultTypeId,
     157              :                                                                                   TupleDesc *resultTupleDesc);
     158              : extern TypeFuncClass get_expr_result_type(Node *expr,
     159              :                                                                                   Oid *resultTypeId,
     160              :                                                                                   TupleDesc *resultTupleDesc);
     161              : extern TypeFuncClass get_func_result_type(Oid functionId,
     162              :                                                                                   Oid *resultTypeId,
     163              :                                                                                   TupleDesc *resultTupleDesc);
     164              : 
     165              : extern TupleDesc get_expr_result_tupdesc(Node *expr, bool noError);
     166              : 
     167              : extern bool resolve_polymorphic_argtypes(int numargs, Oid *argtypes,
     168              :                                                                                  char *argmodes,
     169              :                                                                                  Node *call_expr);
     170              : 
     171              : extern int      get_func_arg_info(HeapTuple procTup,
     172              :                                                           Oid **p_argtypes, char ***p_argnames,
     173              :                                                           char **p_argmodes);
     174              : 
     175              : extern int      get_func_input_arg_names(Datum proargnames, Datum proargmodes,
     176              :                                                                          char ***arg_names);
     177              : 
     178              : extern int      get_func_trftypes(HeapTuple procTup, Oid **p_trftypes);
     179              : extern char *get_func_result_name(Oid functionId);
     180              : 
     181              : extern TupleDesc build_function_result_tupdesc_d(char prokind,
     182              :                                                                                                  Datum proallargtypes,
     183              :                                                                                                  Datum proargmodes,
     184              :                                                                                                  Datum proargnames);
     185              : extern TupleDesc build_function_result_tupdesc_t(HeapTuple procTuple);
     186              : 
     187              : 
     188              : /*----------
     189              :  *      Support to ease writing functions returning composite types
     190              :  *
     191              :  * External declarations:
     192              :  * TupleDesc BlessTupleDesc(TupleDesc tupdesc) - "Bless" a completed tuple
     193              :  *              descriptor so that it can be used to return properly labeled tuples.
     194              :  *              You need to call this if you are going to use heap_form_tuple directly.
     195              :  *              TupleDescGetAttInMetadata does it for you, however, so no need to call
     196              :  *              it if you call TupleDescGetAttInMetadata.
     197              :  * AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc) - Build an
     198              :  *              AttInMetadata struct based on the given TupleDesc. AttInMetadata can
     199              :  *              be used in conjunction with C strings to produce a properly formed
     200              :  *              tuple.
     201              :  * HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values) -
     202              :  *              build a HeapTuple given user data in C string form. values is an array
     203              :  *              of C strings, one for each attribute of the return tuple.
     204              :  * Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple) - convert a
     205              :  *              HeapTupleHeader to a Datum.
     206              :  *
     207              :  * Inline declarations:
     208              :  * HeapTupleGetDatum(HeapTuple tuple) - convert a HeapTuple to a Datum.
     209              :  *
     210              :  * Obsolete routines and macros:
     211              :  * TupleDesc RelationNameGetTupleDesc(const char *relname) - Use to get a
     212              :  *              TupleDesc based on a named relation.
     213              :  * TupleDesc TypeGetTupleDesc(Oid typeoid, List *colaliases) - Use to get a
     214              :  *              TupleDesc based on a type OID.
     215              :  * TupleGetDatum(TupleTableSlot *slot, HeapTuple tuple) - get a Datum
     216              :  *              given a tuple and a slot.
     217              :  *----------
     218              :  */
     219              : 
     220              : extern TupleDesc RelationNameGetTupleDesc(const char *relname);
     221              : extern TupleDesc TypeGetTupleDesc(Oid typeoid, List *colaliases);
     222              : 
     223              : /* from execTuples.c */
     224              : extern TupleDesc BlessTupleDesc(TupleDesc tupdesc);
     225              : extern AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc);
     226              : extern HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values);
     227              : extern Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple);
     228              : 
     229              : static inline Datum
     230        30688 : HeapTupleGetDatum(const HeapTupleData *tuple)
     231              : {
     232        30688 :         return HeapTupleHeaderGetDatum(tuple->t_data);
     233              : }
     234              : 
     235              : /* obsolete version of above */
     236              : #define TupleGetDatum(_slot, _tuple)    HeapTupleGetDatum(_tuple)
     237              : 
     238              : 
     239              : /*----------
     240              :  *              Support for Set Returning Functions (SRFs)
     241              :  *
     242              :  * The basic API for SRFs using ValuePerCall mode looks something like this:
     243              :  *
     244              :  * Datum
     245              :  * my_Set_Returning_Function(PG_FUNCTION_ARGS)
     246              :  * {
     247              :  *      FuncCallContext    *funcctx;
     248              :  *      Datum                           result;
     249              :  *      MemoryContext           oldcontext;
     250              :  *      <user defined declarations>
     251              :  *
     252              :  *      if (SRF_IS_FIRSTCALL())
     253              :  *      {
     254              :  *              funcctx = SRF_FIRSTCALL_INIT();
     255              :  *              // switch context when allocating stuff to be used in later calls
     256              :  *              oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
     257              :  *              <user defined code>
     258              :  *              <if returning composite>
     259              :  *                      <build TupleDesc, and perhaps AttInMetadata>
     260              :  *              <endif returning composite>
     261              :  *              <user defined code>
     262              :  *              // return to original context when allocating transient memory
     263              :  *              MemoryContextSwitchTo(oldcontext);
     264              :  *      }
     265              :  *      <user defined code>
     266              :  *      funcctx = SRF_PERCALL_SETUP();
     267              :  *      <user defined code>
     268              :  *
     269              :  *      if (funcctx->call_cntr < funcctx->max_calls)
     270              :  *      {
     271              :  *              <user defined code>
     272              :  *              <obtain result Datum>
     273              :  *              SRF_RETURN_NEXT(funcctx, result);
     274              :  *      }
     275              :  *      else
     276              :  *              SRF_RETURN_DONE(funcctx);
     277              :  * }
     278              :  *
     279              :  * NOTE: there is no guarantee that a SRF using ValuePerCall mode will be
     280              :  * run to completion; for example, a query with LIMIT might stop short of
     281              :  * fetching all the rows.  Therefore, do not expect that you can do resource
     282              :  * cleanup just before SRF_RETURN_DONE().  You need not worry about releasing
     283              :  * memory allocated in multi_call_memory_ctx, but holding file descriptors or
     284              :  * other non-memory resources open across calls is a bug.  SRFs that need
     285              :  * such resources should not use these macros, but instead populate a
     286              :  * tuplestore during a single call, as set up by InitMaterializedSRF() (see
     287              :  * fmgr/README).  Alternatively, set up a callback to release resources
     288              :  * at query shutdown, using RegisterExprContextCallback().
     289              :  *
     290              :  *----------
     291              :  */
     292              : 
     293              : /* from funcapi.c */
     294              : 
     295              : /* flag bits for InitMaterializedSRF() */
     296              : #define MAT_SRF_USE_EXPECTED_DESC       0x01    /* use expectedDesc as tupdesc. */
     297              : #define MAT_SRF_BLESS                           0x02    /* "Bless" a tuple descriptor with
     298              :                                                                                          * BlessTupleDesc(). */
     299              : extern void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags);
     300              : 
     301              : extern FuncCallContext *init_MultiFuncCall(PG_FUNCTION_ARGS);
     302              : extern FuncCallContext *per_MultiFuncCall(PG_FUNCTION_ARGS);
     303              : extern void end_MultiFuncCall(PG_FUNCTION_ARGS, FuncCallContext *funcctx);
     304              : 
     305              : #define SRF_IS_FIRSTCALL() (fcinfo->flinfo->fn_extra == NULL)
     306              : 
     307              : #define SRF_FIRSTCALL_INIT() init_MultiFuncCall(fcinfo)
     308              : 
     309              : #define SRF_PERCALL_SETUP() per_MultiFuncCall(fcinfo)
     310              : 
     311              : #define SRF_RETURN_NEXT(_funcctx, _result) \
     312              :         do { \
     313              :                 ReturnSetInfo      *rsi; \
     314              :                 (_funcctx)->call_cntr++; \
     315              :                 rsi = (ReturnSetInfo *) fcinfo->resultinfo; \
     316              :                 rsi->isDone = ExprMultipleResult; \
     317              :                 PG_RETURN_DATUM(_result); \
     318              :         } while (0)
     319              : 
     320              : #define SRF_RETURN_NEXT_NULL(_funcctx) \
     321              :         do { \
     322              :                 ReturnSetInfo      *rsi; \
     323              :                 (_funcctx)->call_cntr++; \
     324              :                 rsi = (ReturnSetInfo *) fcinfo->resultinfo; \
     325              :                 rsi->isDone = ExprMultipleResult; \
     326              :                 PG_RETURN_NULL(); \
     327              :         } while (0)
     328              : 
     329              : #define  SRF_RETURN_DONE(_funcctx) \
     330              :         do { \
     331              :                 ReturnSetInfo      *rsi; \
     332              :                 end_MultiFuncCall(fcinfo, _funcctx); \
     333              :                 rsi = (ReturnSetInfo *) fcinfo->resultinfo; \
     334              :                 rsi->isDone = ExprEndResult; \
     335              :                 PG_RETURN_NULL(); \
     336              :         } while (0)
     337              : 
     338              : /*----------
     339              :  *      Support to ease writing of functions dealing with VARIADIC inputs
     340              :  *----------
     341              :  *
     342              :  * This function extracts a set of argument values, types and NULL markers
     343              :  * for a given input function. This returns a set of data:
     344              :  * - **values includes the set of Datum values extracted.
     345              :  * - **types the data type OID for each element.
     346              :  * - **nulls tracks if an element is NULL.
     347              :  *
     348              :  * variadic_start indicates the argument number where the VARIADIC argument
     349              :  * starts.
     350              :  * convert_unknown set to true will enforce the conversion of arguments
     351              :  * with unknown data type to text.
     352              :  *
     353              :  * The return result is the number of elements stored, or -1 in the case of
     354              :  * "VARIADIC NULL".
     355              :  */
     356              : extern int      extract_variadic_args(FunctionCallInfo fcinfo, int variadic_start,
     357              :                                                                   bool convert_unknown, Datum **args,
     358              :                                                                   Oid **types, bool **nulls);
     359              : 
     360              : #endif                                                  /* FUNCAPI_H */
        

Generated by: LCOV version 2.3.2-1