Repair oidvectorrecv and int2vectorrecv, which I broke while changing
authorTom Lane
Thu, 2 Mar 2006 21:13:04 +0000 (21:13 +0000)
committerTom Lane
Thu, 2 Mar 2006 21:13:04 +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 d47dbfdab68d5c1e11b5af1cfab849e6c04616ed..fa3d5fa8db2a5bf7637927c8f692172d4a50db0a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.69 2005/11/17 22:14:53 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.70 2006/03/02 21:13:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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 (ARR_NDIM(result) != 1 ||
        ARR_HASNULL(result) ||
index c31dbf4f666d492164f0940d201a4e2e2fb544e2..9129bebea3c9479c8e1b0214a08847f5d45c1eec 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/oid.c,v 1.66 2005/11/22 18:17:23 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/oid.c,v 1.67 2006/03/02 21:13:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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 (ARR_NDIM(result) != 1 ||
        ARR_HASNULL(result) ||