fmgr.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 1,673 行 · 第 1/3 页

C
1,673
字号
									  fcinfo->arg[2], fcinfo->arg[3],									  fcinfo->arg[4], fcinfo->arg[5],									  fcinfo->arg[6], fcinfo->arg[7],									  fcinfo->arg[8], fcinfo->arg[9],									  fcinfo->arg[10]);			break;		case 12:			returnValue = (*user_fn) (fcinfo->arg[0], fcinfo->arg[1],									  fcinfo->arg[2], fcinfo->arg[3],									  fcinfo->arg[4], fcinfo->arg[5],									  fcinfo->arg[6], fcinfo->arg[7],									  fcinfo->arg[8], fcinfo->arg[9],									  fcinfo->arg[10], fcinfo->arg[11]);			break;		case 13:			returnValue = (*user_fn) (fcinfo->arg[0], fcinfo->arg[1],									  fcinfo->arg[2], fcinfo->arg[3],									  fcinfo->arg[4], fcinfo->arg[5],									  fcinfo->arg[6], fcinfo->arg[7],									  fcinfo->arg[8], fcinfo->arg[9],									  fcinfo->arg[10], fcinfo->arg[11],									  fcinfo->arg[12]);			break;		case 14:			returnValue = (*user_fn) (fcinfo->arg[0], fcinfo->arg[1],									  fcinfo->arg[2], fcinfo->arg[3],									  fcinfo->arg[4], fcinfo->arg[5],									  fcinfo->arg[6], fcinfo->arg[7],									  fcinfo->arg[8], fcinfo->arg[9],									  fcinfo->arg[10], fcinfo->arg[11],									  fcinfo->arg[12], fcinfo->arg[13]);			break;		case 15:			returnValue = (*user_fn) (fcinfo->arg[0], fcinfo->arg[1],									  fcinfo->arg[2], fcinfo->arg[3],									  fcinfo->arg[4], fcinfo->arg[5],									  fcinfo->arg[6], fcinfo->arg[7],									  fcinfo->arg[8], fcinfo->arg[9],									  fcinfo->arg[10], fcinfo->arg[11],									  fcinfo->arg[12], fcinfo->arg[13],									  fcinfo->arg[14]);			break;		case 16:			returnValue = (*user_fn) (fcinfo->arg[0], fcinfo->arg[1],									  fcinfo->arg[2], fcinfo->arg[3],									  fcinfo->arg[4], fcinfo->arg[5],									  fcinfo->arg[6], fcinfo->arg[7],									  fcinfo->arg[8], fcinfo->arg[9],									  fcinfo->arg[10], fcinfo->arg[11],									  fcinfo->arg[12], fcinfo->arg[13],									  fcinfo->arg[14], fcinfo->arg[15]);			break;		default:			/*			 * Increasing FUNC_MAX_ARGS doesn't automatically add cases to			 * the above code, so mention the actual value in this error			 * not FUNC_MAX_ARGS.  You could add cases to the above if you			 * needed to support old-style functions with many arguments,			 * but making 'em be new-style is probably a better idea.			 */			ereport(ERROR,					(errcode(ERRCODE_TOO_MANY_ARGUMENTS),				   errmsg("function %u has too many arguments (%d, maximum is %d)",						  fcinfo->flinfo->fn_oid, n_arguments, 16)));			returnValue = NULL; /* keep compiler quiet */			break;	}	return (Datum) returnValue;}/* * Support for security definer functions */struct fmgr_security_definer_cache{	FmgrInfo	flinfo;	AclId		userid;};/* * Function handler for security definer functions.  We extract the * OID of the actual function and do a fmgr lookup again.  Then we * look up the owner of the function and cache both the fmgr info and * the owner ID.  During the call we temporarily replace the flinfo * with the cached/looked-up one, while keeping the outer fcinfo * (which contains all the actual arguments, etc.) intact. */static Datumfmgr_security_definer(PG_FUNCTION_ARGS){	Datum		result;	FmgrInfo   *save_flinfo;	struct fmgr_security_definer_cache *fcache;	AclId		save_userid;	HeapTuple	tuple;	if (!fcinfo->flinfo->fn_extra)	{		fcache = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt, sizeof(*fcache));		memset(fcache, 0, sizeof(*fcache));		fmgr_info_cxt_security(fcinfo->flinfo->fn_oid, &fcache->flinfo,							   fcinfo->flinfo->fn_mcxt, true);		tuple = SearchSysCache(PROCOID,							   ObjectIdGetDatum(fcinfo->flinfo->fn_oid),							   0, 0, 0);		if (!HeapTupleIsValid(tuple))			elog(ERROR, "cache lookup failed for function %u",				 fcinfo->flinfo->fn_oid);		fcache->userid = ((Form_pg_proc) GETSTRUCT(tuple))->proowner;		ReleaseSysCache(tuple);		fcinfo->flinfo->fn_extra = fcache;	}	else		fcache = fcinfo->flinfo->fn_extra;	save_flinfo = fcinfo->flinfo;	fcinfo->flinfo = &fcache->flinfo;	save_userid = GetUserId();	SetUserId(fcache->userid);	result = FunctionCallInvoke(fcinfo);	SetUserId(save_userid);	fcinfo->flinfo = save_flinfo;	return result;}/*------------------------------------------------------------------------- *		Support routines for callers of fmgr-compatible functions * * NOTE: the simplest way to reliably initialize a FunctionCallInfoData * is to MemSet it to zeroes and then fill in the fields that should be * nonzero.  However, in a few of the most heavily used paths, we instead * just zero the fields that must be zero.	This saves a fair number of * cycles so it's worth the extra maintenance effort.  Also see inlined * version of FunctionCall2 in utils/sort/tuplesort.c if you need to change * these routines! *------------------------------------------------------------------------- *//* These are for invocation of a specifically named function with a * directly-computed parameter list.  Note that neither arguments nor result * are allowed to be NULL.	Also, the function cannot be one that needs to * look at FmgrInfo, since there won't be any. */DatumDirectFunctionCall1(PGFunction func, Datum arg1){	FunctionCallInfoData fcinfo;	Datum		result;	/* MemSet(&fcinfo, 0, sizeof(fcinfo)); */	fcinfo.flinfo = NULL;	fcinfo.context = NULL;	fcinfo.resultinfo = NULL;	fcinfo.isnull = false;	fcinfo.nargs = 1;	fcinfo.arg[0] = arg1;	fcinfo.argnull[0] = false;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall2(PGFunction func, Datum arg1, Datum arg2){	FunctionCallInfoData fcinfo;	Datum		result;	/* MemSet(&fcinfo, 0, sizeof(fcinfo)); */	fcinfo.flinfo = NULL;	fcinfo.context = NULL;	fcinfo.resultinfo = NULL;	fcinfo.isnull = false;	fcinfo.nargs = 2;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.argnull[0] = false;	fcinfo.argnull[1] = false;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall3(PGFunction func, Datum arg1, Datum arg2,					Datum arg3){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 3;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall4(PGFunction func, Datum arg1, Datum arg2,					Datum arg3, Datum arg4){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 4;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall5(PGFunction func, Datum arg1, Datum arg2,					Datum arg3, Datum arg4, Datum arg5){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 5;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall6(PGFunction func, Datum arg1, Datum arg2,					Datum arg3, Datum arg4, Datum arg5,					Datum arg6){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 6;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	fcinfo.arg[5] = arg6;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall7(PGFunction func, Datum arg1, Datum arg2,					Datum arg3, Datum arg4, Datum arg5,					Datum arg6, Datum arg7){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 7;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	fcinfo.arg[5] = arg6;	fcinfo.arg[6] = arg7;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall8(PGFunction func, Datum arg1, Datum arg2,					Datum arg3, Datum arg4, Datum arg5,					Datum arg6, Datum arg7, Datum arg8){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 8;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	fcinfo.arg[5] = arg6;	fcinfo.arg[6] = arg7;	fcinfo.arg[7] = arg8;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}DatumDirectFunctionCall9(PGFunction func, Datum arg1, Datum arg2,					Datum arg3, Datum arg4, Datum arg5,					Datum arg6, Datum arg7, Datum arg8,					Datum arg9){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.nargs = 9;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	fcinfo.arg[5] = arg6;	fcinfo.arg[6] = arg7;	fcinfo.arg[7] = arg8;	fcinfo.arg[8] = arg9;	result = (*func) (&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %p returned NULL", (void *) func);	return result;}/* These are for invocation of a previously-looked-up function with a * directly-computed parameter list.  Note that neither arguments nor result * are allowed to be NULL. */DatumFunctionCall1(FmgrInfo *flinfo, Datum arg1){	FunctionCallInfoData fcinfo;	Datum		result;	/* MemSet(&fcinfo, 0, sizeof(fcinfo)); */	fcinfo.context = NULL;	fcinfo.resultinfo = NULL;	fcinfo.isnull = false;	fcinfo.flinfo = flinfo;	fcinfo.nargs = 1;	fcinfo.arg[0] = arg1;	fcinfo.argnull[0] = false;	result = FunctionCallInvoke(&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid);	return result;}DatumFunctionCall2(FmgrInfo *flinfo, Datum arg1, Datum arg2){	FunctionCallInfoData fcinfo;	Datum		result;	/* MemSet(&fcinfo, 0, sizeof(fcinfo)); */	fcinfo.context = NULL;	fcinfo.resultinfo = NULL;	fcinfo.isnull = false;	fcinfo.flinfo = flinfo;	fcinfo.nargs = 2;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.argnull[0] = false;	fcinfo.argnull[1] = false;	result = FunctionCallInvoke(&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid);	return result;}DatumFunctionCall3(FmgrInfo *flinfo, Datum arg1, Datum arg2,			  Datum arg3){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.flinfo = flinfo;	fcinfo.nargs = 3;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	result = FunctionCallInvoke(&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid);	return result;}DatumFunctionCall4(FmgrInfo *flinfo, Datum arg1, Datum arg2,			  Datum arg3, Datum arg4){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.flinfo = flinfo;	fcinfo.nargs = 4;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	result = FunctionCallInvoke(&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid);	return result;}DatumFunctionCall5(FmgrInfo *flinfo, Datum arg1, Datum arg2,			  Datum arg3, Datum arg4, Datum arg5){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.flinfo = flinfo;	fcinfo.nargs = 5;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	result = FunctionCallInvoke(&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid);	return result;}DatumFunctionCall6(FmgrInfo *flinfo, Datum arg1, Datum arg2,			  Datum arg3, Datum arg4, Datum arg5,			  Datum arg6){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.flinfo = flinfo;	fcinfo.nargs = 6;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;	fcinfo.arg[5] = arg6;	result = FunctionCallInvoke(&fcinfo);	/* Check for null result, since caller is clearly not expecting one */	if (fcinfo.isnull)		elog(ERROR, "function %u returned NULL", fcinfo.flinfo->fn_oid);	return result;}DatumFunctionCall7(FmgrInfo *flinfo, Datum arg1, Datum arg2,			  Datum arg3, Datum arg4, Datum arg5,			  Datum arg6, Datum arg7){	FunctionCallInfoData fcinfo;	Datum		result;	MemSet(&fcinfo, 0, sizeof(fcinfo));	fcinfo.flinfo = flinfo;	fcinfo.nargs = 7;	fcinfo.arg[0] = arg1;	fcinfo.arg[1] = arg2;	fcinfo.arg[2] = arg3;	fcinfo.arg[3] = arg4;	fcinfo.arg[4] = arg5;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?