Fix security definer functions with polymorphic arguments. This case has
authorTom Lane <[email protected]>
Tue, 31 Jul 2007 15:50:07 +0000 (15:50 +0000)
committerTom Lane <[email protected]>
Tue, 31 Jul 2007 15:50:07 +0000 (15:50 +0000)
never worked because fmgr_security_definer() neglected to pass the fn_expr
information through.  Per report from Viatcheslav Kalinin.

src/backend/utils/fmgr/fmgr.c

index 6da27852efe6ee91aeb3a13a4db80aa43bfd5519..ac2c6d5aa8832592dc73cdc4da6eafb61a487aef 100644 (file)
@@ -800,6 +800,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
 
                fmgr_info_cxt_security(fcinfo->flinfo->fn_oid, &fcache->flinfo,
                                                           fcinfo->flinfo->fn_mcxt, true);
+               fcache->flinfo.fn_expr = fcinfo->flinfo->fn_expr;
 
                tuple = SearchSysCache(PROCOID,
                                                           ObjectIdGetDatum(fcinfo->flinfo->fn_oid),
@@ -842,18 +843,28 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
 
 /*-------------------------------------------------------------------------
  *             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.
@@ -864,13 +875,8 @@ DirectFunctionCall1(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;
+       InitFunctionCallInfoData(fcinfo, NULL, 1);
 
-       fcinfo.nargs = 1;
        fcinfo.arg[0] = arg1;
        fcinfo.argnull[0] = false;
 
@@ -889,13 +895,8 @@ DirectFunctionCall2(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;
+       InitFunctionCallInfoData(fcinfo, NULL, 2);
 
-       fcinfo.nargs = 2;
        fcinfo.arg[0] = arg1;
        fcinfo.arg[1] = arg2;
        fcinfo.argnull[0] = false;
@@ -917,11 +918,14 @@ DirectFunctionCall3(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -939,12 +943,16 @@ DirectFunctionCall4(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -962,13 +970,18 @@ DirectFunctionCall5(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -987,14 +1000,20 @@ DirectFunctionCall6(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -1013,8 +1032,8 @@ DirectFunctionCall7(PGFunction func, Datum arg1, Datum arg2,
        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;
@@ -1022,6 +1041,13 @@ DirectFunctionCall7(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -1040,8 +1066,8 @@ DirectFunctionCall8(PGFunction func, Datum arg1, Datum arg2,
        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;
@@ -1050,6 +1076,14 @@ DirectFunctionCall8(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -1069,8 +1103,8 @@ DirectFunctionCall9(PGFunction func, Datum arg1, Datum arg2,
        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;
@@ -1080,6 +1114,15 @@ DirectFunctionCall9(PGFunction func, Datum arg1, Datum arg2,
        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);
 
@@ -1091,7 +1134,8 @@ DirectFunctionCall9(PGFunction func, Datum arg1, Datum arg2,
 }
 
 
-/* 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.
  */
@@ -1101,13 +1145,8 @@ FunctionCall1(FmgrInfo *flinfo, Datum arg1)
        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;
 
@@ -1123,16 +1162,15 @@ FunctionCall1(FmgrInfo *flinfo, Datum arg1)
 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;
@@ -1154,12 +1192,14 @@ FunctionCall3(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1177,13 +1217,16 @@ FunctionCall4(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1201,14 +1244,18 @@ FunctionCall5(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1227,15 +1274,20 @@ FunctionCall6(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1254,9 +1306,8 @@ FunctionCall7(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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;
@@ -1264,6 +1315,13 @@ FunctionCall7(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1282,9 +1340,8 @@ FunctionCall8(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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;
@@ -1293,6 +1350,14 @@ FunctionCall8(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1312,9 +1377,8 @@ FunctionCall9(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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;
@@ -1324,6 +1388,15 @@ FunctionCall9(FmgrInfo *flinfo, Datum arg1, Datum arg2,
        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);
 
@@ -1335,7 +1408,8 @@ FunctionCall9(FmgrInfo *flinfo, Datum arg1, Datum arg2,
 }
 
 
-/* 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,
@@ -1350,10 +1424,10 @@ OidFunctionCall1(Oid functionId, Datum arg1)
 
        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);
 
@@ -1373,11 +1447,12 @@ OidFunctionCall2(Oid functionId, Datum arg1, Datum arg2)
 
        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);
 
@@ -1398,12 +1473,14 @@ OidFunctionCall3(Oid functionId, Datum arg1, Datum arg2,
 
        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);
 
@@ -1424,13 +1501,16 @@ OidFunctionCall4(Oid functionId, Datum arg1, Datum arg2,
 
        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);
 
@@ -1451,14 +1531,18 @@ OidFunctionCall5(Oid functionId, Datum arg1, Datum arg2,
 
        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);
 
@@ -1480,15 +1564,20 @@ OidFunctionCall6(Oid functionId, Datum arg1, Datum arg2,
 
        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);
 
@@ -1510,9 +1599,8 @@ OidFunctionCall7(Oid functionId, Datum arg1, Datum arg2,
 
        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;
@@ -1520,6 +1608,13 @@ OidFunctionCall7(Oid functionId, Datum arg1, Datum arg2,
        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);
 
@@ -1541,9 +1636,8 @@ OidFunctionCall8(Oid functionId, Datum arg1, Datum arg2,
 
        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;
@@ -1552,6 +1646,14 @@ OidFunctionCall8(Oid functionId, Datum arg1, Datum arg2,
        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);
 
@@ -1574,9 +1676,8 @@ OidFunctionCall9(Oid functionId, Datum arg1, Datum arg2,
 
        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;
@@ -1586,6 +1687,15 @@ OidFunctionCall9(Oid functionId, Datum arg1, Datum arg2,
        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);