fmgr.h
来自「PostgreSQL 8.2中增加了很多企业用户所需要的功能和性能上的提高,其开」· C头文件 代码 · 共 512 行 · 第 1/2 页
H
512 行
/*------------------------------------------------------------------------- * * fmgr.h * Definitions for the Postgres function manager and function-call * interface. * * This file must be included by all Postgres modules that either define * or call fmgr-callable functions. * * * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * $PostgreSQL: pgsql/src/include/fmgr.h,v 1.48 2006/10/04 00:30:06 momjian Exp $ * *------------------------------------------------------------------------- */#ifndef FMGR_H#define FMGR_H/* We don't want to include primnodes.h here, so make a stub reference */typedef struct Node *fmNodePtr;/* Likewise, avoid including stringinfo.h here */typedef struct StringInfoData *fmStringInfo;/* * All functions that can be called directly by fmgr must have this signature. * (Other functions can be called by using a handler that does have this * signature.) */typedef struct FunctionCallInfoData *FunctionCallInfo;typedef Datum (*PGFunction) (FunctionCallInfo fcinfo);/* * This struct holds the system-catalog information that must be looked up * before a function can be called through fmgr. If the same function is * to be called multiple times, the lookup need be done only once and the * info struct saved for re-use. */typedef struct FmgrInfo{ PGFunction fn_addr; /* pointer to function or handler to be called */ Oid fn_oid; /* OID of function (NOT of handler, if any) */ short fn_nargs; /* 0..FUNC_MAX_ARGS, or -1 if variable arg * count */ bool fn_strict; /* function is "strict" (NULL in => NULL out) */ bool fn_retset; /* function returns a set */ void *fn_extra; /* extra space for use by handler */ MemoryContext fn_mcxt; /* memory context to store fn_extra in */ fmNodePtr fn_expr; /* expression parse tree for call, or NULL */} FmgrInfo;/* * This struct is the data actually passed to an fmgr-called function. */typedef struct FunctionCallInfoData{ FmgrInfo *flinfo; /* ptr to lookup info used for this call */ fmNodePtr context; /* pass info about context of call */ fmNodePtr resultinfo; /* pass or return extra info about result */ bool isnull; /* function must set true if result is NULL */ short nargs; /* # arguments actually passed */ Datum arg[FUNC_MAX_ARGS]; /* Arguments passed to function */ bool argnull[FUNC_MAX_ARGS]; /* T if arg[i] is actually NULL */} FunctionCallInfoData;/* * This routine fills a FmgrInfo struct, given the OID * of the function to be called. */extern void fmgr_info(Oid functionId, FmgrInfo *finfo);/* * Same, when the FmgrInfo struct is in a memory context longer-lived than * CurrentMemoryContext. The specified context will be set as fn_mcxt * and used to hold all subsidiary data of finfo. */extern void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt);/* * Copy an FmgrInfo struct */extern void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt);/* * This macro initializes all the fields of a FunctionCallInfoData except * for the arg[] and argnull[] arrays. Performance testing has shown that * the fastest way to set up argnull[] for small numbers of arguments is to * explicitly set each required element to false, so we don't try to zero * out the argnull[] array in the macro. */#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Context, Resultinfo) \ do { \ (Fcinfo).flinfo = (Flinfo); \ (Fcinfo).context = (Context); \ (Fcinfo).resultinfo = (Resultinfo); \ (Fcinfo).isnull = false; \ (Fcinfo).nargs = (Nargs); \ } while (0)/* * This macro invokes a function given a filled-in FunctionCallInfoData * struct. The macro result is the returned Datum --- but note that * caller must still check fcinfo->isnull! Also, if function is strict, * it is caller's responsibility to verify that no null arguments are present * before calling. */#define FunctionCallInvoke(fcinfo) ((* (fcinfo)->flinfo->fn_addr) (fcinfo))/*------------------------------------------------------------------------- * Support macros to ease writing fmgr-compatible functions * * A C-coded fmgr-compatible function should be declared as * * Datum * function_name(PG_FUNCTION_ARGS) * { * ... * } * * It should access its arguments using appropriate PG_GETARG_xxx macros * and should return its result using PG_RETURN_xxx. * *------------------------------------------------------------------------- *//* Standard parameter list for fmgr-compatible functions */#define PG_FUNCTION_ARGS FunctionCallInfo fcinfo/* * Get number of arguments passed to function. */#define PG_NARGS() (fcinfo->nargs)/* * If function is not marked "proisstrict" in pg_proc, it must check for * null arguments using this macro. Do not try to GETARG a null argument! */#define PG_ARGISNULL(n) (fcinfo->argnull[n])/* * Support for fetching detoasted copies of toastable datatypes (all of * which are varlena types). pg_detoast_datum() gives you either the input * datum (if not toasted) or a detoasted copy allocated with palloc(). * pg_detoast_datum_copy() always gives you a palloc'd copy --- use it * if you need a modifiable copy of the input. Caller is expected to have * checked for null inputs first, if necessary. * * Note: it'd be nice if these could be macros, but I see no way to do that * without evaluating the arguments multiple times, which is NOT acceptable. */extern struct varlena *pg_detoast_datum(struct varlena * datum);extern struct varlena *pg_detoast_datum_copy(struct varlena * datum);extern struct varlena *pg_detoast_datum_slice(struct varlena * datum, int32 first, int32 count);#define PG_DETOAST_DATUM(datum) \ pg_detoast_datum((struct varlena *) DatumGetPointer(datum))#define PG_DETOAST_DATUM_COPY(datum) \ pg_detoast_datum_copy((struct varlena *) DatumGetPointer(datum))#define PG_DETOAST_DATUM_SLICE(datum,f,c) \ pg_detoast_datum_slice((struct varlena *) DatumGetPointer(datum), \ (int32) f, (int32) c)/* * Support for cleaning up detoasted copies of inputs. This must only * be used for pass-by-ref datatypes, and normally would only be used * for toastable types. If the given pointer is different from the * original argument, assume it's a palloc'd detoasted copy, and pfree it. * NOTE: most functions on toastable types do not have to worry about this, * but we currently require that support functions for indexes not leak * memory. */#define PG_FREE_IF_COPY(ptr,n) \ do { \ if ((Pointer) (ptr) != PG_GETARG_POINTER(n)) \ pfree(ptr); \ } while (0)/* Macros for fetching arguments of standard types */#define PG_GETARG_DATUM(n) (fcinfo->arg[n])#define PG_GETARG_INT32(n) DatumGetInt32(PG_GETARG_DATUM(n))#define PG_GETARG_UINT32(n) DatumGetUInt32(PG_GETARG_DATUM(n))#define PG_GETARG_INT16(n) DatumGetInt16(PG_GETARG_DATUM(n))#define PG_GETARG_UINT16(n) DatumGetUInt16(PG_GETARG_DATUM(n))#define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n))#define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n))#define PG_GETARG_OID(n) DatumGetObjectId(PG_GETARG_DATUM(n))#define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n))#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n))#define PG_GETARG_NAME(n) DatumGetName(PG_GETARG_DATUM(n))/* these macros hide the pass-by-reference-ness of the datatype: */#define PG_GETARG_FLOAT4(n) DatumGetFloat4(PG_GETARG_DATUM(n))#define PG_GETARG_FLOAT8(n) DatumGetFloat8(PG_GETARG_DATUM(n))#define PG_GETARG_INT64(n) DatumGetInt64(PG_GETARG_DATUM(n))/* use this if you want the raw, possibly-toasted input datum: */#define PG_GETARG_RAW_VARLENA_P(n) ((struct varlena *) PG_GETARG_POINTER(n))/* use this if you want the input datum de-toasted: */#define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n))/* DatumGetFoo macros for varlena types will typically look like this: */#define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X))#define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X))#define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X))#define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X))#define DatumGetHeapTupleHeader(X) ((HeapTupleHeader) PG_DETOAST_DATUM(X))/* And we also offer variants that return an OK-to-write copy */#define DatumGetByteaPCopy(X) ((bytea *) PG_DETOAST_DATUM_COPY(X))#define DatumGetTextPCopy(X) ((text *) PG_DETOAST_DATUM_COPY(X))#define DatumGetBpCharPCopy(X) ((BpChar *) PG_DETOAST_DATUM_COPY(X))#define DatumGetVarCharPCopy(X) ((VarChar *) PG_DETOAST_DATUM_COPY(X))#define DatumGetHeapTupleHeaderCopy(X) ((HeapTupleHeader) PG_DETOAST_DATUM_COPY(X))/* Variants which return n bytes starting at pos. m */#define DatumGetByteaPSlice(X,m,n) ((bytea *) PG_DETOAST_DATUM_SLICE(X,m,n))#define DatumGetTextPSlice(X,m,n) ((text *) PG_DETOAST_DATUM_SLICE(X,m,n))#define DatumGetBpCharPSlice(X,m,n) ((BpChar *) PG_DETOAST_DATUM_SLICE(X,m,n))#define DatumGetVarCharPSlice(X,m,n) ((VarChar *) PG_DETOAST_DATUM_SLICE(X,m,n))/* GETARG macros for varlena types will typically look like this: */#define PG_GETARG_BYTEA_P(n) DatumGetByteaP(PG_GETARG_DATUM(n))#define PG_GETARG_TEXT_P(n) DatumGetTextP(PG_GETARG_DATUM(n))#define PG_GETARG_BPCHAR_P(n) DatumGetBpCharP(PG_GETARG_DATUM(n))#define PG_GETARG_VARCHAR_P(n) DatumGetVarCharP(PG_GETARG_DATUM(n))#define PG_GETARG_HEAPTUPLEHEADER(n) DatumGetHeapTupleHeader(PG_GETARG_DATUM(n))/* And we also offer variants that return an OK-to-write copy */#define PG_GETARG_BYTEA_P_COPY(n) DatumGetByteaPCopy(PG_GETARG_DATUM(n))#define PG_GETARG_TEXT_P_COPY(n) DatumGetTextPCopy(PG_GETARG_DATUM(n))#define PG_GETARG_BPCHAR_P_COPY(n) DatumGetBpCharPCopy(PG_GETARG_DATUM(n))#define PG_GETARG_VARCHAR_P_COPY(n) DatumGetVarCharPCopy(PG_GETARG_DATUM(n))#define PG_GETARG_HEAPTUPLEHEADER_COPY(n) DatumGetHeapTupleHeaderCopy(PG_GETARG_DATUM(n))/* And a b-byte slice from position a -also OK to write */#define PG_GETARG_BYTEA_P_SLICE(n,a,b) DatumGetByteaPSlice(PG_GETARG_DATUM(n),a,b)#define PG_GETARG_TEXT_P_SLICE(n,a,b) DatumGetTextPSlice(PG_GETARG_DATUM(n),a,b)#define PG_GETARG_BPCHAR_P_SLICE(n,a,b) DatumGetBpCharPSlice(PG_GETARG_DATUM(n),a,b)#define PG_GETARG_VARCHAR_P_SLICE(n,a,b) DatumGetVarCharPSlice(PG_GETARG_DATUM(n),a,b)/* To return a NULL do this: */#define PG_RETURN_NULL() \ do { fcinfo->isnull = true; return (Datum) 0; } while (0)/* A few internal functions return void (which is not the same as NULL!) */#define PG_RETURN_VOID() return (Datum) 0/* Macros for returning results of standard types */#define PG_RETURN_DATUM(x) return (x)#define PG_RETURN_INT32(x) return Int32GetDatum(x)#define PG_RETURN_UINT32(x) return UInt32GetDatum(x)#define PG_RETURN_INT16(x) return Int16GetDatum(x)#define PG_RETURN_CHAR(x) return CharGetDatum(x)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?