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 + -
显示快捷键?