On 02/24/2017 05:34 PM, Andrew Dunstan wrote: > > On 02/24/2017 02:55 PM, Andrew Dunstan wrote: >> On 02/24/2017 11:02 AM, Tom Lane wrote: >>>> I don't know what to call it either. In my test I used >>>> CallerContextFunctionCall2 - not sure if that's quite right, but should >>>> be close. >>> CallerInfo? CallerFInfo? Or we could spell out CallerFmgrInfo but >>> that seems a bit verbose. >>> >>> >> I'll go with CallerFInfoFunctionCall2 etc. >> >> In the btree_gist system the calls to the routines like enum_cmp are >> buried about three levels deep. I'm thinking I'll just pass the flinfo >> down the stack and just call these routines at the bottom level. >> >> >> > > It's occurred to me that we could reduce the code clutter in fmgr.c a > bit by turning the DirectFunctionCall{n]Coll functions into macros > calling these functions and passing NULL as the flinfo param. >
here's a patch along those lines. If there's agreement on this I can finish up the work on btree_gist and btree_gin supoport for enums. cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 3976496..d565d3e 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -1006,19 +1006,30 @@ fmgr_security_definer(PG_FUNCTION_ARGS) *------------------------------------------------------------------------- */ -/* - * These are for invocation of a specifically named function with a + +/* 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. + * are allowed to be NULL. + * + * If the flinfo parameter is not NULL then this used to supply context + * to the called function. The callee should only use the passed in fn_mcxt + * and fn_extra. Anything else is likely to be bogus. + * + * But the fn_extra can be used for example for caching results + * (see enum_cmp for an example). + * + * No context is supplied if the parameter is NULL. See DirectFunctionCall + * macros. In this case the function must not try to look at FmgrInfo, since + * there won't be one and it is likely to result in an access violation. */ Datum -DirectFunctionCall1Coll(PGFunction func, Oid collation, Datum arg1) +CallerFInfoFunctionCall1(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 1, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 1, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.argnull[0] = false; @@ -1033,12 +1044,13 @@ DirectFunctionCall1Coll(PGFunction func, Oid collation, Datum arg1) } Datum -DirectFunctionCall2Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2) +CallerFInfoFunctionCall2(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 2, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 2, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1055,13 +1067,14 @@ DirectFunctionCall2Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2) } Datum -DirectFunctionCall3Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3) +CallerFInfoFunctionCall3(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 3, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 3, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1080,13 +1093,14 @@ DirectFunctionCall3Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, } Datum -DirectFunctionCall4Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3, Datum arg4) +CallerFInfoFunctionCall4(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 4, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 4, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1107,13 +1121,14 @@ DirectFunctionCall4Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, } Datum -DirectFunctionCall5Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5) +CallerFInfoFunctionCall5(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 5, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 5, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1136,14 +1151,15 @@ DirectFunctionCall5Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, } Datum -DirectFunctionCall6Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6) +CallerFInfoFunctionCall6(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 6, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 6, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1168,14 +1184,15 @@ DirectFunctionCall6Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, } Datum -DirectFunctionCall7Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6, Datum arg7) +CallerFInfoFunctionCall7(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6, Datum arg7) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 7, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 7, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1202,14 +1219,15 @@ DirectFunctionCall7Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, } Datum -DirectFunctionCall8Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6, Datum arg7, Datum arg8) +CallerFInfoFunctionCall8(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6, Datum arg7, Datum arg8) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 8, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 8, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; @@ -1238,15 +1256,16 @@ DirectFunctionCall8Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, } Datum -DirectFunctionCall9Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6, Datum arg7, Datum arg8, - Datum arg9) +CallerFInfoFunctionCall9(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6, Datum arg7, Datum arg8, + Datum arg9) { FunctionCallInfoData fcinfo; Datum result; - InitFunctionCallInfoData(fcinfo, NULL, 9, collation, NULL, NULL); + InitFunctionCallInfoData(fcinfo, flinfo, 9, collation, NULL, NULL); fcinfo.arg[0] = arg1; fcinfo.arg[1] = arg2; diff --git a/src/include/fmgr.h b/src/include/fmgr.h index a671480..c186d01 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -443,37 +443,48 @@ extern int no_such_variable /* 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. + * + * If the flinfo parameter is not NULL then this used to supply context + * to the called function. The callee should only use the passed in fn_mcxt + * and fn_extra. Anything else is likely to be bogus. + * + * But the fn_extra can be used for example for caching results + * (see enum_cmp for an example). + * + * No context is supplied if the parameter is NULL. See DirectFunctionCall + * macros below. In this case the function must not try to look at FmgrInfo, + * since there won't be one and it is likely to result in an access violation. */ -extern Datum DirectFunctionCall1Coll(PGFunction func, Oid collation, - Datum arg1); -extern Datum DirectFunctionCall2Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2); -extern Datum DirectFunctionCall3Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3); -extern Datum DirectFunctionCall4Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3, Datum arg4); -extern Datum DirectFunctionCall5Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5); -extern Datum DirectFunctionCall6Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6); -extern Datum DirectFunctionCall7Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6, Datum arg7); -extern Datum DirectFunctionCall8Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6, Datum arg7, Datum arg8); -extern Datum DirectFunctionCall9Coll(PGFunction func, Oid collation, - Datum arg1, Datum arg2, - Datum arg3, Datum arg4, Datum arg5, - Datum arg6, Datum arg7, Datum arg8, - Datum arg9); +extern Datum CallerFInfoFunctionCall1(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1); +extern Datum CallerFInfoFunctionCall2(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2); +extern Datum CallerFInfoFunctionCall3(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3); +extern Datum CallerFInfoFunctionCall4(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4); +extern Datum CallerFInfoFunctionCall5(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5); +extern Datum CallerFInfoFunctionCall6(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6); +extern Datum CallerFInfoFunctionCall7(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6, Datum arg7); +extern Datum CallerFInfoFunctionCall8(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6, Datum arg7, Datum arg8); +extern Datum CallerFInfoFunctionCall9(PGFunction func, FmgrInfo *flinfo, + Oid collation, Datum arg1, Datum arg2, + Datum arg3, Datum arg4, Datum arg5, + Datum arg6, Datum arg7, Datum arg8, + Datum arg9); /* These are for invocation of a previously-looked-up function with a * directly-computed parameter list. Note that neither arguments nor result @@ -548,28 +559,55 @@ extern Datum OidFunctionCall9Coll(Oid functionId, Oid collation, Datum arg6, Datum arg7, Datum arg8, Datum arg9); +/* + * These macros allow the flinfo argument to be omitted, so that no context is + * supplied to the called function. + */ + +#define DirectFunctionCall1Coll(func, coll, arg1) \ + CallerFInfoFunctionCall1(func, NULL, coll, arg1) +#define DirectFunctionCall2Coll(func, coll, arg1, arg2) \ + CallerFInfoFunctionCall2(func, NULL, coll, arg1, arg2) +#define DirectFunctionCall3Coll(func, coll, arg1, arg2, arg3) \ + CallerFInfoFunctionCall3(func, NULL, coll, arg1, arg2, arg3) +#define DirectFunctionCall4Coll(func, coll, arg1, arg2, arg3, arg4) \ + CallerFInfoFunctionCall4(func, NULL, coll, arg1, arg2, arg3, arg4) +#define DirectFunctionCall5Coll(func, coll, arg1, arg2, arg3, arg4, arg5) \ + CallerFInfoFunctionCall5(func, NULL, coll, arg1, arg2, arg3, arg4, arg5) +#define DirectFunctionCall6Coll(func, coll, arg1, arg2, arg3, arg4, arg5, arg6) \ + CallerFInfoFunctionCall6(func, NULL, coll, arg1, arg2, arg3, arg4, arg5, arg6) +#define DirectFunctionCall7Coll(func, coll, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + CallerFInfoFunctionCall7(func, NULL, coll, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +#define DirectFunctionCall8Coll(func, coll, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ + CallerFInfoFunctionCall8(func, NULL, coll, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +#define DirectFunctionCall9Coll(func, coll, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ + CallerFInfoFunctionCall9(func, NULL, coll, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + + /* These macros allow the collation argument to be omitted (with a default of * InvalidOid, ie, no collation). They exist mostly for backwards - * compatibility of source code. + * compatibility of source code. The flinfo argument is also set as NULL + * in the DirectFunctionCall cases, so that no context is supplied to the + * called function. */ #define DirectFunctionCall1(func, arg1) \ - DirectFunctionCall1Coll(func, InvalidOid, arg1) + CallerFInfoFunctionCall1(func, NULL, InvalidOid, arg1) #define DirectFunctionCall2(func, arg1, arg2) \ - DirectFunctionCall2Coll(func, InvalidOid, arg1, arg2) + CallerFInfoFunctionCall2(func, NULL, InvalidOid, arg1, arg2) #define DirectFunctionCall3(func, arg1, arg2, arg3) \ - DirectFunctionCall3Coll(func, InvalidOid, arg1, arg2, arg3) + CallerFInfoFunctionCall3(func, NULL, InvalidOid, arg1, arg2, arg3) #define DirectFunctionCall4(func, arg1, arg2, arg3, arg4) \ - DirectFunctionCall4Coll(func, InvalidOid, arg1, arg2, arg3, arg4) + CallerFInfoFunctionCall4(func, NULL, InvalidOid, arg1, arg2, arg3, arg4) #define DirectFunctionCall5(func, arg1, arg2, arg3, arg4, arg5) \ - DirectFunctionCall5Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5) + CallerFInfoFunctionCall5(func, NULL, InvalidOid, arg1, arg2, arg3, arg4, arg5) #define DirectFunctionCall6(func, arg1, arg2, arg3, arg4, arg5, arg6) \ - DirectFunctionCall6Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6) + CallerFInfoFunctionCall6(func, NULL, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6) #define DirectFunctionCall7(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - DirectFunctionCall7Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + CallerFInfoFunctionCall7(func, NULL, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7) #define DirectFunctionCall8(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - DirectFunctionCall8Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) + CallerFInfoFunctionCall8(func, NULL, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) #define DirectFunctionCall9(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \ - DirectFunctionCall9Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + CallerFInfoFunctionCall9(func, NULL, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) #define FunctionCall1(flinfo, arg1) \ FunctionCall1Coll(flinfo, InvalidOid, arg1) #define FunctionCall2(flinfo, arg1, arg2) \
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers