Update array_iterator to use new fmgr interface.
authorTom Lane
Mon, 29 May 2000 20:30:11 +0000 (20:30 +0000)
committerTom Lane
Mon, 29 May 2000 20:30:11 +0000 (20:30 +0000)
contrib/array/array_iterator.c

index 3bee2e468a15767892c0eefd0a96c8c84ed9c049..447d5c6443eddd7b6616f2289937bda81c9840b5 100644 (file)
@@ -38,16 +38,13 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value)
    Form_pg_type typ_struct;
    bool        typbyval;
    int         typlen;
-   func_ptr    proc_fn;
-   int         pronargs;
    int         nitems,
-               i,
-               result;
+               i;
+   Datum       result;
    int         ndim,
               *dim;
    char       *p;
-   FmgrInfo    finf;           /* Tobias Gabele Jan 18 1999 */
-
+   FmgrInfo    finfo;
 
    /* Sanity checks */
    if ((array == (ArrayType *) NULL)
@@ -66,7 +63,8 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value)
    }
 
    /* Lookup element type information */
-   typ_tuple = SearchSysCacheTuple(TYPEOID, ObjectIdGetDatum(elemtype), 0, 0, 0);
+   typ_tuple = SearchSysCacheTuple(TYPEOID, ObjectIdGetDatum(elemtype),
+                                   0, 0, 0);
    if (!HeapTupleIsValid(typ_tuple))
    {
        elog(ERROR, "array_iterator: cache lookup failed for type %u", elemtype);
@@ -77,18 +75,15 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value)
    typbyval = typ_struct->typbyval;
 
    /* Lookup the function entry point */
-   proc_fn = (func_ptr) NULL;
-   fmgr_info(proc, &finf);     /* Tobias Gabele Jan 18 1999 */
-   proc_fn = finf.fn_addr;     /* Tobias Gabele Jan 18 1999 */
-   pronargs = finf.fn_nargs;   /* Tobias Gabele Jan 18 1999 */
-   if ((proc_fn == NULL) || (pronargs != 2))
+   fmgr_info(proc, &finfo);
+   if (finfo.fn_nargs != 2)
    {
-       elog(ERROR, "array_iterator: fmgr_info lookup failed for oid %u", proc);
+       elog(ERROR, "array_iterator: proc %u does not take 2 args", proc);
        return (0);
    }
 
    /* Scan the array and apply the operator to each element */
-   result = 0;
+   result = BoolGetDatum(false);
    p = ARR_DATA_PTR(array);
    for (i = 0; i < nitems; i++)
    {
@@ -97,27 +92,33 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value)
            switch (typlen)
            {
                case 1:
-                   result = (int) (*proc_fn) (*p, value);
+                   result = FunctionCall2(&finfo,
+                                          CharGetDatum(*p),
+                                          value);
                    break;
                case 2:
-                   result = (int) (*proc_fn) (*(int16 *) p, value);
+                   result = FunctionCall2(&finfo,
+                                          Int16GetDatum(*(int16 *) p),
+                                          value);
                    break;
                case 3:
                case 4:
-                   result = (int) (*proc_fn) (*(int32 *) p, value);
+                   result = FunctionCall2(&finfo,
+                                          Int32GetDatum(*(int32 *) p),
+                                          value);
                    break;
            }
            p += typlen;
        }
        else
        {
-           result = (int) (*proc_fn) (p, value);
+           result = FunctionCall2(&finfo, PointerGetDatum(p), value);
            if (typlen > 0)
                p += typlen;
            else
                p += INTALIGN(*(int32 *) p);
        }
-       if (result)
+       if (DatumGetBool(result))
        {
            if (!and)
                return (1);
@@ -129,7 +130,7 @@ array_iterator(Oid elemtype, Oid proc, int and, ArrayType *array, Datum value)
        }
    }
 
-   if (and && result)
+   if (and && DatumGetBool(result))
        return (1);
    else
        return (0);