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