*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.88 2004/12/31 22:01:31 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/fmgr/fmgr.c,v 1.89 2005/02/02 22:40:03 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
* 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
+/*
+ * 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) \
+ do { \
+ (Fcinfo).flinfo = (Flinfo); \
+ (Fcinfo).context = NULL; \
+ (Fcinfo).resultinfo = NULL; \
+ (Fcinfo).isnull = false; \
+ (Fcinfo).nargs = (Nargs); \
+ } while (0)
+
+
+/*
+ * 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.
FunctionCallInfoData fcinfo;
Datum result;
- /* MemSet(&fcinfo, 0, sizeof(fcinfo)); */
- fcinfo.flinfo = NULL;
- fcinfo.context = NULL;
- fcinfo.resultinfo = NULL;
- fcinfo.isnull = false;
+ InitFunctionCallInfoData(fcinfo, NULL, 1);
- fcinfo.nargs = 1;
fcinfo.arg[0] = arg1;
fcinfo.argnull[0] = false;
FunctionCallInfoData fcinfo;
Datum result;
- /* MemSet(&fcinfo, 0, sizeof(fcinfo)); */
- fcinfo.flinfo = NULL;
- fcinfo.context = NULL;
- fcinfo.resultinfo = NULL;
- fcinfo.isnull = false;
+ InitFunctionCallInfoData(fcinfo, NULL, 2);
- fcinfo.nargs = 2;
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.argnull[0] = false;
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 3;
+ InitFunctionCallInfoData(fcinfo, NULL, 3);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
result = (*func) (&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 4;
+ InitFunctionCallInfoData(fcinfo, NULL, 4);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[3] = arg4;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
result = (*func) (&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 5;
+ InitFunctionCallInfoData(fcinfo, NULL, 5);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[3] = arg4;
fcinfo.arg[4] = arg5;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
result = (*func) (&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 6;
+ InitFunctionCallInfoData(fcinfo, NULL, 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;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
result = (*func) (&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 7;
+ InitFunctionCallInfoData(fcinfo, NULL, 7);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[4] = arg5;
fcinfo.arg[5] = arg6;
fcinfo.arg[6] = arg7;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
result = (*func) (&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 8;
+ InitFunctionCallInfoData(fcinfo, NULL, 8);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[5] = arg6;
fcinfo.arg[6] = arg7;
fcinfo.arg[7] = arg8;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
+ fcinfo.argnull[7] = false;
result = (*func) (&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.nargs = 9;
+ InitFunctionCallInfoData(fcinfo, NULL, 9);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[6] = arg7;
fcinfo.arg[7] = arg8;
fcinfo.arg[8] = arg9;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
+ fcinfo.argnull[7] = false;
+ fcinfo.argnull[8] = false;
result = (*func) (&fcinfo);
}
-/* These are for invocation of a previously-looked-up function with a
+/*
+ * 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.
*/
FunctionCallInfoData fcinfo;
Datum result;
- /* MemSet(&fcinfo, 0, sizeof(fcinfo)); */
- fcinfo.context = NULL;
- fcinfo.resultinfo = NULL;
- fcinfo.isnull = false;
+ InitFunctionCallInfoData(fcinfo, flinfo, 1);
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 1;
fcinfo.arg[0] = arg1;
fcinfo.argnull[0] = false;
Datum
FunctionCall2(FmgrInfo *flinfo, Datum arg1, Datum arg2)
{
+ /*
+ * XXX if you change this routine, see also the inlined version in
+ * utils/sort/tuplesort.c!
+ */
FunctionCallInfoData fcinfo;
Datum result;
- /* MemSet(&fcinfo, 0, sizeof(fcinfo)); */
- fcinfo.context = NULL;
- fcinfo.resultinfo = NULL;
- fcinfo.isnull = false;
+ InitFunctionCallInfoData(fcinfo, flinfo, 2);
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 2;
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.argnull[0] = false;
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 3;
+ InitFunctionCallInfoData(fcinfo, flinfo, 3);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
result = FunctionCallInvoke(&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 4;
+ InitFunctionCallInfoData(fcinfo, flinfo, 4);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[3] = arg4;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
result = FunctionCallInvoke(&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 5;
+ InitFunctionCallInfoData(fcinfo, flinfo, 5);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[3] = arg4;
fcinfo.arg[4] = arg5;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
result = FunctionCallInvoke(&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 6;
+ InitFunctionCallInfoData(fcinfo, flinfo, 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;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
result = FunctionCallInvoke(&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 7;
+ InitFunctionCallInfoData(fcinfo, flinfo, 7);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[4] = arg5;
fcinfo.arg[5] = arg6;
fcinfo.arg[6] = arg7;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
result = FunctionCallInvoke(&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 8;
+ InitFunctionCallInfoData(fcinfo, flinfo, 8);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[5] = arg6;
fcinfo.arg[6] = arg7;
fcinfo.arg[7] = arg8;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
+ fcinfo.argnull[7] = false;
result = FunctionCallInvoke(&fcinfo);
FunctionCallInfoData fcinfo;
Datum result;
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = flinfo;
- fcinfo.nargs = 9;
+ InitFunctionCallInfoData(fcinfo, flinfo, 9);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[6] = arg7;
fcinfo.arg[7] = arg8;
fcinfo.arg[8] = arg9;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
+ fcinfo.argnull[7] = false;
+ fcinfo.argnull[8] = false;
result = FunctionCallInvoke(&fcinfo);
}
-/* These are for invocation of a function identified by OID with a
+/*
+ * These are for invocation of a function identified by OID with a
* directly-computed parameter list. Note that neither arguments nor result
* are allowed to be NULL. These are essentially fmgr_info() followed
* by FunctionCallN(). If the same function is to be invoked repeatedly,
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 1;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 1);
+
fcinfo.arg[0] = arg1;
+ fcinfo.argnull[0] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 2;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 2);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 3;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 3);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 4;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 4);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[3] = arg4;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 5;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 5);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[3] = arg4;
fcinfo.arg[4] = arg5;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 6;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 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;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 7;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 7);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[4] = arg5;
fcinfo.arg[5] = arg6;
fcinfo.arg[6] = arg7;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 8;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 8);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[5] = arg6;
fcinfo.arg[6] = arg7;
fcinfo.arg[7] = arg8;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
+ fcinfo.argnull[7] = false;
result = FunctionCallInvoke(&fcinfo);
fmgr_info(functionId, &flinfo);
- MemSet(&fcinfo, 0, sizeof(fcinfo));
- fcinfo.flinfo = &flinfo;
- fcinfo.nargs = 9;
+ InitFunctionCallInfoData(fcinfo, &flinfo, 9);
+
fcinfo.arg[0] = arg1;
fcinfo.arg[1] = arg2;
fcinfo.arg[2] = arg3;
fcinfo.arg[6] = arg7;
fcinfo.arg[7] = arg8;
fcinfo.arg[8] = arg9;
+ fcinfo.argnull[0] = false;
+ fcinfo.argnull[1] = false;
+ fcinfo.argnull[2] = false;
+ fcinfo.argnull[3] = false;
+ fcinfo.argnull[4] = false;
+ fcinfo.argnull[5] = false;
+ fcinfo.argnull[6] = false;
+ fcinfo.argnull[7] = false;
+ fcinfo.argnull[8] = false;
result = FunctionCallInvoke(&fcinfo);