Commit baef78d9 authored by PostgreSQL Daemon's avatar PostgreSQL Daemon

Thank god for searchable mail archives.

Patch by: wieck@sapserv.debis.de (Jan Wieck)

   One  of  the design rules of PostgreSQL is extensibility. And
   to follow this rule means (at least for me) that there should
   not  only  be a builtin PL.  Instead I would prefer a defined
   interface for PL implemetations.
parent 763ff8ae
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
# #
# #
# IDENTIFICATION # IDENTIFICATION
# $Header: /cvsroot/pgsql/src/Makefile.global.in,v 1.31 1997/12/20 18:36:26 scrappy Exp $ # $Header: /cvsroot/pgsql/src/Makefile.global.in,v 1.32 1998/01/15 19:41:35 pgsql Exp $
# #
# NOTES # NOTES
# Essentially all Postgres make files include this file and use the # Essentially all Postgres make files include this file and use the
...@@ -206,7 +206,7 @@ YFLAGS= @YFLAGS@ ...@@ -206,7 +206,7 @@ YFLAGS= @YFLAGS@
YACC= @YACC@ YACC= @YACC@
LEX= @LEX@ LEX= @LEX@
AROPT= @AROPT@ AROPT= @AROPT@
CFLAGS= -I$(SRCDIR)/include @CPPFLAGS@ @CFLAGS@ CFLAGS= -I$(SRCDIR)/include -I$(SRCDIR)/backend @CPPFLAGS@ @CFLAGS@
CFLAGS_SL= @SHARED_LIB@ CFLAGS_SL= @SHARED_LIB@
LDFLAGS= @LDFLAGS@ @LIBS@ LDFLAGS= @LDFLAGS@ @LIBS@
DLSUFFIX= @DLSUFFIX@ DLSUFFIX= @DLSUFFIX@
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# Makefile for access/common # Makefile for access/common
# #
# IDENTIFICATION # IDENTIFICATION
# $Header: /cvsroot/pgsql/src/backend/access/common/Makefile,v 1.8 1997/12/20 00:22:11 scrappy Exp $ # $Header: /cvsroot/pgsql/src/backend/access/common/Makefile,v 1.9 1998/01/15 19:41:42 pgsql Exp $
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
...@@ -23,7 +23,7 @@ all: SUBSYS.o ...@@ -23,7 +23,7 @@ all: SUBSYS.o
SUBSYS.o: $(OBJS) SUBSYS.o: $(OBJS)
$(LD) -r -o SUBSYS.o $(OBJS) $(LD) -r -o SUBSYS.o $(OBJS)
heapvalid.o tupdesc.o: ../../fmgr.h heaptuple.o heapvalid.o tupdesc.o: ../../fmgr.h
../../fmgr.h: ../../fmgr.h:
$(MAKE) -C ../.. fmgr.h $(MAKE) -C ../.. fmgr.h
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/common/Attic/indexvalid.c,v 1.16 1997/09/08 02:19:55 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/common/Attic/indexvalid.c,v 1.17 1998/01/15 19:41:44 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -66,13 +66,13 @@ index_keytest(IndexTuple tuple, ...@@ -66,13 +66,13 @@ index_keytest(IndexTuple tuple,
if (key[0].sk_flags & SK_COMMUTE) if (key[0].sk_flags & SK_COMMUTE)
{ {
test = (*(key[0].sk_func)) test = (*(fmgr_faddr(&key[0].sk_func)))
(DatumGetPointer(key[0].sk_argument), (DatumGetPointer(key[0].sk_argument),
datum) ? 1 : 0; datum) ? 1 : 0;
} }
else else
{ {
test = (*(key[0].sk_func)) test = (*(fmgr_faddr(&key[0].sk_func)))
(datum, (datum,
DatumGetPointer(key[0].sk_argument)) ? 1 : 0; DatumGetPointer(key[0].sk_argument)) ? 1 : 0;
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/common/scankey.c,v 1.10 1997/09/07 04:37:39 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/common/scankey.c,v 1.11 1998/01/15 19:41:46 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -61,7 +61,8 @@ ScanKeyEntryInitialize(ScanKey entry, ...@@ -61,7 +61,8 @@ ScanKeyEntryInitialize(ScanKey entry,
entry->sk_attno = attributeNumber; entry->sk_attno = attributeNumber;
entry->sk_procedure = procedure; entry->sk_procedure = procedure;
entry->sk_argument = argument; entry->sk_argument = argument;
fmgr_info(procedure, &entry->sk_func, &entry->sk_nargs); fmgr_info(procedure, &entry->sk_func);
entry->sk_nargs = entry->sk_func.fn_nargs;
Assert(ScanKeyEntryIsLegal(entry)); Assert(ScanKeyEntryIsLegal(entry));
} }
...@@ -565,10 +565,10 @@ gistAdjustKeys(Relation r, ...@@ -565,10 +565,10 @@ gistAdjustKeys(Relation r,
ev1p = &((GISTENTRY *) VARDATA(evec))[1]; ev1p = &((GISTENTRY *) VARDATA(evec))[1];
/* form union of decompressed entries */ /* form union of decompressed entries */
datum = (char *) (giststate->unionFn) (evec, &datumsize); datum = (*fmgr_faddr(&giststate->unionFn)) (evec, &datumsize);
/* did union leave decompressed version of oldud unchanged? */ /* did union leave decompressed version of oldud unchanged? */
(giststate->equalFn) (ev0p->pred, datum, &result); (*fmgr_faddr(&giststate->equalFn)) (ev0p->pred, datum, &result);
if (!result) if (!result)
{ {
TupleDesc td = RelationGetTupleDescriptor(r); TupleDesc td = RelationGetTupleDescriptor(r);
...@@ -743,7 +743,7 @@ gistSplit(Relation r, ...@@ -743,7 +743,7 @@ gistSplit(Relation r,
VARSIZE(entryvec) = (maxoff + 2) * sizeof(GISTENTRY) + VARHDRSZ; VARSIZE(entryvec) = (maxoff + 2) * sizeof(GISTENTRY) + VARHDRSZ;
/* now let the user-defined picksplit function set up the split vector */ /* now let the user-defined picksplit function set up the split vector */
(giststate->picksplitFn) (entryvec, &v); (*fmgr_faddr(&giststate->picksplitFn)) (entryvec, &v);
/* compress ldatum and rdatum */ /* compress ldatum and rdatum */
gistcentryinit(giststate, &tmpentry, v.spl_ldatum, (Relation) NULL, gistcentryinit(giststate, &tmpentry, v.spl_ldatum, (Relation) NULL,
...@@ -1072,7 +1072,7 @@ gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ ...@@ -1072,7 +1072,7 @@ gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */
size = IndexTupleSize(datum) - sizeof(IndexTupleData); size = IndexTupleSize(datum) - sizeof(IndexTupleData);
datum += sizeof(IndexTupleData); datum += sizeof(IndexTupleData);
gistdentryinit(giststate, &entry, datum, r, p, i, size, FALSE); gistdentryinit(giststate, &entry, datum, r, p, i, size, FALSE);
(giststate->penaltyFn) (&entry, &identry, &usize); (*fmgr_faddr(&giststate->penaltyFn)) (&entry, &identry, &usize);
if (which_grow < 0 || usize < which_grow) if (which_grow < 0 || usize < which_grow)
{ {
which = i; which = i;
...@@ -1150,8 +1150,6 @@ initGISTstate(GISTSTATE *giststate, Relation index) ...@@ -1150,8 +1150,6 @@ initGISTstate(GISTSTATE *giststate, Relation index)
RegProcedure penalty_proc, RegProcedure penalty_proc,
picksplit_proc, picksplit_proc,
equal_proc; equal_proc;
func_ptr user_fn;
int pronargs;
HeapTuple htup; HeapTuple htup;
IndexTupleForm itupform; IndexTupleForm itupform;
...@@ -1162,20 +1160,13 @@ initGISTstate(GISTSTATE *giststate, Relation index) ...@@ -1162,20 +1160,13 @@ initGISTstate(GISTSTATE *giststate, Relation index)
penalty_proc = index_getprocid(index, 1, GIST_PENALTY_PROC); penalty_proc = index_getprocid(index, 1, GIST_PENALTY_PROC);
picksplit_proc = index_getprocid(index, 1, GIST_PICKSPLIT_PROC); picksplit_proc = index_getprocid(index, 1, GIST_PICKSPLIT_PROC);
equal_proc = index_getprocid(index, 1, GIST_EQUAL_PROC); equal_proc = index_getprocid(index, 1, GIST_EQUAL_PROC);
fmgr_info(consistent_proc, &user_fn, &pronargs); fmgr_info(consistent_proc, &giststate->consistentFn);
giststate->consistentFn = user_fn; fmgr_info(union_proc, &giststate->unionFn);
fmgr_info(union_proc, &user_fn, &pronargs); fmgr_info(compress_proc, &giststate->compressFn);
giststate->unionFn = user_fn; fmgr_info(decompress_proc, &giststate->decompressFn);
fmgr_info(compress_proc, &user_fn, &pronargs); fmgr_info(penalty_proc, &giststate->penaltyFn);
giststate->compressFn = user_fn; fmgr_info(picksplit_proc, &giststate->picksplitFn);
fmgr_info(decompress_proc, &user_fn, &pronargs); fmgr_info(equal_proc, &giststate->equalFn);
giststate->decompressFn = user_fn;
fmgr_info(penalty_proc, &user_fn, &pronargs);
giststate->penaltyFn = user_fn;
fmgr_info(picksplit_proc, &user_fn, &pronargs);
giststate->picksplitFn = user_fn;
fmgr_info(equal_proc, &user_fn, &pronargs);
giststate->equalFn = user_fn;
/* see if key type is different from type of attribute being indexed */ /* see if key type is different from type of attribute being indexed */
htup = SearchSysCacheTuple(INDEXRELID, ObjectIdGetDatum(index->rd_id), htup = SearchSysCacheTuple(INDEXRELID, ObjectIdGetDatum(index->rd_id),
...@@ -1259,7 +1250,7 @@ gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r, ...@@ -1259,7 +1250,7 @@ gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r,
gistentryinit(*e, pr, r, pg, o, b, l); gistentryinit(*e, pr, r, pg, o, b, l);
if (giststate->haskeytype) if (giststate->haskeytype)
{ {
dep = (GISTENTRY *) ((giststate->decompressFn) (e)); dep = (GISTENTRY *) ((*fmgr_faddr(&giststate->decompressFn)) (e));
gistentryinit(*e, dep->pred, dep->rel, dep->page, dep->offset, dep->bytes, gistentryinit(*e, dep->pred, dep->rel, dep->page, dep->offset, dep->bytes,
dep->leafkey); dep->leafkey);
if (dep != e) if (dep != e)
...@@ -1280,7 +1271,7 @@ gistcentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r, ...@@ -1280,7 +1271,7 @@ gistcentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r,
gistentryinit(*e, pr, r, pg, o, b, l); gistentryinit(*e, pr, r, pg, o, b, l);
if (giststate->haskeytype) if (giststate->haskeytype)
{ {
cep = (GISTENTRY *) ((giststate->compressFn) (e)); cep = (GISTENTRY *) ((*fmgr_faddr(&giststate->compressFn)) (e));
gistentryinit(*e, cep->pred, cep->rel, cep->page, cep->offset, cep->bytes, gistentryinit(*e, cep->pred, cep->rel, cep->page, cep->offset, cep->bytes,
cep->leafkey); cep->leafkey);
if (cep != e) if (cep != e)
......
...@@ -283,13 +283,13 @@ gistindex_keytest(IndexTuple tuple, ...@@ -283,13 +283,13 @@ gistindex_keytest(IndexTuple tuple,
if (key[0].sk_flags & SK_COMMUTE) if (key[0].sk_flags & SK_COMMUTE)
{ {
test = (*(key[0].sk_func)) test = (*fmgr_faddr(&key[0].sk_func))
(DatumGetPointer(key[0].sk_argument), (DatumGetPointer(key[0].sk_argument),
&de, key[0].sk_procedure) ? 1 : 0; &de, key[0].sk_procedure) ? 1 : 0;
} }
else else
{ {
test = (*(key[0].sk_func)) test = (*fmgr_faddr(&key[0].sk_func))
(&de, (&de,
DatumGetPointer(key[0].sk_argument), DatumGetPointer(key[0].sk_argument),
key[0].sk_procedure) ? 1 : 0; key[0].sk_procedure) ? 1 : 0;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/index/Attic/istrat.c,v 1.15 1998/01/07 21:01:45 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/index/Attic/istrat.c,v 1.16 1998/01/15 19:42:02 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -242,22 +242,22 @@ StrategyTermEvaluate(StrategyTerm term, ...@@ -242,22 +242,22 @@ StrategyTermEvaluate(StrategyTerm term,
switch (operator->flags ^ entry->sk_flags) switch (operator->flags ^ entry->sk_flags)
{ {
case 0x0: case 0x0:
tmpres = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure, tmpres = (long) FMGR_PTR2(&entry->sk_func,
left, right); left, right);
break; break;
case SK_NEGATE: case SK_NEGATE:
tmpres = (long) !FMGR_PTR2(entry->sk_func, entry->sk_procedure, tmpres = (long) !FMGR_PTR2(&entry->sk_func,
left, right); left, right);
break; break;
case SK_COMMUTE: case SK_COMMUTE:
tmpres = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure, tmpres = (long) FMGR_PTR2(&entry->sk_func,
right, left); right, left);
break; break;
case SK_NEGATE | SK_COMMUTE: case SK_NEGATE | SK_COMMUTE:
tmpres = (long) !FMGR_PTR2(entry->sk_func, entry->sk_procedure, tmpres = (long) !FMGR_PTR2(&entry->sk_func,
right, left); right, left);
break; break;
...@@ -521,7 +521,8 @@ OperatorRelationFillScanKeyEntry(Relation operatorRelation, ...@@ -521,7 +521,8 @@ OperatorRelationFillScanKeyEntry(Relation operatorRelation,
entry->sk_flags = 0; entry->sk_flags = 0;
entry->sk_procedure = entry->sk_procedure =
((OperatorTupleForm) GETSTRUCT(tuple))->oprcode; ((OperatorTupleForm) GETSTRUCT(tuple))->oprcode;
fmgr_info(entry->sk_procedure, &entry->sk_func, &entry->sk_nargs); fmgr_info(entry->sk_procedure, &entry->sk_func);
entry->sk_nargs = entry->sk_func.fn_nargs;
if (!RegProcedureIsValid(entry->sk_procedure)) if (!RegProcedureIsValid(entry->sk_procedure))
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.24 1998/01/07 21:01:52 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.25 1998/01/15 19:42:10 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1487,8 +1487,7 @@ _bt_isequal(TupleDesc itupdesc, Page page, OffsetNumber offnum, ...@@ -1487,8 +1487,7 @@ _bt_isequal(TupleDesc itupdesc, Page page, OffsetNumber offnum,
if (entry->sk_flags & SK_ISNULL || null) if (entry->sk_flags & SK_ISNULL || null)
return (false); return (false);
result = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure, result = (long) FMGR_PTR2(&entry->sk_func, entry->sk_argument, datum);
entry->sk_argument, datum);
if (result != 0) if (result != 0)
return (false); return (false);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.29 1998/01/07 21:01:56 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.30 1998/01/15 19:42:13 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -677,8 +677,7 @@ _bt_compare(Relation rel, ...@@ -677,8 +677,7 @@ _bt_compare(Relation rel,
} }
else else
{ {
tmpres = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure, tmpres = (long) FMGR_PTR2(&entry->sk_func, entry->sk_argument, datum);
entry->sk_argument, datum);
} }
result = tmpres; result = tmpres;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtutils.c,v 1.17 1998/01/07 21:02:01 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtutils.c,v 1.18 1998/01/15 19:42:15 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -263,8 +263,7 @@ _bt_orderkeys(Relation relation, BTScanOpaque so) ...@@ -263,8 +263,7 @@ _bt_orderkeys(Relation relation, BTScanOpaque so)
{ {
/* yup, use the appropriate value */ /* yup, use the appropriate value */
test = test =
(long) FMGR_PTR2(cur->sk_func, cur->sk_procedure, (long) FMGR_PTR2(&cur->sk_func, cur->sk_argument, xform[j].sk_argument);
cur->sk_argument, xform[j].sk_argument);
if (test) if (test)
xform[j].sk_argument = cur->sk_argument; xform[j].sk_argument = cur->sk_argument;
else if (j == (BTEqualStrategyNumber - 1)) else if (j == (BTEqualStrategyNumber - 1))
...@@ -381,13 +380,13 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, Size *keysok) ...@@ -381,13 +380,13 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, Size *keysok)
if (key[0].sk_flags & SK_COMMUTE) if (key[0].sk_flags & SK_COMMUTE)
{ {
test = (int) (*(key[0].sk_func)) test = (int) (*fmgr_faddr(&key[0].sk_func))
(DatumGetPointer(key[0].sk_argument), (DatumGetPointer(key[0].sk_argument),
datum); datum);
} }
else else
{ {
test = (int) (*(key[0].sk_func)) test = (int) (*fmgr_faddr(&key[0].sk_func))
(datum, (datum,
DatumGetPointer(key[0].sk_argument)); DatumGetPointer(key[0].sk_argument));
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.21 1998/01/07 21:02:07 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.22 1998/01/15 19:42:19 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -44,9 +44,9 @@ typedef struct SPLITVEC ...@@ -44,9 +44,9 @@ typedef struct SPLITVEC
typedef struct RTSTATE typedef struct RTSTATE
{ {
func_ptr unionFn; /* union function */ FmgrInfo unionFn; /* union function */
func_ptr sizeFn; /* size function */ FmgrInfo sizeFn; /* size function */
func_ptr interFn; /* intersection function */ FmgrInfo interFn; /* intersection function */
} RTSTATE; } RTSTATE;
/* non-export function prototypes */ /* non-export function prototypes */
...@@ -430,10 +430,10 @@ rttighten(Relation r, ...@@ -430,10 +430,10 @@ rttighten(Relation r,
oldud = (char *) PageGetItem(p, PageGetItemId(p, stk->rts_child)); oldud = (char *) PageGetItem(p, PageGetItemId(p, stk->rts_child));
oldud += sizeof(IndexTupleData); oldud += sizeof(IndexTupleData);
(*rtstate->sizeFn) (oldud, &old_size); (*fmgr_faddr(&rtstate->sizeFn)) (oldud, &old_size);
datum = (char *) (*rtstate->unionFn) (oldud, datum); datum = (char *) (*fmgr_faddr(&rtstate->unionFn)) (oldud, datum);
(*rtstate->sizeFn) (datum, &newd_size); (*fmgr_faddr(&rtstate->sizeFn)) (datum, &newd_size);
if (newd_size != old_size) if (newd_size != old_size)
{ {
...@@ -462,7 +462,7 @@ rttighten(Relation r, ...@@ -462,7 +462,7 @@ rttighten(Relation r,
* union proc, which is guaranteed to return a rectangle. * union proc, which is guaranteed to return a rectangle.
*/ */
tdatum = (char *) (*rtstate->unionFn) (datum, datum); tdatum = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum, datum);
rttighten(r, stk->rts_parent, tdatum, att_size, rtstate); rttighten(r, stk->rts_parent, tdatum, att_size, rtstate);
pfree(tdatum); pfree(tdatum);
} }
...@@ -686,7 +686,7 @@ rtintinsert(Relation r, ...@@ -686,7 +686,7 @@ rtintinsert(Relation r,
WriteBuffer(b); WriteBuffer(b);
ldatum = (((char *) ltup) + sizeof(IndexTupleData)); ldatum = (((char *) ltup) + sizeof(IndexTupleData));
rdatum = (((char *) rtup) + sizeof(IndexTupleData)); rdatum = (((char *) rtup) + sizeof(IndexTupleData));
newdatum = (char *) (*rtstate->unionFn) (ldatum, rdatum); newdatum = (char *) (*fmgr_faddr(&rtstate->unionFn)) (ldatum, rdatum);
rttighten(r, stk->rts_parent, newdatum, rttighten(r, stk->rts_parent, newdatum,
(IndexTupleSize(rtup) - sizeof(IndexTupleData)), rtstate); (IndexTupleSize(rtup) - sizeof(IndexTupleData)), rtstate);
...@@ -765,10 +765,10 @@ picksplit(Relation r, ...@@ -765,10 +765,10 @@ picksplit(Relation r,
datum_beta = ((char *) item_2) + sizeof(IndexTupleData); datum_beta = ((char *) item_2) + sizeof(IndexTupleData);
/* compute the wasted space by unioning these guys */ /* compute the wasted space by unioning these guys */
union_d = (char *) (rtstate->unionFn) (datum_alpha, datum_beta); union_d = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_alpha, datum_beta);
(rtstate->sizeFn) (union_d, &size_union); (*fmgr_faddr(&rtstate->sizeFn)) (union_d, &size_union);
inter_d = (char *) (rtstate->interFn) (datum_alpha, datum_beta); inter_d = (char *) (*fmgr_faddr(&rtstate->interFn)) (datum_alpha, datum_beta);
(rtstate->sizeFn) (inter_d, &size_inter); (*fmgr_faddr(&rtstate->sizeFn)) (inter_d, &size_inter);
size_waste = size_union - size_inter; size_waste = size_union - size_inter;
pfree(union_d); pfree(union_d);
...@@ -798,12 +798,12 @@ picksplit(Relation r, ...@@ -798,12 +798,12 @@ picksplit(Relation r,
item_1 = (IndexTuple) PageGetItem(page, PageGetItemId(page, seed_1)); item_1 = (IndexTuple) PageGetItem(page, PageGetItemId(page, seed_1));
datum_alpha = ((char *) item_1) + sizeof(IndexTupleData); datum_alpha = ((char *) item_1) + sizeof(IndexTupleData);
datum_l = (char *) (*rtstate->unionFn) (datum_alpha, datum_alpha); datum_l = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_alpha, datum_alpha);
(*rtstate->sizeFn) (datum_l, &size_l); (*fmgr_faddr(&rtstate->sizeFn)) (datum_l, &size_l);
item_2 = (IndexTuple) PageGetItem(page, PageGetItemId(page, seed_2)); item_2 = (IndexTuple) PageGetItem(page, PageGetItemId(page, seed_2));
datum_beta = ((char *) item_2) + sizeof(IndexTupleData); datum_beta = ((char *) item_2) + sizeof(IndexTupleData);
datum_r = (char *) (*rtstate->unionFn) (datum_beta, datum_beta); datum_r = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_beta, datum_beta);
(*rtstate->sizeFn) (datum_r, &size_r); (*fmgr_faddr(&rtstate->sizeFn)) (datum_r, &size_r);
/* /*
* Now split up the regions between the two seeds. An important * Now split up the regions between the two seeds. An important
...@@ -851,10 +851,10 @@ picksplit(Relation r, ...@@ -851,10 +851,10 @@ picksplit(Relation r,
} }
datum_alpha = ((char *) item_1) + sizeof(IndexTupleData); datum_alpha = ((char *) item_1) + sizeof(IndexTupleData);
union_dl = (char *) (*rtstate->unionFn) (datum_l, datum_alpha); union_dl = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_l, datum_alpha);
union_dr = (char *) (*rtstate->unionFn) (datum_r, datum_alpha); union_dr = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_r, datum_alpha);
(*rtstate->sizeFn) (union_dl, &size_alpha); (*fmgr_faddr(&rtstate->sizeFn)) (union_dl, &size_alpha);
(*rtstate->sizeFn) (union_dr, &size_beta); (*fmgr_faddr(&rtstate->sizeFn)) (union_dr, &size_beta);
/* pick which page to add it to */ /* pick which page to add it to */
if (size_alpha - size_l < size_beta - size_r) if (size_alpha - size_l < size_beta - size_r)
...@@ -921,9 +921,9 @@ choose(Relation r, Page p, IndexTuple it, RTSTATE *rtstate) ...@@ -921,9 +921,9 @@ choose(Relation r, Page p, IndexTuple it, RTSTATE *rtstate)
{ {
datum = (char *) PageGetItem(p, PageGetItemId(p, i)); datum = (char *) PageGetItem(p, PageGetItemId(p, i));
datum += sizeof(IndexTupleData); datum += sizeof(IndexTupleData);
(*rtstate->sizeFn) (datum, &dsize); (*fmgr_faddr(&rtstate->sizeFn)) (datum, &dsize);
ud = (char *) (*rtstate->unionFn) (datum, id); ud = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum, id);
(*rtstate->sizeFn) (ud, &usize); (*fmgr_faddr(&rtstate->sizeFn)) (ud, &usize);
pfree(ud); pfree(ud);
if (which_grow < 0 || usize - dsize < which_grow) if (which_grow < 0 || usize - dsize < which_grow)
{ {
...@@ -991,18 +991,13 @@ initRtstate(RTSTATE *rtstate, Relation index) ...@@ -991,18 +991,13 @@ initRtstate(RTSTATE *rtstate, Relation index)
RegProcedure union_proc, RegProcedure union_proc,
size_proc, size_proc,
inter_proc; inter_proc;
func_ptr user_fn;
int pronargs;
union_proc = index_getprocid(index, 1, RT_UNION_PROC); union_proc = index_getprocid(index, 1, RT_UNION_PROC);
size_proc = index_getprocid(index, 1, RT_SIZE_PROC); size_proc = index_getprocid(index, 1, RT_SIZE_PROC);
inter_proc = index_getprocid(index, 1, RT_INTER_PROC); inter_proc = index_getprocid(index, 1, RT_INTER_PROC);
fmgr_info(union_proc, &user_fn, &pronargs); fmgr_info(union_proc, &rtstate->unionFn);
rtstate->unionFn = user_fn; fmgr_info(size_proc, &rtstate->sizeFn);
fmgr_info(size_proc, &user_fn, &pronargs); fmgr_info(inter_proc, &rtstate->interFn);
rtstate->sizeFn = user_fn;
fmgr_info(inter_proc, &user_fn, &pronargs);
rtstate->interFn = user_fn;
return; return;
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.2 1998/01/06 18:52:03 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.3 1998/01/15 19:42:26 pgsql Exp $
* *
* NOTES * NOTES
* See acl.h. * See acl.h.
...@@ -122,7 +122,8 @@ ChangeAcl(char *relname, ...@@ -122,7 +122,8 @@ ChangeAcl(char *relname,
if (!RelationIsValid(relation)) if (!RelationIsValid(relation))
elog(ERROR, "ChangeAcl: could not open '%s'??", elog(ERROR, "ChangeAcl: could not open '%s'??",
RelationRelationName); RelationRelationName);
fmgr_info(NameEqualRegProcedure, &relkey[0].sk_func, &relkey[0].sk_nargs); fmgr_info(NameEqualRegProcedure, &relkey[0].sk_func);
relkey[0].sk_nargs = relkey[0].sk_func.fn_nargs;
relkey[0].sk_argument = NameGetDatum(relname); relkey[0].sk_argument = NameGetDatum(relname);
hsdp = heap_beginscan(relation, hsdp = heap_beginscan(relation,
0, 0,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.34 1998/01/13 04:03:45 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.35 1998/01/15 19:42:27 pgsql Exp $
* *
* *
* INTERFACE ROUTINES * INTERFACE ROUTINES
...@@ -1373,8 +1373,8 @@ UpdateStats(Oid relid, long reltuples, bool hasindex) ...@@ -1373,8 +1373,8 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
char nulls[Natts_pg_class]; char nulls[Natts_pg_class];
char replace[Natts_pg_class]; char replace[Natts_pg_class];
fmgr_info(ObjectIdEqualRegProcedure, (func_ptr *) &key[0].sk_func, fmgr_info(ObjectIdEqualRegProcedure, &key[0].sk_func);
&key[0].sk_nargs); key[0].sk_nargs = key[0].sk_func.fn_nargs;
/* ---------------- /* ----------------
* This routine handles updates for both the heap and index relation * This routine handles updates for both the heap and index relation
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.19 1998/01/06 19:42:31 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.20 1998/01/15 19:42:30 pgsql Exp $
* *
* NOTES * NOTES
* these routines moved here from commands/define.c and somewhat cleaned up. * these routines moved here from commands/define.c and somewhat cleaned up.
...@@ -97,12 +97,12 @@ OperatorGetWithOpenRelation(Relation pg_operator_desc, ...@@ -97,12 +97,12 @@ OperatorGetWithOpenRelation(Relation pg_operator_desc,
{0, Anum_pg_operator_oprright, ObjectIdEqualRegProcedure}, {0, Anum_pg_operator_oprright, ObjectIdEqualRegProcedure},
}; };
fmgr_info(NameEqualRegProcedure, fmgr_info(NameEqualRegProcedure, &opKey[0].sk_func);
&opKey[0].sk_func, &opKey[0].sk_nargs); fmgr_info(ObjectIdEqualRegProcedure, &opKey[1].sk_func);
fmgr_info(ObjectIdEqualRegProcedure, fmgr_info(ObjectIdEqualRegProcedure, &opKey[2].sk_func);
&opKey[1].sk_func, &opKey[1].sk_nargs); opKey[0].sk_nargs = opKey[0].sk_func.fn_nargs;
fmgr_info(ObjectIdEqualRegProcedure, opKey[1].sk_nargs = opKey[1].sk_func.fn_nargs;
&opKey[2].sk_func, &opKey[2].sk_nargs); opKey[2].sk_nargs = opKey[2].sk_func.fn_nargs;
/* ---------------- /* ----------------
* form scan key * form scan key
...@@ -482,12 +482,12 @@ OperatorDef(char *operatorName, ...@@ -482,12 +482,12 @@ OperatorDef(char *operatorName,
{0, Anum_pg_operator_oprright, ObjectIdEqualRegProcedure}, {0, Anum_pg_operator_oprright, ObjectIdEqualRegProcedure},
}; };
fmgr_info(NameEqualRegProcedure, fmgr_info(NameEqualRegProcedure, &opKey[0].sk_func);
&opKey[0].sk_func, &opKey[0].sk_nargs); fmgr_info(ObjectIdEqualRegProcedure, &opKey[1].sk_func);
fmgr_info(ObjectIdEqualRegProcedure, fmgr_info(ObjectIdEqualRegProcedure, &opKey[2].sk_func);
&opKey[1].sk_func, &opKey[1].sk_nargs); opKey[0].sk_nargs = opKey[0].sk_func.fn_nargs;
fmgr_info(ObjectIdEqualRegProcedure, opKey[1].sk_nargs = opKey[1].sk_func.fn_nargs;
&opKey[2].sk_func, &opKey[2].sk_nargs); opKey[2].sk_nargs = opKey[2].sk_func.fn_nargs;
operatorObjectId = OperatorGet(operatorName, operatorObjectId = OperatorGet(operatorName,
leftTypeName, leftTypeName,
...@@ -781,8 +781,8 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId) ...@@ -781,8 +781,8 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
{0, ObjectIdAttributeNumber, ObjectIdEqualRegProcedure}, {0, ObjectIdAttributeNumber, ObjectIdEqualRegProcedure},
}; };
fmgr_info(ObjectIdEqualRegProcedure, fmgr_info(ObjectIdEqualRegProcedure, &opKey[0].sk_func);
&opKey[0].sk_func, &opKey[0].sk_nargs); opKey[0].sk_nargs = opKey[0].sk_func.fn_nargs;
for (i = 0; i < Natts_pg_operator; ++i) for (i = 0; i < Natts_pg_operator; ++i)
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.17 1998/01/06 19:42:33 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.18 1998/01/15 19:42:30 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -62,8 +62,8 @@ TypeGetWithOpenRelation(Relation pg_type_desc, ...@@ -62,8 +62,8 @@ TypeGetWithOpenRelation(Relation pg_type_desc,
* initialize the scan key and begin a scan of pg_type * initialize the scan key and begin a scan of pg_type
* ---------------- * ----------------
*/ */
fmgr_info(NameEqualRegProcedure, fmgr_info(NameEqualRegProcedure, &typeKey[0].sk_func);
&typeKey[0].sk_func, &typeKey[0].sk_nargs); typeKey[0].sk_nargs = typeKey[0].sk_func.fn_nargs;
typeKey[0].sk_argument = PointerGetDatum(typeName); typeKey[0].sk_argument = PointerGetDatum(typeName);
scan = heap_beginscan(pg_type_desc, scan = heap_beginscan(pg_type_desc,
...@@ -324,8 +324,8 @@ TypeCreate(char *typeName, ...@@ -324,8 +324,8 @@ TypeCreate(char *typeName,
{0, Anum_pg_type_typname, NameEqualRegProcedure} {0, Anum_pg_type_typname, NameEqualRegProcedure}
}; };
fmgr_info(NameEqualRegProcedure, fmgr_info(NameEqualRegProcedure, &typeKey[0].sk_func);
&typeKey[0].sk_func, &typeKey[0].sk_nargs); typeKey[0].sk_nargs = typeKey[0].sk_func.fn_nargs;
/* ---------------- /* ----------------
* check that the type is not already defined. * check that the type is not already defined.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.37 1998/01/05 16:38:46 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.38 1998/01/15 19:42:36 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -202,8 +202,7 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -202,8 +202,7 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
int32 attr_count, int32 attr_count,
i; i;
AttributeTupleForm *attr; AttributeTupleForm *attr;
func_ptr *out_functions; FmgrInfo *out_functions;
int dummy;
Oid out_func_oid; Oid out_func_oid;
Oid *elements; Oid *elements;
Datum value; Datum value;
...@@ -229,12 +228,12 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -229,12 +228,12 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
if (!binary) if (!binary)
{ {
out_functions = (func_ptr *) palloc(attr_count * sizeof(func_ptr)); out_functions = (FmgrInfo *) palloc(attr_count * sizeof(FmgrInfo));
elements = (Oid *) palloc(attr_count * sizeof(Oid)); elements = (Oid *) palloc(attr_count * sizeof(Oid));
for (i = 0; i < attr_count; i++) for (i = 0; i < attr_count; i++)
{ {
out_func_oid = (Oid) GetOutputFunction(attr[i]->atttypid); out_func_oid = (Oid) GetOutputFunction(attr[i]->atttypid);
fmgr_info(out_func_oid, &out_functions[i], &dummy); fmgr_info(out_func_oid, &out_functions[i]);
elements[i] = GetTypeElement(attr[i]->atttypid); elements[i] = GetTypeElement(attr[i]->atttypid);
} }
nulls = NULL; /* meaningless, but compiler doesn't know nulls = NULL; /* meaningless, but compiler doesn't know
...@@ -272,7 +271,7 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -272,7 +271,7 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
{ {
if (!isnull) if (!isnull)
{ {
string = (char *) (out_functions[i]) (value, elements[i]); string = (char *) (*fmgr_faddr(&out_functions[i])) (value, elements[i]);
CopyAttributeOut(fp, string, delim); CopyAttributeOut(fp, string, delim);
pfree(string); pfree(string);
} }
...@@ -357,9 +356,8 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -357,9 +356,8 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
HeapTuple tuple; HeapTuple tuple;
AttrNumber attr_count; AttrNumber attr_count;
AttributeTupleForm *attr; AttributeTupleForm *attr;
func_ptr *in_functions; FmgrInfo *in_functions;
int i, int i;
dummy;
Oid in_func_oid; Oid in_func_oid;
Datum *values; Datum *values;
char *nulls, char *nulls,
...@@ -498,12 +496,12 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -498,12 +496,12 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
if (!binary) if (!binary)
{ {
in_functions = (func_ptr *) palloc(attr_count * sizeof(func_ptr)); in_functions = (FmgrInfo *) palloc(attr_count * sizeof(FmgrInfo));
elements = (Oid *) palloc(attr_count * sizeof(Oid)); elements = (Oid *) palloc(attr_count * sizeof(Oid));
for (i = 0; i < attr_count; i++) for (i = 0; i < attr_count; i++)
{ {
in_func_oid = (Oid) GetInputFunction(attr[i]->atttypid); in_func_oid = (Oid) GetInputFunction(attr[i]->atttypid);
fmgr_info(in_func_oid, &in_functions[i], &dummy); fmgr_info(in_func_oid, &in_functions[i]);
elements[i] = GetTypeElement(attr[i]->atttypid); elements[i] = GetTypeElement(attr[i]->atttypid);
} }
} }
...@@ -574,7 +572,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim) ...@@ -574,7 +572,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
else else
{ {
values[i] = values[i] =
(Datum) (in_functions[i]) (string, (Datum) (*fmgr_faddr(&in_functions[i])) (string,
elements[i], elements[i],
attr[i]->attlen); attr[i]->attlen);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.20 1998/01/05 16:38:58 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.21 1998/01/15 19:42:38 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -277,8 +277,8 @@ RemoveType(char *typeName) /* type name to be removed */ ...@@ -277,8 +277,8 @@ RemoveType(char *typeName) /* type name to be removed */
#endif #endif
relation = heap_openr(TypeRelationName); relation = heap_openr(TypeRelationName);
fmgr_info(typeKey[0].sk_procedure, &typeKey[0].sk_func, fmgr_info(typeKey[0].sk_procedure, &typeKey[0].sk_func);
&typeKey[0].sk_nargs); typeKey[0].sk_nargs = typeKey[0].sk_func.fn_nargs;
/* Delete the primary type */ /* Delete the primary type */
...@@ -387,7 +387,8 @@ RemoveFunction(char *functionName, /* function name to be removed */ ...@@ -387,7 +387,8 @@ RemoveFunction(char *functionName, /* function name to be removed */
key[0].sk_argument = PointerGetDatum(functionName); key[0].sk_argument = PointerGetDatum(functionName);
fmgr_info(key[0].sk_procedure, &key[0].sk_func, &key[0].sk_nargs); fmgr_info(key[0].sk_procedure, &key[0].sk_func);
key[0].sk_nargs = key[0].sk_func.fn_nargs;
relation = heap_openr(ProcedureRelationName); relation = heap_openr(ProcedureRelationName);
scan = heap_beginscan(relation, 0, false, 1, key); scan = heap_beginscan(relation, 0, false, 1, key);
......
...@@ -43,7 +43,6 @@ static HeapTuple ...@@ -43,7 +43,6 @@ static HeapTuple
GetTupleForTrigger(Relation relation, ItemPointer tid, GetTupleForTrigger(Relation relation, ItemPointer tid,
bool before); bool before);
extern void fmgr_info(Oid procedureId, func_ptr * function, int *nargs);
extern GlobalMemory CacheCxt; extern GlobalMemory CacheCxt;
void void
...@@ -413,8 +412,7 @@ RelationBuildTriggers(Relation relation) ...@@ -413,8 +412,7 @@ RelationBuildTriggers(Relation relation)
build->tgname = nameout(&(pg_trigger->tgname)); build->tgname = nameout(&(pg_trigger->tgname));
build->tgfoid = pg_trigger->tgfoid; build->tgfoid = pg_trigger->tgfoid;
build->tgfunc = NULL; build->tgfunc.fn_addr = NULL;
build->tgplfunc = NULL;
build->tgtype = pg_trigger->tgtype; build->tgtype = pg_trigger->tgtype;
build->tgnargs = pg_trigger->tgnargs; build->tgnargs = pg_trigger->tgnargs;
memcpy(build->tgattr, &(pg_trigger->tgattr), 8 * sizeof(int16)); memcpy(build->tgattr, &(pg_trigger->tgattr), 8 * sizeof(int16));
...@@ -598,48 +596,17 @@ static HeapTuple ...@@ -598,48 +596,17 @@ static HeapTuple
ExecCallTriggerFunc(Trigger * trigger) ExecCallTriggerFunc(Trigger * trigger)
{ {
if (trigger->tgfunc != NULL) if (trigger->tgfunc.fn_addr == NULL)
{ {
return (HeapTuple) ((*(trigger->tgfunc)) ()); fmgr_info(trigger->tgfoid, &trigger->tgfunc);
} }
if (trigger->tgplfunc == NULL) if (trigger->tgfunc.fn_plhandler != NULL) {
{ return (HeapTuple) (*(trigger->tgfunc.fn_plhandler))
HeapTuple procTuple; (&trigger->tgfunc);
HeapTuple langTuple;
Form_pg_proc procStruct;
Form_pg_language langStruct;
int nargs;
procTuple = SearchSysCacheTuple(PROOID,
ObjectIdGetDatum(trigger->tgfoid),
0, 0, 0);
if (!HeapTupleIsValid(procTuple))
{
elog(ERROR, "ExecCallTriggerFunc(): Cache lookup for proc %ld failed",
ObjectIdGetDatum(trigger->tgfoid));
}
procStruct = (Form_pg_proc) GETSTRUCT(procTuple);
langTuple = SearchSysCacheTuple(LANOID,
ObjectIdGetDatum(procStruct->prolang),
0, 0, 0);
if (!HeapTupleIsValid(langTuple))
{
elog(ERROR, "ExecCallTriggerFunc(): Cache lookup for language %ld failed",
ObjectIdGetDatum(procStruct->prolang));
}
langStruct = (Form_pg_language) GETSTRUCT(langTuple);
if (langStruct->lanispl == false)
{
fmgr_info(trigger->tgfoid, &(trigger->tgfunc), &nargs);
return (HeapTuple) ((*(trigger->tgfunc)) ());
}
fmgr_info(langStruct->lanplcallfoid, &(trigger->tgplfunc), &nargs);
} }
return (HeapTuple) ((*(trigger->tgplfunc)) (trigger->tgfoid)); return (HeapTuple) ((*fmgr_faddr(&trigger->tgfunc)) ());
} }
HeapTuple HeapTuple
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.57 1998/01/05 16:39:05 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.58 1998/01/15 19:42:40 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -67,9 +67,9 @@ static int MESSAGE_LEVEL; /* message level */ ...@@ -67,9 +67,9 @@ static int MESSAGE_LEVEL; /* message level */
#define swapLong(a,b) {long tmp; tmp=a; a=b; b=tmp;} #define swapLong(a,b) {long tmp; tmp=a; a=b; b=tmp;}
#define swapInt(a,b) {int tmp; tmp=a; a=b; b=tmp;} #define swapInt(a,b) {int tmp; tmp=a; a=b; b=tmp;}
#define swapDatum(a,b) {Datum tmp; tmp=a; a=b; b=tmp;} #define swapDatum(a,b) {Datum tmp; tmp=a; a=b; b=tmp;}
#define VacAttrStatsEqValid(stats) ( stats->f_cmpeq != NULL ) #define VacAttrStatsEqValid(stats) ( stats->f_cmpeq.fn_addr != NULL )
#define VacAttrStatsLtGtValid(stats) ( stats->f_cmplt != NULL && \ #define VacAttrStatsLtGtValid(stats) ( stats->f_cmplt.fn_addr != NULL && \
stats->f_cmpgt != NULL && \ stats->f_cmpgt.fn_addr != NULL && \
RegProcedureIsValid(stats->outfunc) ) RegProcedureIsValid(stats->outfunc) )
...@@ -484,35 +484,29 @@ vc_vacone(Oid relid, bool analyze, List *va_cols) ...@@ -484,35 +484,29 @@ vc_vacone(Oid relid, bool analyze, List *va_cols)
func_operator = oper("=", stats->attr->atttypid, stats->attr->atttypid, true); func_operator = oper("=", stats->attr->atttypid, stats->attr->atttypid, true);
if (func_operator != NULL) if (func_operator != NULL)
{ {
int nargs;
pgopform = (OperatorTupleForm) GETSTRUCT(func_operator); pgopform = (OperatorTupleForm) GETSTRUCT(func_operator);
fmgr_info(pgopform->oprcode, &(stats->f_cmpeq), &nargs); fmgr_info(pgopform->oprcode, &(stats->f_cmpeq));
} }
else else
stats->f_cmpeq = NULL; stats->f_cmpeq.fn_addr = NULL;
func_operator = oper("<", stats->attr->atttypid, stats->attr->atttypid, true); func_operator = oper("<", stats->attr->atttypid, stats->attr->atttypid, true);
if (func_operator != NULL) if (func_operator != NULL)
{ {
int nargs;
pgopform = (OperatorTupleForm) GETSTRUCT(func_operator); pgopform = (OperatorTupleForm) GETSTRUCT(func_operator);
fmgr_info(pgopform->oprcode, &(stats->f_cmplt), &nargs); fmgr_info(pgopform->oprcode, &(stats->f_cmplt));
} }
else else
stats->f_cmplt = NULL; stats->f_cmplt.fn_addr = NULL;
func_operator = oper(">", stats->attr->atttypid, stats->attr->atttypid, true); func_operator = oper(">", stats->attr->atttypid, stats->attr->atttypid, true);
if (func_operator != NULL) if (func_operator != NULL)
{ {
int nargs;
pgopform = (OperatorTupleForm) GETSTRUCT(func_operator); pgopform = (OperatorTupleForm) GETSTRUCT(func_operator);
fmgr_info(pgopform->oprcode, &(stats->f_cmpgt), &nargs); fmgr_info(pgopform->oprcode, &(stats->f_cmpgt));
} }
else else
stats->f_cmpgt = NULL; stats->f_cmpgt.fn_addr = NULL;
pgttup = SearchSysCacheTuple(TYPOID, pgttup = SearchSysCacheTuple(TYPOID,
ObjectIdGetDatum(stats->attr->atttypid), ObjectIdGetDatum(stats->attr->atttypid),
...@@ -1671,29 +1665,29 @@ vc_attrstats(Relation onerel, VRelStats *vacrelstats, HeapTuple htup) ...@@ -1671,29 +1665,29 @@ vc_attrstats(Relation onerel, VRelStats *vacrelstats, HeapTuple htup)
} }
if (VacAttrStatsLtGtValid(stats)) if (VacAttrStatsLtGtValid(stats))
{ {
if ((*(stats->f_cmplt)) (value, stats->min)) if ((*fmgr_faddr(&stats->f_cmplt)) (value, stats->min))
{ {
vc_bucketcpy(stats->attr, value, &stats->min, &stats->min_len); vc_bucketcpy(stats->attr, value, &stats->min, &stats->min_len);
stats->min_cnt = 0; stats->min_cnt = 0;
} }
if ((*(stats->f_cmpgt)) (value, stats->max)) if ((*fmgr_faddr(&stats->f_cmpgt)) (value, stats->max))
{ {
vc_bucketcpy(stats->attr, value, &stats->max, &stats->max_len); vc_bucketcpy(stats->attr, value, &stats->max, &stats->max_len);
stats->max_cnt = 0; stats->max_cnt = 0;
} }
if ((*(stats->f_cmpeq)) (value, stats->min)) if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->min))
stats->min_cnt++; stats->min_cnt++;
else if ((*(stats->f_cmpeq)) (value, stats->max)) else if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->max))
stats->max_cnt++; stats->max_cnt++;
} }
if ((*(stats->f_cmpeq)) (value, stats->best)) if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->best))
stats->best_cnt++; stats->best_cnt++;
else if ((*(stats->f_cmpeq)) (value, stats->guess1)) else if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->guess1))
{ {
stats->guess1_cnt++; stats->guess1_cnt++;
stats->guess1_hits++; stats->guess1_hits++;
} }
else if ((*(stats->f_cmpeq)) (value, stats->guess2)) else if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->guess2))
stats->guess2_hits++; stats->guess2_hits++;
else else
value_hit = false; value_hit = false;
...@@ -1880,9 +1874,8 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst ...@@ -1880,9 +1874,8 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst
* *
pgcform->relname.data) */ ) pgcform->relname.data) */ )
{ {
func_ptr out_function; FmgrInfo out_function;
char *out_string; char *out_string;
int dummy;
for (i = 0; i < Natts_pg_statistic; ++i) for (i = 0; i < Natts_pg_statistic; ++i)
nulls[i] = ' '; nulls[i] = ' ';
...@@ -1895,11 +1888,11 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst ...@@ -1895,11 +1888,11 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst
values[i++] = (Datum) relid; /* 1 */ values[i++] = (Datum) relid; /* 1 */
values[i++] = (Datum) attp->attnum; /* 2 */ values[i++] = (Datum) attp->attnum; /* 2 */
values[i++] = (Datum) InvalidOid; /* 3 */ values[i++] = (Datum) InvalidOid; /* 3 */
fmgr_info(stats->outfunc, &out_function, &dummy); fmgr_info(stats->outfunc, &out_function);
out_string = (*out_function) (stats->min, stats->attr->atttypid); out_string = (*fmgr_faddr(&out_function)) (stats->min, stats->attr->atttypid);
values[i++] = (Datum) fmgr(TextInRegProcedure, out_string); values[i++] = (Datum) fmgr(TextInRegProcedure, out_string);
pfree(out_string); pfree(out_string);
out_string = (char *) (*out_function) (stats->max, stats->attr->atttypid); out_string = (char *) (*fmgr_faddr(&out_function)) (stats->max, stats->attr->atttypid);
values[i++] = (Datum) fmgr(TextInRegProcedure, out_string); values[i++] = (Datum) fmgr(TextInRegProcedure, out_string);
pfree(out_string); pfree(out_string);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.22 1998/01/07 21:02:47 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.23 1998/01/15 19:44:24 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -826,8 +826,7 @@ ExecMakeFunctionResult(Node *node, ...@@ -826,8 +826,7 @@ ExecMakeFunctionResult(Node *node,
if (fcache->nullVect[i] == true) if (fcache->nullVect[i] == true)
*isNull = true; *isNull = true;
return ((Datum) fmgr_c(fcache->func, fcache->foid, fcache->nargs, return ((Datum) fmgr_c(&fcache->func, (FmgrValues *) argv, isNull));
(FmgrValues *) argv, isNull));
} }
} }
......
...@@ -39,12 +39,9 @@ typedef struct AggFuncInfo ...@@ -39,12 +39,9 @@ typedef struct AggFuncInfo
Oid xfn1_oid; Oid xfn1_oid;
Oid xfn2_oid; Oid xfn2_oid;
Oid finalfn_oid; Oid finalfn_oid;
func_ptr xfn1; FmgrInfo xfn1;
func_ptr xfn2; FmgrInfo xfn2;
func_ptr finalfn; FmgrInfo finalfn;
int xfn1_nargs;
int xfn2_nargs;
int finalfn_nargs;
} AggFuncInfo; } AggFuncInfo;
static Datum aggGetAttr(TupleTableSlot *tuple, Aggreg *agg, bool *isNull); static Datum aggGetAttr(TupleTableSlot *tuple, Aggreg *agg, bool *isNull);
...@@ -160,12 +157,6 @@ ExecAgg(Agg *node) ...@@ -160,12 +157,6 @@ ExecAgg(Agg *node)
Oid xfn1_oid, Oid xfn1_oid,
xfn2_oid, xfn2_oid,
finalfn_oid; finalfn_oid;
func_ptr xfn1_ptr,
xfn2_ptr,
finalfn_ptr;
int xfn1_nargs,
xfn2_nargs,
finalfn_nargs;
agg = aggregates[i]; agg = aggregates[i];
...@@ -191,18 +182,14 @@ ExecAgg(Agg *node) ...@@ -191,18 +182,14 @@ ExecAgg(Agg *node)
if (OidIsValid(finalfn_oid)) if (OidIsValid(finalfn_oid))
{ {
fmgr_info(finalfn_oid, &finalfn_ptr, &finalfn_nargs); fmgr_info(finalfn_oid, &aggFuncInfo[i].finalfn);
aggFuncInfo[i].finalfn_oid = finalfn_oid; aggFuncInfo[i].finalfn_oid = finalfn_oid;
aggFuncInfo[i].finalfn = finalfn_ptr;
aggFuncInfo[i].finalfn_nargs = finalfn_nargs;
} }
if (OidIsValid(xfn2_oid)) if (OidIsValid(xfn2_oid))
{ {
fmgr_info(xfn2_oid, &xfn2_ptr, &xfn2_nargs); fmgr_info(xfn2_oid, &aggFuncInfo[i].xfn2);
aggFuncInfo[i].xfn2_oid = xfn2_oid; aggFuncInfo[i].xfn2_oid = xfn2_oid;
aggFuncInfo[i].xfn2 = xfn2_ptr;
aggFuncInfo[i].xfn2_nargs = xfn2_nargs;
value2[i] = (Datum) AggNameGetInitVal((char *) aggname, value2[i] = (Datum) AggNameGetInitVal((char *) aggname,
aggp->aggbasetype, aggp->aggbasetype,
2, 2,
...@@ -219,10 +206,8 @@ ExecAgg(Agg *node) ...@@ -219,10 +206,8 @@ ExecAgg(Agg *node)
if (OidIsValid(xfn1_oid)) if (OidIsValid(xfn1_oid))
{ {
fmgr_info(xfn1_oid, &xfn1_ptr, &xfn1_nargs); fmgr_info(xfn1_oid, &aggFuncInfo[i].xfn1);
aggFuncInfo[i].xfn1_oid = xfn1_oid; aggFuncInfo[i].xfn1_oid = xfn1_oid;
aggFuncInfo[i].xfn1 = xfn1_ptr;
aggFuncInfo[i].xfn1_nargs = xfn1_nargs;
value1[i] = (Datum) AggNameGetInitVal((char *) aggname, value1[i] = (Datum) AggNameGetInitVal((char *) aggname,
aggp->aggbasetype, aggp->aggbasetype,
1, 1,
...@@ -321,7 +306,7 @@ ExecAgg(Agg *node) ...@@ -321,7 +306,7 @@ ExecAgg(Agg *node)
if (isNull && !aggregates[i]->usenulls) if (isNull && !aggregates[i]->usenulls)
continue; /* ignore this tuple for this agg */ continue; /* ignore this tuple for this agg */
if (aggfns->xfn1) if (aggfns->xfn1.fn_addr != NULL)
{ {
if (noInitValue[i]) if (noInitValue[i])
{ {
...@@ -389,20 +374,19 @@ ExecAgg(Agg *node) ...@@ -389,20 +374,19 @@ ExecAgg(Agg *node)
args[0] = value1[i]; args[0] = value1[i];
args[1] = newVal; args[1] = newVal;
value1[i] = value1[i] =
(Datum) fmgr_c(aggfns->xfn1, aggfns->xfn1_oid, (Datum) fmgr_c(&aggfns->xfn1,
aggfns->xfn1_nargs, (FmgrValues *) args, (FmgrValues *) args,
&isNull1); &isNull1);
Assert(!isNull1); Assert(!isNull1);
} }
} }
if (aggfns->xfn2) if (aggfns->xfn2.fn_addr != NULL)
{ {
Datum xfn2_val = value2[i]; Datum xfn2_val = value2[i];
value2[i] = value2[i] =
(Datum) fmgr_c(aggfns->xfn2, aggfns->xfn2_oid, (Datum) fmgr_c(&aggfns->xfn2,
aggfns->xfn2_nargs,
(FmgrValues *) &xfn2_val, &isNull2); (FmgrValues *) &xfn2_val, &isNull2);
Assert(!isNull2); Assert(!isNull2);
} }
...@@ -437,29 +421,27 @@ ExecAgg(Agg *node) ...@@ -437,29 +421,27 @@ ExecAgg(Agg *node)
* seems to fix behavior for avg() aggregate. -tgl 12/96 * seems to fix behavior for avg() aggregate. -tgl 12/96
*/ */
} }
else if (aggfns->finalfn && nTuplesAgged > 0) else if (aggfns->finalfn.fn_addr != NULL && nTuplesAgged > 0)
{ {
if (aggfns->finalfn_nargs > 1) if (aggfns->finalfn.fn_nargs > 1)
{ {
args[0] = (char *) value1[i]; args[0] = (char *) value1[i];
args[1] = (char *) value2[i]; args[1] = (char *) value2[i];
} }
else if (aggfns->xfn1) else if (aggfns->xfn1.fn_addr != NULL)
{ {
args[0] = (char *) value1[i]; args[0] = (char *) value1[i];
} }
else if (aggfns->xfn2) else if (aggfns->xfn2.fn_addr != NULL)
{ {
args[0] = (char *) value2[i]; args[0] = (char *) value2[i];
} }
else else
elog(ERROR, "ExecAgg: no valid transition functions??"); elog(WARN, "ExecAgg: no valid transition functions??");
value1[i] = value1[i] = (Datum) fmgr_c(&aggfns->finalfn,
(Datum) fmgr_c(aggfns->finalfn, aggfns->finalfn_oid, (FmgrValues *) args, &(nulls[i]));
aggfns->finalfn_nargs, (FmgrValues *) args,
&(nulls[i]));
} }
else if (aggfns->xfn1) else if (aggfns->xfn1.fn_addr != NULL)
{ {
/* /*
...@@ -467,7 +449,7 @@ ExecAgg(Agg *node) ...@@ -467,7 +449,7 @@ ExecAgg(Agg *node)
* fix the else part. -ay 2/95) * fix the else part. -ay 2/95)
*/ */
} }
else if (aggfns->xfn2) else if (aggfns->xfn2.fn_addr != NULL)
{ {
value1[i] = value2[i]; value1[i] = value2[i];
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.13 1998/01/07 21:04:17 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.14 1998/01/15 19:44:41 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -416,7 +416,8 @@ find_inheritance_children(Oid inhparent) ...@@ -416,7 +416,8 @@ find_inheritance_children(Oid inhparent)
List *list = NIL; List *list = NIL;
Oid inhrelid; Oid inhrelid;
fmgr_info(F_OIDEQ, &key[0].sk_func, &key[0].sk_nargs); fmgr_info(F_OIDEQ, &key[0].sk_func);
key[0].sk_nargs = key[0].sk_func.fn_nargs;
key[0].sk_argument = ObjectIdGetDatum((Oid) inhparent); key[0].sk_argument = ObjectIdGetDatum((Oid) inhparent);
relation = heap_openr(InheritsRelationName); relation = heap_openr(InheritsRelationName);
...@@ -452,7 +453,8 @@ VersionGetParents(Oid verrelid) ...@@ -452,7 +453,8 @@ VersionGetParents(Oid verrelid)
Oid verbaseid; Oid verbaseid;
List *list = NIL; List *list = NIL;
fmgr_info(F_OIDEQ, &key[0].sk_func, &key[0].sk_nargs); fmgr_info(F_OIDEQ, &key[0].sk_func);
key[0].sk_nargs = key[0].sk_func.fn_nargs;
relation = heap_openr(VersionRelationName); relation = heap_openr(VersionRelationName);
key[0].sk_argument = ObjectIdGetDatum(verrelid); key[0].sk_argument = ObjectIdGetDatum(verrelid);
scan = heap_beginscan(relation, 0, false, 1, key); scan = heap_beginscan(relation, 0, false, 1, key);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# #
# #
# IDENTIFICATION # IDENTIFICATION
# $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.5 1997/10/28 15:02:24 vadim Exp $ # $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.6 1998/01/15 19:44:50 pgsql Exp $
# #
# NOTES # NOTES
# Passes any -D options on to cpp prior to generating the list # Passes any -D options on to cpp prior to generating the list
...@@ -81,7 +81,7 @@ cat > $HFILE <<FuNkYfMgRsTuFf ...@@ -81,7 +81,7 @@ cat > $HFILE <<FuNkYfMgRsTuFf
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: Gen_fmgrtab.sh.in,v 1.5 1997/10/28 15:02:24 vadim Exp $ * $Id: Gen_fmgrtab.sh.in,v 1.6 1998/01/15 19:44:50 pgsql Exp $
* *
* NOTES * NOTES
* ****************************** * ******************************
...@@ -111,16 +111,21 @@ typedef struct { ...@@ -111,16 +111,21 @@ typedef struct {
char *data[MAXFMGRARGS]; char *data[MAXFMGRARGS];
} FmgrValues; } FmgrValues;
typedef struct {
func_ptr fn_addr;
func_ptr fn_plhandler;
Oid fn_oid;
int fn_nargs;
} FmgrInfo;
/* /*
* defined in fmgr.c * defined in fmgr.c
*/ */
extern char *fmgr_pl(Oid func_id, int n_arguments, FmgrValues *values, extern char *fmgr_c(FmgrInfo *finfo, FmgrValues *values, bool *isNull);
bool *isNull); extern void fmgr_info(Oid procedureId, FmgrInfo *finfo);
extern char *fmgr_c(func_ptr user_fn, Oid func_id, int n_arguments, extern func_ptr fmgr_faddr(FmgrInfo *finfo);
FmgrValues *values, bool *isNull);
extern void fmgr_info(Oid procedureId, func_ptr *function, int *nargs);
extern char *fmgr(Oid procedureId, ... ); extern char *fmgr(Oid procedureId, ... );
extern char *fmgr_ptr(func_ptr user_fn, Oid func_id, ... ); extern char *fmgr_ptr(FmgrInfo *finfo, ... );
extern char *fmgr_array_args(Oid procedureId, int nargs, extern char *fmgr_array_args(Oid procedureId, int nargs,
char *args[], bool *isNull); char *args[], bool *isNull);
...@@ -139,11 +144,11 @@ extern void load_file(char *filename); ...@@ -139,11 +144,11 @@ extern void load_file(char *filename);
* we must). * we must).
*/ */
#ifdef TRACE_FMGR_PTR #ifdef TRACE_FMGR_PTR
#define FMGR_PTR2(FP, FID, ARG1, ARG2) \ #define FMGR_PTR2(FINFO, ARG1, ARG2) \
fmgr_ptr(FP, FID, 2, ARG1, ARG2) fmgr_ptr(FINFO, 2, ARG1, ARG2)
#else #else
#define FMGR_PTR2(FP, FID, ARG1, ARG2) \ #define FMGR_PTR2(FINFO, ARG1, ARG2) \
((FP) ? (*((func_ptr)(FP)))(ARG1, ARG2) : fmgr(FID, ARG1, ARG2)) (((FINFO)->fn_addr) ? (*(fmgr_faddr(FINFO)))(ARG1, ARG2) : fmgr((FINFO)->fn_oid, ARG1, ARG2))
#endif #endif
/* /*
...@@ -177,7 +182,7 @@ cat > $TABCFILE <<FuNkYfMgRtAbStUfF ...@@ -177,7 +182,7 @@ cat > $TABCFILE <<FuNkYfMgRtAbStUfF
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.5 1997/10/28 15:02:24 vadim Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/Attic/Gen_fmgrtab.sh.in,v 1.6 1998/01/15 19:44:50 pgsql Exp $
* *
* NOTES * NOTES
* *
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.23 1998/01/05 16:39:41 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.24 1998/01/15 19:45:01 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
static int _ArrayCount(char *str, int dim[], int typdelim); static int _ArrayCount(char *str, int dim[], int typdelim);
static char * static char *
_ReadArrayStr(char *arrayStr, int nitems, int ndim, int dim[], _ReadArrayStr(char *arrayStr, int nitems, int ndim, int dim[],
func_ptr inputproc, Oid typelem, char typdelim, FmgrInfo *inputproc, Oid typelem, char typdelim,
int typlen, bool typbyval, char typalign, int typlen, bool typbyval, char typalign,
int *nbytes); int *nbytes);
...@@ -105,10 +105,9 @@ array_in(char *string, /* input array in external form */ ...@@ -105,10 +105,9 @@ array_in(char *string, /* input array in external form */
*p, *p,
*q, *q,
*r; *r;
func_ptr inputproc; FmgrInfo inputproc;
int i, int i,
nitems, nitems;
dummy;
int32 nbytes; int32 nbytes;
char *dataPtr; char *dataPtr;
ArrayType *retval = NULL; ArrayType *retval = NULL;
...@@ -120,7 +119,7 @@ array_in(char *string, /* input array in external form */ ...@@ -120,7 +119,7 @@ array_in(char *string, /* input array in external form */
system_cache_lookup(element_type, true, &typlen, &typbyval, &typdelim, system_cache_lookup(element_type, true, &typlen, &typbyval, &typdelim,
&typelem, &typinput, &typalign); &typelem, &typinput, &typalign);
fmgr_info(typinput, &inputproc, &dummy); fmgr_info(typinput, &inputproc);
string_save = (char *) palloc(strlen(string) + 3); string_save = (char *) palloc(strlen(string) + 3);
strcpy(string_save, string); strcpy(string_save, string);
...@@ -208,7 +207,7 @@ array_in(char *string, /* input array in external form */ ...@@ -208,7 +207,7 @@ array_in(char *string, /* input array in external form */
{ {
/* array not a large object */ /* array not a large object */
dataPtr = dataPtr =
(char *) _ReadArrayStr(p, nitems, ndim, dim, inputproc, typelem, (char *) _ReadArrayStr(p, nitems, ndim, dim, &inputproc, typelem,
typdelim, typlen, typbyval, typalign, typdelim, typlen, typbyval, typalign,
&nbytes); &nbytes);
nbytes += ARR_OVERHEAD(ndim); nbytes += ARR_OVERHEAD(ndim);
...@@ -367,7 +366,7 @@ _ReadArrayStr(char *arrayStr, ...@@ -367,7 +366,7 @@ _ReadArrayStr(char *arrayStr,
int nitems, int nitems,
int ndim, int ndim,
int dim[], int dim[],
func_ptr inputproc, /* function used for the FmgrInfo *inputproc, /* function used for the
* conversion */ * conversion */
Oid typelem, Oid typelem,
char typdelim, char typdelim,
...@@ -461,7 +460,7 @@ _ReadArrayStr(char *arrayStr, ...@@ -461,7 +460,7 @@ _ReadArrayStr(char *arrayStr,
*q = '\0'; *q = '\0';
if (i >= nitems) if (i >= nitems)
elog(ERROR, "array_in: illformed array constant"); elog(ERROR, "array_in: illformed array constant");
values[i] = (*inputproc) (p, typelem); values[i] = (*fmgr_faddr(inputproc)) (p, typelem);
p = ++q; p = ++q;
if (!eoArray) if (!eoArray)
...@@ -620,7 +619,7 @@ array_out(ArrayType *v, Oid element_type) ...@@ -620,7 +619,7 @@ array_out(ArrayType *v, Oid element_type)
char typdelim; char typdelim;
Oid typoutput, Oid typoutput,
typelem; typelem;
func_ptr outputproc; FmgrInfo outputproc;
char typalign; char typalign;
char *p, char *p,
...@@ -634,7 +633,6 @@ array_out(ArrayType *v, Oid element_type) ...@@ -634,7 +633,6 @@ array_out(ArrayType *v, Oid element_type)
k, k,
indx[MAXDIM]; indx[MAXDIM];
bool dummy_bool; bool dummy_bool;
int dummy_int;
int ndim, int ndim,
*dim; *dim;
...@@ -662,7 +660,7 @@ array_out(ArrayType *v, Oid element_type) ...@@ -662,7 +660,7 @@ array_out(ArrayType *v, Oid element_type)
system_cache_lookup(element_type, false, &typlen, &typbyval, system_cache_lookup(element_type, false, &typlen, &typbyval,
&typdelim, &typelem, &typoutput, &typalign); &typdelim, &typelem, &typoutput, &typalign);
fmgr_info(typoutput, &outputproc, &dummy_int); fmgr_info(typoutput, &outputproc);
sprintf(delim, "%c", typdelim); sprintf(delim, "%c", typdelim);
ndim = ARR_NDIM(v); ndim = ARR_NDIM(v);
dim = ARR_DIMS(v); dim = ARR_DIMS(v);
...@@ -688,21 +686,21 @@ array_out(ArrayType *v, Oid element_type) ...@@ -688,21 +686,21 @@ array_out(ArrayType *v, Oid element_type)
switch (typlen) switch (typlen)
{ {
case 1: case 1:
values[i] = (*outputproc) (*p, typelem); values[i] = (*fmgr_faddr(&outputproc)) (*p, typelem);
break; break;
case 2: case 2:
values[i] = (*outputproc) (*(int16 *) p, typelem); values[i] = (*fmgr_faddr(&outputproc)) (*(int16 *) p, typelem);
break; break;
case 3: case 3:
case 4: case 4:
values[i] = (*outputproc) (*(int32 *) p, typelem); values[i] = (*fmgr_faddr(&outputproc)) (*(int32 *) p, typelem);
break; break;
} }
p += typlen; p += typlen;
} }
else else
{ {
values[i] = (*outputproc) (p, typelem); values[i] = (*fmgr_faddr(&outputproc)) (p, typelem);
if (typlen > 0) if (typlen > 0)
p += typlen; p += typlen;
else else
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.11 1998/01/05 16:40:17 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.12 1998/01/15 19:45:09 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -117,8 +117,8 @@ SetDefine(char *querystr, char *typename) ...@@ -117,8 +117,8 @@ SetDefine(char *querystr, char *typename)
procrel = heap_openr(ProcedureRelationName); procrel = heap_openr(ProcedureRelationName);
RelationSetLockForWrite(procrel); RelationSetLockForWrite(procrel);
fmgr_info(ObjectIdEqualRegProcedure, fmgr_info(ObjectIdEqualRegProcedure,
&oidKey[0].sk_func, &oidKey[0].sk_func);
&oidKey[0].sk_nargs); oidKey[0].sk_nargs = oidKey[0].sk_func.fn_nargs;
oidKey[0].sk_argument = ObjectIdGetDatum(setoid); oidKey[0].sk_argument = ObjectIdGetDatum(setoid);
pg_proc_scan = heap_beginscan(procrel, pg_proc_scan = heap_beginscan(procrel,
0, 0,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.20 1998/01/07 21:06:08 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.21 1998/01/15 19:45:28 pgsql Exp $
* *
* Notes: * Notes:
* XXX This needs to use exception.h to handle recovery when * XXX This needs to use exception.h to handle recovery when
...@@ -213,8 +213,8 @@ CatalogCacheInitializeCache(struct catcache * cache, ...@@ -213,8 +213,8 @@ CatalogCacheInitializeCache(struct catcache * cache,
EQPROC(tupdesc->attrs[cache->cc_key[i] - 1]->atttypid); EQPROC(tupdesc->attrs[cache->cc_key[i] - 1]->atttypid);
fmgr_info(cache->cc_skey[i].sk_procedure, fmgr_info(cache->cc_skey[i].sk_procedure,
(func_ptr *) &cache->cc_skey[i].sk_func, &cache->cc_skey[i].sk_func);
(int *) &cache->cc_skey[i].sk_nargs); cache->cc_skey[i].sk_nargs = cache->cc_skey[i].sk_func.fn_nargs;
CACHE5_elog(DEBUG, "CatalogCacheInit %16s %d %d %x", CACHE5_elog(DEBUG, "CatalogCacheInit %16s %d %d %x",
&relation->rd_rel->relname, &relation->rd_rel->relname,
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.9 1998/01/07 21:06:11 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.10 1998/01/15 19:45:29 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -98,6 +98,7 @@ init_fcache(Oid foid, ...@@ -98,6 +98,7 @@ init_fcache(Oid foid,
* ---------------- * ----------------
*/ */
retval = (FunctionCachePtr) palloc(sizeof(FunctionCache)); retval = (FunctionCachePtr) palloc(sizeof(FunctionCache));
memset(retval, 0, sizeof(FunctionCache));
if (!use_syscache) if (!use_syscache)
elog(ERROR, "what the ????, init the fcache without the catalogs?"); elog(ERROR, "what the ????, init the fcache without the catalogs?");
...@@ -281,10 +282,12 @@ init_fcache(Oid foid, ...@@ -281,10 +282,12 @@ init_fcache(Oid foid,
if (retval->language != SQLlanguageId) if (retval->language != SQLlanguageId) {
fmgr_info(foid, &(retval->func), &(retval->nargs)); fmgr_info(foid, &(retval->func));
else retval->nargs = retval->func.fn_nargs;
retval->func = (func_ptr) NULL; } else {
retval->func.fn_addr = (func_ptr) NULL;
}
return (retval); return (retval);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.33 1998/01/14 15:48:32 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.34 1998/01/15 19:45:31 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2014,7 +2014,8 @@ init_irels(void) ...@@ -2014,7 +2014,8 @@ init_irels(void)
/* have to reinit the function pointers in the strategy maps */ /* have to reinit the function pointers in the strategy maps */
for (i = 0; i < am->amstrategies; i++) for (i = 0; i < am->amstrategies; i++)
fmgr_info(SMD(i).sk_procedure, fmgr_info(SMD(i).sk_procedure,
&(SMD(i).sk_func), &(SMD(i).sk_nargs)); &(SMD(i).sk_func));
SMD(i).sk_nargs = SMD(i).sk_func.fn_nargs;
/* /*
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.9 1998/01/07 21:06:28 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.10 1998/01/15 19:45:58 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -32,67 +32,45 @@ ...@@ -32,67 +32,45 @@
#include "commands/trigger.h" #include "commands/trigger.h"
char * static FmgrInfo *fmgr_pl_finfo;
fmgr_pl(Oid func_id,
int n_arguments, static char *
FmgrValues * values, fmgr_pl(char *arg0, ...)
bool * isNull)
{ {
HeapTuple procedureTuple; va_list pvar;
HeapTuple languageTuple; FmgrValues values;
Form_pg_proc procedureStruct; bool isNull = false;
Form_pg_language languageStruct; int i;
func_ptr plcall_fn;
int plcall_nargs;
/* Fetch the pg_proc tuple from the syscache */ memset(&values, 0, sizeof(values));
procedureTuple = SearchSysCacheTuple(PROOID,
ObjectIdGetDatum(func_id),
0, 0, 0);
if (!HeapTupleIsValid(procedureTuple))
{
elog(ERROR, "fmgr_pl(): Cache lookup of procedure %ld failed.",
ObjectIdGetDatum(func_id));
}
procedureStruct = (Form_pg_proc) GETSTRUCT(procedureTuple);
/* Fetch the pg_language tuple from the syscache */ if (fmgr_pl_finfo->fn_nargs > 0) {
languageTuple = SearchSysCacheTuple(LANOID, values.data[0] = arg0;
ObjectIdGetDatum(procedureStruct->prolang), if (fmgr_pl_finfo->fn_nargs > 1) {
0, 0, 0); va_start(pvar, arg0);
if (!HeapTupleIsValid(languageTuple)) for (i = 1; i < fmgr_pl_finfo->fn_nargs; i++) {
{ values.data[i] = va_arg(pvar, char *);
elog(ERROR, "fmgr_pl(): Cache lookup of language %ld for procedure %ld failed.", }
ObjectIdGetDatum(procedureStruct->prolang), va_end(pvar);
ObjectIdGetDatum(func_id));
} }
languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
/* Get the function pointer for the PL call handler */
fmgr_info(languageStruct->lanplcallfoid, &plcall_fn, &plcall_nargs);
if (plcall_fn == NULL)
{
elog(ERROR, "fmgr_pl(): failed to load PL handler for procedure %ld.",
ObjectIdGetDatum(func_id));
} }
/* Call the PL handler */ /* Call the PL handler */
CurrentTriggerData = NULL; CurrentTriggerData = NULL;
return (*plcall_fn) (func_id, return (*(fmgr_pl_finfo->fn_plhandler)) (fmgr_pl_finfo,
n_arguments, &values,
values, &isNull);
isNull);
} }
char * char *
fmgr_c(func_ptr user_fn, fmgr_c(FmgrInfo *finfo,
Oid func_id,
int n_arguments,
FmgrValues * values, FmgrValues * values,
bool * isNull) bool * isNull)
{ {
char *returnValue = (char *) NULL; char *returnValue = (char *) NULL;
int n_arguments = finfo->fn_nargs;
func_ptr user_fn = fmgr_faddr(finfo);
if (user_fn == (func_ptr) NULL) if (user_fn == (func_ptr) NULL)
...@@ -100,10 +78,18 @@ fmgr_c(func_ptr user_fn, ...@@ -100,10 +78,18 @@ fmgr_c(func_ptr user_fn,
/* /*
* a NULL func_ptr denotet untrusted function (in postgres 4.2). * a NULL func_ptr denotet untrusted function (in postgres 4.2).
* Untrusted functions have very limited use and is clumsy. We now * Untrusted functions have very limited use and is clumsy. We
* use this feature for procedural languages. * just get rid of it.
*/
elog(WARN, "internal error: untrusted function not supported.");
}
/*
* If finfo contains a PL handler for this function,
* call that instead.
*/ */
return fmgr_pl(func_id, n_arguments, values, isNull); if (finfo->fn_plhandler != NULL) {
return (*(finfo->fn_plhandler))(finfo, values, isNull);
} }
switch (n_arguments) switch (n_arguments)
...@@ -164,14 +150,14 @@ fmgr_c(func_ptr user_fn, ...@@ -164,14 +150,14 @@ fmgr_c(func_ptr user_fn,
break; break;
default: default:
elog(ERROR, "fmgr_c: function %d: too many arguments (%d > %d)", elog(ERROR, "fmgr_c: function %d: too many arguments (%d > %d)",
func_id, n_arguments, MAXFMGRARGS); finfo->fn_oid, n_arguments, MAXFMGRARGS);
break; break;
} }
return (returnValue); return (returnValue);
} }
void void
fmgr_info(Oid procedureId, func_ptr * function, int *nargs) fmgr_info(Oid procedureId, FmgrInfo *finfo)
{ {
func_ptr user_fn = NULL; func_ptr user_fn = NULL;
FmgrCall *fcp; FmgrCall *fcp;
...@@ -181,6 +167,10 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs) ...@@ -181,6 +167,10 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
Form_pg_language languageStruct; Form_pg_language languageStruct;
Oid language; Oid language;
finfo->fn_addr = NULL;
finfo->fn_plhandler = NULL;
finfo->fn_oid = procedureId;
if (!(fcp = fmgr_isbuiltin(procedureId))) if (!(fcp = fmgr_isbuiltin(procedureId)))
{ {
procedureTuple = SearchSysCacheTuple(PROOID, procedureTuple = SearchSysCacheTuple(PROOID,
...@@ -191,29 +181,29 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs) ...@@ -191,29 +181,29 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
elog(ERROR, "fmgr_info: function %d: cache lookup failed\n", elog(ERROR, "fmgr_info: function %d: cache lookup failed\n",
procedureId); procedureId);
} }
procedureStruct = (FormData_pg_proc *) procedureStruct = (FormData_pg_proc *) GETSTRUCT(procedureTuple);
GETSTRUCT(procedureTuple);
if (!procedureStruct->proistrusted) if (!procedureStruct->proistrusted)
{ {
*function = (func_ptr) NULL; finfo->fn_addr = (func_ptr) NULL;
*nargs = procedureStruct->pronargs; finfo->fn_nargs = procedureStruct->pronargs;
return; return;
} }
language = procedureStruct->prolang; language = procedureStruct->prolang;
switch (language) switch (language)
{ {
case INTERNALlanguageId: case INTERNALlanguageId:
user_fn = fmgr_lookupByName(procedureStruct->proname.data); finfo->fn_addr =
if (!user_fn) fmgr_lookupByName(procedureStruct->proname.data);
elog(ERROR, "fmgr_info: function %s: not in internal table", if (!finfo->fn_addr)
elog(WARN, "fmgr_info: function %s: not in internal table",
procedureStruct->proname.data); procedureStruct->proname.data);
break; break;
case ClanguageId: case ClanguageId:
user_fn = fmgr_dynamic(procedureId, nargs); finfo->fn_addr = fmgr_dynamic(procedureId, &(finfo->fn_nargs));
break; break;
case SQLlanguageId: case SQLlanguageId:
user_fn = (func_ptr) NULL; finfo->fn_addr = (func_ptr) NULL;
*nargs = procedureStruct->pronargs; finfo->fn_nargs = procedureStruct->pronargs;
break; break;
default: default:
...@@ -236,8 +226,12 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs) ...@@ -236,8 +226,12 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
GETSTRUCT(languageTuple); GETSTRUCT(languageTuple);
if (languageStruct->lanispl) if (languageStruct->lanispl)
{ {
user_fn = (func_ptr) NULL; FmgrInfo plfinfo;
*nargs = procedureStruct->pronargs;
fmgr_info(((Form_pg_language)GETSTRUCT(languageTuple))->lanplcallfoid, &plfinfo);
finfo->fn_addr = (func_ptr) fmgr_pl;
finfo->fn_plhandler = plfinfo.fn_addr;
finfo->fn_nargs = procedureStruct->pronargs;
} }
else else
{ {
...@@ -249,10 +243,16 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs) ...@@ -249,10 +243,16 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
} }
else else
{ {
user_fn = fcp->func; finfo->fn_addr = fcp->func;
*nargs = fcp->nargs; finfo->fn_nargs = fcp->nargs;
} }
*function = user_fn; }
func_ptr
fmgr_faddr(FmgrInfo *finfo)
{
fmgr_pl_finfo = finfo;
return finfo->fn_addr;
} }
/* /*
...@@ -273,12 +273,13 @@ fmgr(Oid procedureId,...) ...@@ -273,12 +273,13 @@ fmgr(Oid procedureId,...)
register i; register i;
int pronargs; int pronargs;
FmgrValues values; FmgrValues values;
func_ptr user_fn; FmgrInfo finfo;
bool isNull = false; bool isNull = false;
va_start(pvar, procedureId); va_start(pvar, procedureId);
fmgr_info(procedureId, &user_fn, &pronargs); fmgr_info(procedureId, &finfo);
pronargs = finfo.fn_nargs;
if (pronargs > MAXFMGRARGS) if (pronargs > MAXFMGRARGS)
{ {
...@@ -290,8 +291,7 @@ fmgr(Oid procedureId,...) ...@@ -290,8 +291,7 @@ fmgr(Oid procedureId,...)
va_end(pvar); va_end(pvar);
/* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */ /* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */
return (fmgr_c(user_fn, procedureId, pronargs, &values, return (fmgr_c(&finfo, &values, &isNull));
&isNull));
} }
/* /*
...@@ -301,20 +301,26 @@ fmgr(Oid procedureId,...) ...@@ -301,20 +301,26 @@ fmgr(Oid procedureId,...)
* the pointer, but it's available for use with macros in fmgr.h if you * the pointer, but it's available for use with macros in fmgr.h if you
* want this routine to do sanity-checking for you. * want this routine to do sanity-checking for you.
* *
* func_ptr, func_id, n_arguments, args... * funcinfo, n_arguments, args...
*/ */
#ifdef NOT_USED #ifdef NOT_USED
char * char *
fmgr_ptr(func_ptr user_fn, Oid func_id,...) fmgr_ptr(FmgrInfo *finfo, ...)
{ {
va_list pvar; va_list pvar;
register i; register i;
int n_arguments; int n_arguments;
FmgrInfo local_finfo;
FmgrValues values; FmgrValues values;
bool isNull = false; bool isNull = false;
va_start(pvar, func_id); local_finfo->fn_addr = finfo->fn_addr;
local_finfo->fn_plhandler = finfo->fn_plhandler;
local_finfo->fn_oid = finfo->fn_oid;
va_start(pvar, finfo);
n_arguments = va_arg(pvar, int); n_arguments = va_arg(pvar, int);
local_finfo->fn_nargs = n_arguments;
if (n_arguments > MAXFMGRARGS) if (n_arguments > MAXFMGRARGS)
{ {
elog(ERROR, "fmgr_ptr: function %d: too many arguments (%d > %d)", elog(ERROR, "fmgr_ptr: function %d: too many arguments (%d > %d)",
...@@ -325,8 +331,7 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...) ...@@ -325,8 +331,7 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...)
va_end(pvar); va_end(pvar);
/* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */ /* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */
return (fmgr_c(user_fn, func_id, n_arguments, &values, return (fmgr_c(&local_finfo, &values, &isNull));
&isNull));
} }
#endif #endif
...@@ -339,16 +344,14 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...) ...@@ -339,16 +344,14 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...)
char * char *
fmgr_array_args(Oid procedureId, int nargs, char *args[], bool * isNull) fmgr_array_args(Oid procedureId, int nargs, char *args[], bool * isNull)
{ {
func_ptr user_fn; FmgrInfo finfo;
int true_arguments;
fmgr_info(procedureId, &user_fn, &true_arguments); fmgr_info(procedureId, &finfo);
finfo.fn_nargs = nargs;
/* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */ /* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */
return return
(fmgr_c(user_fn, (fmgr_c(&finfo,
procedureId,
true_arguments,
(FmgrValues *) args, (FmgrValues *) args,
isNull)); isNull));
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/lselect.c,v 1.9 1997/09/18 05:37:30 vadim Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/lselect.c,v 1.10 1998/01/15 19:46:08 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -212,14 +212,14 @@ tuplecmp(HeapTuple ltup, HeapTuple rtup, LeftistContext context) ...@@ -212,14 +212,14 @@ tuplecmp(HeapTuple ltup, HeapTuple rtup, LeftistContext context)
if (context->scanKeys[nkey].sk_flags & SK_COMMUTE) if (context->scanKeys[nkey].sk_flags & SK_COMMUTE)
{ {
if (!(result = if (!(result =
(long) (*context->scanKeys[nkey].sk_func) (rattr, lattr))) (long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (rattr, lattr)))
result = result =
-(long) (*context->scanKeys[nkey].sk_func) (lattr, rattr); -(long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (lattr, rattr);
} }
else if (!(result = else if (!(result =
(long) (*context->scanKeys[nkey].sk_func) (lattr, rattr))) (long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (lattr, rattr)))
result = result =
-(long) (*context->scanKeys[nkey].sk_func) (rattr, lattr); -(long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (rattr, lattr);
nkey++; nkey++;
} }
return (result == 1); return (result == 1);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.31 1998/01/13 04:04:57 scrappy Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.32 1998/01/15 19:46:10 pgsql Exp $
* *
* NOTES * NOTES
* Sorts the first relation into the second relation. * Sorts the first relation into the second relation.
...@@ -1115,11 +1115,11 @@ _psort_cmp (HeapTuple *ltup, HeapTuple *rtup) ...@@ -1115,11 +1115,11 @@ _psort_cmp (HeapTuple *ltup, HeapTuple *rtup)
if (PsortKeys[nkey].sk_flags & SK_COMMUTE) if (PsortKeys[nkey].sk_flags & SK_COMMUTE)
{ {
if (!(result = -(long) (*PsortKeys[nkey].sk_func) (rattr, lattr))) if (!(result = -(long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (rattr, lattr)))
result = (long) (*PsortKeys[nkey].sk_func) (lattr, rattr); result = (long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (lattr, rattr);
} }
else if (!(result = -(long) (*PsortKeys[nkey].sk_func) (lattr, rattr))) else if (!(result = -(long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (lattr, rattr)))
result = (long) (*PsortKeys[nkey].sk_func) (rattr, lattr); result = (long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (rattr, lattr);
nkey++; nkey++;
} }
return (result); return (result);
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <utils/rel.h> #include <utils/rel.h>
#include <storage/off.h> #include <storage/off.h>
#include <fmgr.h>
/* /*
** You can have as many strategies as you please in GiSTs, as ** You can have as many strategies as you please in GiSTs, as
** long as your consistent method can handle them ** long as your consistent method can handle them
...@@ -71,13 +73,13 @@ typedef struct GISTSTACK ...@@ -71,13 +73,13 @@ typedef struct GISTSTACK
typedef struct GISTSTATE typedef struct GISTSTATE
{ {
func_ptr consistentFn; FmgrInfo consistentFn;
func_ptr unionFn; FmgrInfo unionFn;
func_ptr compressFn; FmgrInfo compressFn;
func_ptr decompressFn; FmgrInfo decompressFn;
func_ptr penaltyFn; FmgrInfo penaltyFn;
func_ptr picksplitFn; FmgrInfo picksplitFn;
func_ptr equalFn; FmgrInfo equalFn;
bool haskeytype; bool haskeytype;
bool keytypbyval; bool keytypbyval;
} GISTSTATE; } GISTSTATE;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: skey.h,v 1.6 1997/09/08 21:51:01 momjian Exp $ * $Id: skey.h,v 1.7 1998/01/15 19:46:18 pgsql Exp $
* *
* *
* Note: * Note:
...@@ -17,13 +17,14 @@ ...@@ -17,13 +17,14 @@
#define SKEY_H #define SKEY_H
#include <access/attnum.h> #include <access/attnum.h>
#include <fmgr.h>
typedef struct ScanKeyData typedef struct ScanKeyData
{ {
bits16 sk_flags; /* flags */ bits16 sk_flags; /* flags */
AttrNumber sk_attno; /* domain number */ AttrNumber sk_attno; /* domain number */
RegProcedure sk_procedure; /* procedure OID */ RegProcedure sk_procedure; /* procedure OID */
func_ptr sk_func; FmgrInfo sk_func;
int32 sk_nargs; int32 sk_nargs;
Datum sk_argument; /* data to compare */ Datum sk_argument; /* data to compare */
} ScanKeyData; } ScanKeyData;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: valid.h,v 1.11 1997/11/24 05:09:41 momjian Exp $ * $Id: valid.h,v 1.12 1998/01/15 19:46:18 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -71,13 +71,13 @@ do \ ...@@ -71,13 +71,13 @@ do \
break; \ break; \
} \ } \
\ \
if (__cur_keys->sk_func == (func_ptr) oideq) /* optimization */ \ if (__cur_keys->sk_func.fn_addr == (func_ptr) oideq) /* optimization */ \
__test = (__cur_keys->sk_argument == __atp); \ __test = (__cur_keys->sk_argument == __atp); \
else if (__cur_keys->sk_flags & SK_COMMUTE) \ else if (__cur_keys->sk_flags & SK_COMMUTE) \
__test = (long) FMGR_PTR2(__cur_keys->sk_func, __cur_keys->sk_procedure, \ __test = (long) FMGR_PTR2(&__cur_keys->sk_func, \
__cur_keys->sk_argument, __atp); \ __cur_keys->sk_argument, __atp); \
else \ else \
__test = (long) FMGR_PTR2(__cur_keys->sk_func, __cur_keys->sk_procedure, \ __test = (long) FMGR_PTR2(&__cur_keys->sk_func, \
__atp, __cur_keys->sk_argument); \ __atp, __cur_keys->sk_argument); \
\ \
if (!__test == !(__cur_keys->sk_flags & SK_NEGATE)) \ if (!__test == !(__cur_keys->sk_flags & SK_NEGATE)) \
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: vacuum.h,v 1.11 1997/11/26 01:26:08 momjian Exp $ * $Id: vacuum.h,v 1.12 1998/01/15 19:46:24 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -78,7 +78,7 @@ typedef struct ...@@ -78,7 +78,7 @@ typedef struct
nonnull_cnt; nonnull_cnt;
int32 max_cnt, int32 max_cnt,
min_cnt; min_cnt;
func_ptr f_cmpeq, FmgrInfo f_cmpeq,
f_cmplt, f_cmplt,
f_cmpgt; f_cmpgt;
regproc outfunc; regproc outfunc;
......
...@@ -6,19 +6,21 @@ ...@@ -6,19 +6,21 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: fcache.h,v 1.5 1997/09/08 21:54:57 momjian Exp $ * $Id: fcache.h,v 1.6 1998/01/15 19:46:36 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#ifndef FCACHE_H #ifndef FCACHE_H
#define FCACHE_H #define FCACHE_H
#include <fmgr.h>
typedef struct typedef struct
{ {
int typlen; /* length of the return type */ int typlen; /* length of the return type */
int typbyval; /* true if return type is pass by value */ int typbyval; /* true if return type is pass by value */
func_ptr func; /* address of function to call (for c FmgrInfo func; /* address of function to call (for c
* funcs) */ * funcs) */
Oid foid; /* oid of the function in pg_proc */ Oid foid; /* oid of the function in pg_proc */
Oid language; /* oid of the language in pg_language */ Oid language; /* oid of the language in pg_language */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: rel.h,v 1.14 1997/11/21 19:12:32 momjian Exp $ * $Id: rel.h,v 1.15 1998/01/15 19:46:37 pgsql Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -24,8 +24,7 @@ typedef struct Trigger ...@@ -24,8 +24,7 @@ typedef struct Trigger
{ {
char *tgname; char *tgname;
Oid tgfoid; Oid tgfoid;
func_ptr tgfunc; FmgrInfo tgfunc;
func_ptr tgplfunc;
int16 tgtype; int16 tgtype;
int16 tgnargs; int16 tgnargs;
int16 tgattr[8]; int16 tgattr[8];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment