Repair oidvectorrecv and int2vectorrecv, which I broke while changing
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 2 Mar 2006 21:13:11 +0000 (21:13 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 2 Mar 2006 21:13:11 +0000 (21:13 +0000)
them to use array_recv :-(.  Per report from Tim Kordas.

src/backend/utils/adt/int.c
src/backend/utils/adt/oid.c

index c855b8123861fbb8670b081b0828b6bc7cb8c36b..250b6b0a59837b5be6a97ba909ba0f005f631350 100644 (file)
@@ -212,13 +212,28 @@ Datum
 int2vectorrecv(PG_FUNCTION_ARGS)
 {
        StringInfo      buf = (StringInfo) PG_GETARG_POINTER(0);
+       FunctionCallInfoData locfcinfo;
        int2vector *result;
 
-       result = (int2vector *)
-               DatumGetPointer(DirectFunctionCall3(array_recv,
-                                                                                       PointerGetDatum(buf),
-                                                                                       ObjectIdGetDatum(INT2OID),
-                                                                                       Int32GetDatum(-1)));
+       /*
+        * Normally one would call array_recv() using DirectFunctionCall3,
+        * but that does not work since array_recv wants to cache some data
+        * using fcinfo->flinfo->fn_extra.  So we need to pass it our own
+        * flinfo parameter.
+        */
+       InitFunctionCallInfoData(locfcinfo, fcinfo->flinfo, 3, NULL, NULL);
+
+       locfcinfo.arg[0] = PointerGetDatum(buf);
+       locfcinfo.arg[1] = ObjectIdGetDatum(INT2OID);
+       locfcinfo.arg[2] = Int32GetDatum(-1);
+       locfcinfo.argnull[0] = false;
+       locfcinfo.argnull[1] = false;
+       locfcinfo.argnull[2] = false;
+
+       result = (int2vector *) DatumGetPointer(array_recv(&locfcinfo));
+
+       Assert(!locfcinfo.isnull);
+
        /* sanity checks: int2vector must be 1-D, no nulls */
        if (result->ndim != 1 ||
                result->flags != 0 ||
index 05146583cc8090cf34ed458dc8c6329329ef83cb..7b6fc6a791856bb6c894b7acfa6f30a645f7f3c7 100644 (file)
@@ -254,13 +254,28 @@ Datum
 oidvectorrecv(PG_FUNCTION_ARGS)
 {
        StringInfo      buf = (StringInfo) PG_GETARG_POINTER(0);
+       FunctionCallInfoData locfcinfo;
        oidvector  *result;
 
-       result = (oidvector *)
-               DatumGetPointer(DirectFunctionCall3(array_recv,
-                                                                                       PointerGetDatum(buf),
-                                                                                       ObjectIdGetDatum(OIDOID),
-                                                                                       Int32GetDatum(-1)));
+       /*
+        * Normally one would call array_recv() using DirectFunctionCall3,
+        * but that does not work since array_recv wants to cache some data
+        * using fcinfo->flinfo->fn_extra.  So we need to pass it our own
+        * flinfo parameter.
+        */
+       InitFunctionCallInfoData(locfcinfo, fcinfo->flinfo, 3, NULL, NULL);
+
+       locfcinfo.arg[0] = PointerGetDatum(buf);
+       locfcinfo.arg[1] = ObjectIdGetDatum(OIDOID);
+       locfcinfo.arg[2] = Int32GetDatum(-1);
+       locfcinfo.argnull[0] = false;
+       locfcinfo.argnull[1] = false;
+       locfcinfo.argnull[2] = false;
+
+       result = (oidvector *) DatumGetPointer(array_recv(&locfcinfo));
+
+       Assert(!locfcinfo.isnull);
+
        /* sanity checks: oidvector must be 1-D, no nulls */
        if (result->ndim != 1 ||
                result->flags != 0 ||