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.
This commit is contained in:
PostgreSQL Daemon 1998-01-15 19:46:37 +00:00
parent 763ff8aef8
commit baef78d96b
37 changed files with 340 additions and 398 deletions

View File

@ -7,7 +7,7 @@
#
#
# 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
# Essentially all Postgres make files include this file and use the
@ -206,7 +206,7 @@ YFLAGS= @YFLAGS@
YACC= @YACC@
LEX= @LEX@
AROPT= @AROPT@
CFLAGS= -I$(SRCDIR)/include @CPPFLAGS@ @CFLAGS@
CFLAGS= -I$(SRCDIR)/include -I$(SRCDIR)/backend @CPPFLAGS@ @CFLAGS@
CFLAGS_SL= @SHARED_LIB@
LDFLAGS= @LDFLAGS@ @LIBS@
DLSUFFIX= @DLSUFFIX@

View File

@ -4,7 +4,7 @@
# Makefile for access/common
#
# 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
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:
$(MAKE) -C ../.. fmgr.h

View File

@ -7,7 +7,7 @@
*
*
* 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,
if (key[0].sk_flags & SK_COMMUTE)
{
test = (*(key[0].sk_func))
test = (*(fmgr_faddr(&key[0].sk_func)))
(DatumGetPointer(key[0].sk_argument),
datum) ? 1 : 0;
}
else
{
test = (*(key[0].sk_func))
test = (*(fmgr_faddr(&key[0].sk_func)))
(datum,
DatumGetPointer(key[0].sk_argument)) ? 1 : 0;
}

View File

@ -7,7 +7,7 @@
*
*
* 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,
entry->sk_attno = attributeNumber;
entry->sk_procedure = procedure;
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));
}

View File

@ -565,10 +565,10 @@ gistAdjustKeys(Relation r,
ev1p = &((GISTENTRY *) VARDATA(evec))[1];
/* 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? */
(giststate->equalFn) (ev0p->pred, datum, &result);
(*fmgr_faddr(&giststate->equalFn)) (ev0p->pred, datum, &result);
if (!result)
{
TupleDesc td = RelationGetTupleDescriptor(r);
@ -743,7 +743,7 @@ gistSplit(Relation r,
VARSIZE(entryvec) = (maxoff + 2) * sizeof(GISTENTRY) + VARHDRSZ;
/* 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 */
gistcentryinit(giststate, &tmpentry, v.spl_ldatum, (Relation) NULL,
@ -1072,7 +1072,7 @@ gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */
size = IndexTupleSize(datum) - sizeof(IndexTupleData);
datum += sizeof(IndexTupleData);
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)
{
which = i;
@ -1150,8 +1150,6 @@ initGISTstate(GISTSTATE *giststate, Relation index)
RegProcedure penalty_proc,
picksplit_proc,
equal_proc;
func_ptr user_fn;
int pronargs;
HeapTuple htup;
IndexTupleForm itupform;
@ -1162,20 +1160,13 @@ initGISTstate(GISTSTATE *giststate, Relation index)
penalty_proc = index_getprocid(index, 1, GIST_PENALTY_PROC);
picksplit_proc = index_getprocid(index, 1, GIST_PICKSPLIT_PROC);
equal_proc = index_getprocid(index, 1, GIST_EQUAL_PROC);
fmgr_info(consistent_proc, &user_fn, &pronargs);
giststate->consistentFn = user_fn;
fmgr_info(union_proc, &user_fn, &pronargs);
giststate->unionFn = user_fn;
fmgr_info(compress_proc, &user_fn, &pronargs);
giststate->compressFn = user_fn;
fmgr_info(decompress_proc, &user_fn, &pronargs);
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;
fmgr_info(consistent_proc, &giststate->consistentFn);
fmgr_info(union_proc, &giststate->unionFn);
fmgr_info(compress_proc, &giststate->compressFn);
fmgr_info(decompress_proc, &giststate->decompressFn);
fmgr_info(penalty_proc, &giststate->penaltyFn);
fmgr_info(picksplit_proc, &giststate->picksplitFn);
fmgr_info(equal_proc, &giststate->equalFn);
/* see if key type is different from type of attribute being indexed */
htup = SearchSysCacheTuple(INDEXRELID, ObjectIdGetDatum(index->rd_id),
@ -1259,7 +1250,7 @@ gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r,
gistentryinit(*e, pr, r, pg, o, b, l);
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,
dep->leafkey);
if (dep != e)
@ -1280,7 +1271,7 @@ gistcentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r,
gistentryinit(*e, pr, r, pg, o, b, l);
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,
cep->leafkey);
if (cep != e)

View File

@ -283,13 +283,13 @@ gistindex_keytest(IndexTuple tuple,
if (key[0].sk_flags & SK_COMMUTE)
{
test = (*(key[0].sk_func))
test = (*fmgr_faddr(&key[0].sk_func))
(DatumGetPointer(key[0].sk_argument),
&de, key[0].sk_procedure) ? 1 : 0;
}
else
{
test = (*(key[0].sk_func))
test = (*fmgr_faddr(&key[0].sk_func))
(&de,
DatumGetPointer(key[0].sk_argument),
key[0].sk_procedure) ? 1 : 0;

View File

@ -8,7 +8,7 @@
*
*
* 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,
switch (operator->flags ^ entry->sk_flags)
{
case 0x0:
tmpres = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure,
tmpres = (long) FMGR_PTR2(&entry->sk_func,
left, right);
break;
case SK_NEGATE:
tmpres = (long) !FMGR_PTR2(entry->sk_func, entry->sk_procedure,
tmpres = (long) !FMGR_PTR2(&entry->sk_func,
left, right);
break;
case SK_COMMUTE:
tmpres = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure,
tmpres = (long) FMGR_PTR2(&entry->sk_func,
right, left);
break;
case SK_NEGATE | SK_COMMUTE:
tmpres = (long) !FMGR_PTR2(entry->sk_func, entry->sk_procedure,
tmpres = (long) !FMGR_PTR2(&entry->sk_func,
right, left);
break;
@ -521,7 +521,8 @@ OperatorRelationFillScanKeyEntry(Relation operatorRelation,
entry->sk_flags = 0;
entry->sk_procedure =
((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))
{

View File

@ -7,7 +7,7 @@
*
*
* 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,
if (entry->sk_flags & SK_ISNULL || null)
return (false);
result = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure,
entry->sk_argument, datum);
result = (long) FMGR_PTR2(&entry->sk_func, entry->sk_argument, datum);
if (result != 0)
return (false);
}

View File

@ -7,7 +7,7 @@
*
*
* 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,
}
else
{
tmpres = (long) FMGR_PTR2(entry->sk_func, entry->sk_procedure,
entry->sk_argument, datum);
tmpres = (long) FMGR_PTR2(&entry->sk_func, entry->sk_argument, datum);
}
result = tmpres;

View File

@ -7,7 +7,7 @@
*
*
* 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)
{
/* yup, use the appropriate value */
test =
(long) FMGR_PTR2(cur->sk_func, cur->sk_procedure,
cur->sk_argument, xform[j].sk_argument);
(long) FMGR_PTR2(&cur->sk_func, cur->sk_argument, xform[j].sk_argument);
if (test)
xform[j].sk_argument = cur->sk_argument;
else if (j == (BTEqualStrategyNumber - 1))
@ -381,13 +380,13 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, Size *keysok)
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),
datum);
}
else
{
test = (int) (*(key[0].sk_func))
test = (int) (*fmgr_faddr(&key[0].sk_func))
(datum,
DatumGetPointer(key[0].sk_argument));
}

View File

@ -7,7 +7,7 @@
*
*
* 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
typedef struct RTSTATE
{
func_ptr unionFn; /* union function */
func_ptr sizeFn; /* size function */
func_ptr interFn; /* intersection function */
FmgrInfo unionFn; /* union function */
FmgrInfo sizeFn; /* size function */
FmgrInfo interFn; /* intersection function */
} RTSTATE;
/* non-export function prototypes */
@ -430,10 +430,10 @@ rttighten(Relation r,
oldud = (char *) PageGetItem(p, PageGetItemId(p, stk->rts_child));
oldud += sizeof(IndexTupleData);
(*rtstate->sizeFn) (oldud, &old_size);
datum = (char *) (*rtstate->unionFn) (oldud, datum);
(*fmgr_faddr(&rtstate->sizeFn)) (oldud, &old_size);
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)
{
@ -462,7 +462,7 @@ rttighten(Relation r,
* 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);
pfree(tdatum);
}
@ -686,7 +686,7 @@ rtintinsert(Relation r,
WriteBuffer(b);
ldatum = (((char *) ltup) + 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,
(IndexTupleSize(rtup) - sizeof(IndexTupleData)), rtstate);
@ -765,10 +765,10 @@ picksplit(Relation r,
datum_beta = ((char *) item_2) + sizeof(IndexTupleData);
/* compute the wasted space by unioning these guys */
union_d = (char *) (rtstate->unionFn) (datum_alpha, datum_beta);
(rtstate->sizeFn) (union_d, &size_union);
inter_d = (char *) (rtstate->interFn) (datum_alpha, datum_beta);
(rtstate->sizeFn) (inter_d, &size_inter);
union_d = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_alpha, datum_beta);
(*fmgr_faddr(&rtstate->sizeFn)) (union_d, &size_union);
inter_d = (char *) (*fmgr_faddr(&rtstate->interFn)) (datum_alpha, datum_beta);
(*fmgr_faddr(&rtstate->sizeFn)) (inter_d, &size_inter);
size_waste = size_union - size_inter;
pfree(union_d);
@ -798,12 +798,12 @@ picksplit(Relation r,
item_1 = (IndexTuple) PageGetItem(page, PageGetItemId(page, seed_1));
datum_alpha = ((char *) item_1) + sizeof(IndexTupleData);
datum_l = (char *) (*rtstate->unionFn) (datum_alpha, datum_alpha);
(*rtstate->sizeFn) (datum_l, &size_l);
datum_l = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_alpha, datum_alpha);
(*fmgr_faddr(&rtstate->sizeFn)) (datum_l, &size_l);
item_2 = (IndexTuple) PageGetItem(page, PageGetItemId(page, seed_2));
datum_beta = ((char *) item_2) + sizeof(IndexTupleData);
datum_r = (char *) (*rtstate->unionFn) (datum_beta, datum_beta);
(*rtstate->sizeFn) (datum_r, &size_r);
datum_r = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_beta, datum_beta);
(*fmgr_faddr(&rtstate->sizeFn)) (datum_r, &size_r);
/*
* Now split up the regions between the two seeds. An important
@ -851,10 +851,10 @@ picksplit(Relation r,
}
datum_alpha = ((char *) item_1) + sizeof(IndexTupleData);
union_dl = (char *) (*rtstate->unionFn) (datum_l, datum_alpha);
union_dr = (char *) (*rtstate->unionFn) (datum_r, datum_alpha);
(*rtstate->sizeFn) (union_dl, &size_alpha);
(*rtstate->sizeFn) (union_dr, &size_beta);
union_dl = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_l, datum_alpha);
union_dr = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum_r, datum_alpha);
(*fmgr_faddr(&rtstate->sizeFn)) (union_dl, &size_alpha);
(*fmgr_faddr(&rtstate->sizeFn)) (union_dr, &size_beta);
/* pick which page to add it to */
if (size_alpha - size_l < size_beta - size_r)
@ -921,9 +921,9 @@ choose(Relation r, Page p, IndexTuple it, RTSTATE *rtstate)
{
datum = (char *) PageGetItem(p, PageGetItemId(p, i));
datum += sizeof(IndexTupleData);
(*rtstate->sizeFn) (datum, &dsize);
ud = (char *) (*rtstate->unionFn) (datum, id);
(*rtstate->sizeFn) (ud, &usize);
(*fmgr_faddr(&rtstate->sizeFn)) (datum, &dsize);
ud = (char *) (*fmgr_faddr(&rtstate->unionFn)) (datum, id);
(*fmgr_faddr(&rtstate->sizeFn)) (ud, &usize);
pfree(ud);
if (which_grow < 0 || usize - dsize < which_grow)
{
@ -991,18 +991,13 @@ initRtstate(RTSTATE *rtstate, Relation index)
RegProcedure union_proc,
size_proc,
inter_proc;
func_ptr user_fn;
int pronargs;
union_proc = index_getprocid(index, 1, RT_UNION_PROC);
size_proc = index_getprocid(index, 1, RT_SIZE_PROC);
inter_proc = index_getprocid(index, 1, RT_INTER_PROC);
fmgr_info(union_proc, &user_fn, &pronargs);
rtstate->unionFn = user_fn;
fmgr_info(size_proc, &user_fn, &pronargs);
rtstate->sizeFn = user_fn;
fmgr_info(inter_proc, &user_fn, &pronargs);
rtstate->interFn = user_fn;
fmgr_info(union_proc, &rtstate->unionFn);
fmgr_info(size_proc, &rtstate->sizeFn);
fmgr_info(inter_proc, &rtstate->interFn);
return;
}

View File

@ -7,7 +7,7 @@
*
*
* 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
* See acl.h.
@ -122,7 +122,8 @@ ChangeAcl(char *relname,
if (!RelationIsValid(relation))
elog(ERROR, "ChangeAcl: could not open '%s'??",
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);
hsdp = heap_beginscan(relation,
0,

View File

@ -7,7 +7,7 @@
*
*
* 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
@ -1373,8 +1373,8 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
char nulls[Natts_pg_class];
char replace[Natts_pg_class];
fmgr_info(ObjectIdEqualRegProcedure, (func_ptr *) &key[0].sk_func,
&key[0].sk_nargs);
fmgr_info(ObjectIdEqualRegProcedure, &key[0].sk_func);
key[0].sk_nargs = key[0].sk_func.fn_nargs;
/* ----------------
* This routine handles updates for both the heap and index relation

View File

@ -7,7 +7,7 @@
*
*
* 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
* these routines moved here from commands/define.c and somewhat cleaned up.
@ -97,12 +97,12 @@ OperatorGetWithOpenRelation(Relation pg_operator_desc,
{0, Anum_pg_operator_oprright, ObjectIdEqualRegProcedure},
};
fmgr_info(NameEqualRegProcedure,
&opKey[0].sk_func, &opKey[0].sk_nargs);
fmgr_info(ObjectIdEqualRegProcedure,
&opKey[1].sk_func, &opKey[1].sk_nargs);
fmgr_info(ObjectIdEqualRegProcedure,
&opKey[2].sk_func, &opKey[2].sk_nargs);
fmgr_info(NameEqualRegProcedure, &opKey[0].sk_func);
fmgr_info(ObjectIdEqualRegProcedure, &opKey[1].sk_func);
fmgr_info(ObjectIdEqualRegProcedure, &opKey[2].sk_func);
opKey[0].sk_nargs = opKey[0].sk_func.fn_nargs;
opKey[1].sk_nargs = opKey[1].sk_func.fn_nargs;
opKey[2].sk_nargs = opKey[2].sk_func.fn_nargs;
/* ----------------
* form scan key
@ -482,12 +482,12 @@ OperatorDef(char *operatorName,
{0, Anum_pg_operator_oprright, ObjectIdEqualRegProcedure},
};
fmgr_info(NameEqualRegProcedure,
&opKey[0].sk_func, &opKey[0].sk_nargs);
fmgr_info(ObjectIdEqualRegProcedure,
&opKey[1].sk_func, &opKey[1].sk_nargs);
fmgr_info(ObjectIdEqualRegProcedure,
&opKey[2].sk_func, &opKey[2].sk_nargs);
fmgr_info(NameEqualRegProcedure, &opKey[0].sk_func);
fmgr_info(ObjectIdEqualRegProcedure, &opKey[1].sk_func);
fmgr_info(ObjectIdEqualRegProcedure, &opKey[2].sk_func);
opKey[0].sk_nargs = opKey[0].sk_func.fn_nargs;
opKey[1].sk_nargs = opKey[1].sk_func.fn_nargs;
opKey[2].sk_nargs = opKey[2].sk_func.fn_nargs;
operatorObjectId = OperatorGet(operatorName,
leftTypeName,
@ -781,8 +781,8 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
{0, ObjectIdAttributeNumber, ObjectIdEqualRegProcedure},
};
fmgr_info(ObjectIdEqualRegProcedure,
&opKey[0].sk_func, &opKey[0].sk_nargs);
fmgr_info(ObjectIdEqualRegProcedure, &opKey[0].sk_func);
opKey[0].sk_nargs = opKey[0].sk_func.fn_nargs;
for (i = 0; i < Natts_pg_operator; ++i)
{

View File

@ -7,7 +7,7 @@
*
*
* 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,
* initialize the scan key and begin a scan of pg_type
* ----------------
*/
fmgr_info(NameEqualRegProcedure,
&typeKey[0].sk_func, &typeKey[0].sk_nargs);
fmgr_info(NameEqualRegProcedure, &typeKey[0].sk_func);
typeKey[0].sk_nargs = typeKey[0].sk_func.fn_nargs;
typeKey[0].sk_argument = PointerGetDatum(typeName);
scan = heap_beginscan(pg_type_desc,
@ -324,8 +324,8 @@ TypeCreate(char *typeName,
{0, Anum_pg_type_typname, NameEqualRegProcedure}
};
fmgr_info(NameEqualRegProcedure,
&typeKey[0].sk_func, &typeKey[0].sk_nargs);
fmgr_info(NameEqualRegProcedure, &typeKey[0].sk_func);
typeKey[0].sk_nargs = typeKey[0].sk_func.fn_nargs;
/* ----------------
* check that the type is not already defined.

View File

@ -6,7 +6,7 @@
*
*
* 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)
int32 attr_count,
i;
AttributeTupleForm *attr;
func_ptr *out_functions;
int dummy;
FmgrInfo *out_functions;
Oid out_func_oid;
Oid *elements;
Datum value;
@ -229,12 +228,12 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
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));
for (i = 0; i < attr_count; i++)
{
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);
}
nulls = NULL; /* meaningless, but compiler doesn't know
@ -272,7 +271,7 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
{
if (!isnull)
{
string = (char *) (out_functions[i]) (value, elements[i]);
string = (char *) (*fmgr_faddr(&out_functions[i])) (value, elements[i]);
CopyAttributeOut(fp, string, delim);
pfree(string);
}
@ -357,9 +356,8 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
HeapTuple tuple;
AttrNumber attr_count;
AttributeTupleForm *attr;
func_ptr *in_functions;
int i,
dummy;
FmgrInfo *in_functions;
int i;
Oid in_func_oid;
Datum *values;
char *nulls,
@ -498,12 +496,12 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
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));
for (i = 0; i < attr_count; i++)
{
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);
}
}
@ -574,7 +572,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
else
{
values[i] =
(Datum) (in_functions[i]) (string,
(Datum) (*fmgr_faddr(&in_functions[i])) (string,
elements[i],
attr[i]->attlen);

View File

@ -7,7 +7,7 @@
*
*
* 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 */
#endif
relation = heap_openr(TypeRelationName);
fmgr_info(typeKey[0].sk_procedure, &typeKey[0].sk_func,
&typeKey[0].sk_nargs);
fmgr_info(typeKey[0].sk_procedure, &typeKey[0].sk_func);
typeKey[0].sk_nargs = typeKey[0].sk_func.fn_nargs;
/* Delete the primary type */
@ -387,7 +387,8 @@ RemoveFunction(char *functionName, /* function name to be removed */
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);
scan = heap_beginscan(relation, 0, false, 1, key);

View File

@ -43,7 +43,6 @@ static HeapTuple
GetTupleForTrigger(Relation relation, ItemPointer tid,
bool before);
extern void fmgr_info(Oid procedureId, func_ptr * function, int *nargs);
extern GlobalMemory CacheCxt;
void
@ -413,8 +412,7 @@ RelationBuildTriggers(Relation relation)
build->tgname = nameout(&(pg_trigger->tgname));
build->tgfoid = pg_trigger->tgfoid;
build->tgfunc = NULL;
build->tgplfunc = NULL;
build->tgfunc.fn_addr = NULL;
build->tgtype = pg_trigger->tgtype;
build->tgnargs = pg_trigger->tgnargs;
memcpy(build->tgattr, &(pg_trigger->tgattr), 8 * sizeof(int16));
@ -598,48 +596,17 @@ static HeapTuple
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)
{
HeapTuple procTuple;
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);
if (trigger->tgfunc.fn_plhandler != NULL) {
return (HeapTuple) (*(trigger->tgfunc.fn_plhandler))
(&trigger->tgfunc);
}
return (HeapTuple) ((*(trigger->tgplfunc)) (trigger->tgfoid));
return (HeapTuple) ((*fmgr_faddr(&trigger->tgfunc)) ());
}
HeapTuple

View File

@ -7,7 +7,7 @@
*
*
* 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 */
#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 swapDatum(a,b) {Datum tmp; tmp=a; a=b; b=tmp;}
#define VacAttrStatsEqValid(stats) ( stats->f_cmpeq != NULL )
#define VacAttrStatsLtGtValid(stats) ( stats->f_cmplt != NULL && \
stats->f_cmpgt != NULL && \
#define VacAttrStatsEqValid(stats) ( stats->f_cmpeq.fn_addr != NULL )
#define VacAttrStatsLtGtValid(stats) ( stats->f_cmplt.fn_addr != NULL && \
stats->f_cmpgt.fn_addr != NULL && \
RegProcedureIsValid(stats->outfunc) )
@ -484,35 +484,29 @@ vc_vacone(Oid relid, bool analyze, List *va_cols)
func_operator = oper("=", stats->attr->atttypid, stats->attr->atttypid, true);
if (func_operator != NULL)
{
int nargs;
pgopform = (OperatorTupleForm) GETSTRUCT(func_operator);
fmgr_info(pgopform->oprcode, &(stats->f_cmpeq), &nargs);
fmgr_info(pgopform->oprcode, &(stats->f_cmpeq));
}
else
stats->f_cmpeq = NULL;
stats->f_cmpeq.fn_addr = NULL;
func_operator = oper("<", stats->attr->atttypid, stats->attr->atttypid, true);
if (func_operator != NULL)
{
int nargs;
pgopform = (OperatorTupleForm) GETSTRUCT(func_operator);
fmgr_info(pgopform->oprcode, &(stats->f_cmplt), &nargs);
fmgr_info(pgopform->oprcode, &(stats->f_cmplt));
}
else
stats->f_cmplt = NULL;
stats->f_cmplt.fn_addr = NULL;
func_operator = oper(">", stats->attr->atttypid, stats->attr->atttypid, true);
if (func_operator != NULL)
{
int nargs;
pgopform = (OperatorTupleForm) GETSTRUCT(func_operator);
fmgr_info(pgopform->oprcode, &(stats->f_cmpgt), &nargs);
fmgr_info(pgopform->oprcode, &(stats->f_cmpgt));
}
else
stats->f_cmpgt = NULL;
stats->f_cmpgt.fn_addr = NULL;
pgttup = SearchSysCacheTuple(TYPOID,
ObjectIdGetDatum(stats->attr->atttypid),
@ -1671,29 +1665,29 @@ vc_attrstats(Relation onerel, VRelStats *vacrelstats, HeapTuple htup)
}
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);
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);
stats->max_cnt = 0;
}
if ((*(stats->f_cmpeq)) (value, stats->min))
if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->min))
stats->min_cnt++;
else if ((*(stats->f_cmpeq)) (value, stats->max))
else if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->max))
stats->max_cnt++;
}
if ((*(stats->f_cmpeq)) (value, stats->best))
if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->best))
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_hits++;
}
else if ((*(stats->f_cmpeq)) (value, stats->guess2))
else if ((*fmgr_faddr(&stats->f_cmpeq)) (value, stats->guess2))
stats->guess2_hits++;
else
value_hit = false;
@ -1880,9 +1874,8 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst
*
pgcform->relname.data) */ )
{
func_ptr out_function;
FmgrInfo out_function;
char *out_string;
int dummy;
for (i = 0; i < Natts_pg_statistic; ++i)
nulls[i] = ' ';
@ -1895,11 +1888,11 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst
values[i++] = (Datum) relid; /* 1 */
values[i++] = (Datum) attp->attnum; /* 2 */
values[i++] = (Datum) InvalidOid; /* 3 */
fmgr_info(stats->outfunc, &out_function, &dummy);
out_string = (*out_function) (stats->min, stats->attr->atttypid);
fmgr_info(stats->outfunc, &out_function);
out_string = (*fmgr_faddr(&out_function)) (stats->min, stats->attr->atttypid);
values[i++] = (Datum) fmgr(TextInRegProcedure, 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);
pfree(out_string);

View File

@ -7,7 +7,7 @@
*
*
* 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,
if (fcache->nullVect[i] == true)
*isNull = true;
return ((Datum) fmgr_c(fcache->func, fcache->foid, fcache->nargs,
(FmgrValues *) argv, isNull));
return ((Datum) fmgr_c(&fcache->func, (FmgrValues *) argv, isNull));
}
}

View File

@ -39,12 +39,9 @@ typedef struct AggFuncInfo
Oid xfn1_oid;
Oid xfn2_oid;
Oid finalfn_oid;
func_ptr xfn1;
func_ptr xfn2;
func_ptr finalfn;
int xfn1_nargs;
int xfn2_nargs;
int finalfn_nargs;
FmgrInfo xfn1;
FmgrInfo xfn2;
FmgrInfo finalfn;
} AggFuncInfo;
static Datum aggGetAttr(TupleTableSlot *tuple, Aggreg *agg, bool *isNull);
@ -160,12 +157,6 @@ ExecAgg(Agg *node)
Oid xfn1_oid,
xfn2_oid,
finalfn_oid;
func_ptr xfn1_ptr,
xfn2_ptr,
finalfn_ptr;
int xfn1_nargs,
xfn2_nargs,
finalfn_nargs;
agg = aggregates[i];
@ -191,18 +182,14 @@ ExecAgg(Agg *node)
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 = finalfn_ptr;
aggFuncInfo[i].finalfn_nargs = finalfn_nargs;
}
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 = xfn2_ptr;
aggFuncInfo[i].xfn2_nargs = xfn2_nargs;
value2[i] = (Datum) AggNameGetInitVal((char *) aggname,
aggp->aggbasetype,
2,
@ -219,10 +206,8 @@ ExecAgg(Agg *node)
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 = xfn1_ptr;
aggFuncInfo[i].xfn1_nargs = xfn1_nargs;
value1[i] = (Datum) AggNameGetInitVal((char *) aggname,
aggp->aggbasetype,
1,
@ -321,7 +306,7 @@ ExecAgg(Agg *node)
if (isNull && !aggregates[i]->usenulls)
continue; /* ignore this tuple for this agg */
if (aggfns->xfn1)
if (aggfns->xfn1.fn_addr != NULL)
{
if (noInitValue[i])
{
@ -389,20 +374,19 @@ ExecAgg(Agg *node)
args[0] = value1[i];
args[1] = newVal;
value1[i] =
(Datum) fmgr_c(aggfns->xfn1, aggfns->xfn1_oid,
aggfns->xfn1_nargs, (FmgrValues *) args,
(Datum) fmgr_c(&aggfns->xfn1,
(FmgrValues *) args,
&isNull1);
Assert(!isNull1);
}
}
if (aggfns->xfn2)
if (aggfns->xfn2.fn_addr != NULL)
{
Datum xfn2_val = value2[i];
value2[i] =
(Datum) fmgr_c(aggfns->xfn2, aggfns->xfn2_oid,
aggfns->xfn2_nargs,
(Datum) fmgr_c(&aggfns->xfn2,
(FmgrValues *) &xfn2_val, &isNull2);
Assert(!isNull2);
}
@ -437,29 +421,27 @@ ExecAgg(Agg *node)
* 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[1] = (char *) value2[i];
}
else if (aggfns->xfn1)
else if (aggfns->xfn1.fn_addr != NULL)
{
args[0] = (char *) value1[i];
}
else if (aggfns->xfn2)
else if (aggfns->xfn2.fn_addr != NULL)
{
args[0] = (char *) value2[i];
}
else
elog(ERROR, "ExecAgg: no valid transition functions??");
value1[i] =
(Datum) fmgr_c(aggfns->finalfn, aggfns->finalfn_oid,
aggfns->finalfn_nargs, (FmgrValues *) args,
&(nulls[i]));
elog(WARN, "ExecAgg: no valid transition functions??");
value1[i] = (Datum) fmgr_c(&aggfns->finalfn,
(FmgrValues *) args, &(nulls[i]));
}
else if (aggfns->xfn1)
else if (aggfns->xfn1.fn_addr != NULL)
{
/*
@ -467,7 +449,7 @@ ExecAgg(Agg *node)
* fix the else part. -ay 2/95)
*/
}
else if (aggfns->xfn2)
else if (aggfns->xfn2.fn_addr != NULL)
{
value1[i] = value2[i];
}

View File

@ -8,7 +8,7 @@
*
*
* 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)
List *list = NIL;
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);
relation = heap_openr(InheritsRelationName);
@ -452,7 +453,8 @@ VersionGetParents(Oid verrelid)
Oid verbaseid;
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);
key[0].sk_argument = ObjectIdGetDatum(verrelid);
scan = heap_beginscan(relation, 0, false, 1, key);

View File

@ -8,7 +8,7 @@
#
#
# 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
# Passes any -D options on to cpp prior to generating the list
@ -81,7 +81,7 @@ cat > $HFILE <<FuNkYfMgRsTuFf
*
* 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
* ******************************
@ -111,16 +111,21 @@ typedef struct {
char *data[MAXFMGRARGS];
} FmgrValues;
typedef struct {
func_ptr fn_addr;
func_ptr fn_plhandler;
Oid fn_oid;
int fn_nargs;
} FmgrInfo;
/*
* defined in fmgr.c
*/
extern char *fmgr_pl(Oid func_id, int n_arguments, FmgrValues *values,
bool *isNull);
extern char *fmgr_c(func_ptr user_fn, Oid func_id, int n_arguments,
FmgrValues *values, bool *isNull);
extern void fmgr_info(Oid procedureId, func_ptr *function, int *nargs);
extern char *fmgr_c(FmgrInfo *finfo, FmgrValues *values, bool *isNull);
extern void fmgr_info(Oid procedureId, FmgrInfo *finfo);
extern func_ptr fmgr_faddr(FmgrInfo *finfo);
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,
char *args[], bool *isNull);
@ -139,11 +144,11 @@ extern void load_file(char *filename);
* we must).
*/
#ifdef TRACE_FMGR_PTR
#define FMGR_PTR2(FP, FID, ARG1, ARG2) \
fmgr_ptr(FP, FID, 2, ARG1, ARG2)
#define FMGR_PTR2(FINFO, ARG1, ARG2) \
fmgr_ptr(FINFO, 2, ARG1, ARG2)
#else
#define FMGR_PTR2(FP, FID, ARG1, ARG2) \
((FP) ? (*((func_ptr)(FP)))(ARG1, ARG2) : fmgr(FID, ARG1, ARG2))
#define FMGR_PTR2(FINFO, ARG1, ARG2) \
(((FINFO)->fn_addr) ? (*(fmgr_faddr(FINFO)))(ARG1, ARG2) : fmgr((FINFO)->fn_oid, ARG1, ARG2))
#endif
/*
@ -177,7 +182,7 @@ cat > $TABCFILE <<FuNkYfMgRtAbStUfF
*
*
* 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
*

View File

@ -7,7 +7,7 @@
*
*
* 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 @@
static int _ArrayCount(char *str, int dim[], int typdelim);
static char *
_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 *nbytes);
@ -105,10 +105,9 @@ array_in(char *string, /* input array in external form */
*p,
*q,
*r;
func_ptr inputproc;
FmgrInfo inputproc;
int i,
nitems,
dummy;
nitems;
int32 nbytes;
char *dataPtr;
ArrayType *retval = NULL;
@ -120,7 +119,7 @@ array_in(char *string, /* input array in external form */
system_cache_lookup(element_type, true, &typlen, &typbyval, &typdelim,
&typelem, &typinput, &typalign);
fmgr_info(typinput, &inputproc, &dummy);
fmgr_info(typinput, &inputproc);
string_save = (char *) palloc(strlen(string) + 3);
strcpy(string_save, string);
@ -208,7 +207,7 @@ array_in(char *string, /* input array in external form */
{
/* array not a large object */
dataPtr =
(char *) _ReadArrayStr(p, nitems, ndim, dim, inputproc, typelem,
(char *) _ReadArrayStr(p, nitems, ndim, dim, &inputproc, typelem,
typdelim, typlen, typbyval, typalign,
&nbytes);
nbytes += ARR_OVERHEAD(ndim);
@ -367,7 +366,7 @@ _ReadArrayStr(char *arrayStr,
int nitems,
int ndim,
int dim[],
func_ptr inputproc, /* function used for the
FmgrInfo *inputproc, /* function used for the
* conversion */
Oid typelem,
char typdelim,
@ -461,7 +460,7 @@ _ReadArrayStr(char *arrayStr,
*q = '\0';
if (i >= nitems)
elog(ERROR, "array_in: illformed array constant");
values[i] = (*inputproc) (p, typelem);
values[i] = (*fmgr_faddr(inputproc)) (p, typelem);
p = ++q;
if (!eoArray)
@ -620,7 +619,7 @@ array_out(ArrayType *v, Oid element_type)
char typdelim;
Oid typoutput,
typelem;
func_ptr outputproc;
FmgrInfo outputproc;
char typalign;
char *p,
@ -634,7 +633,6 @@ array_out(ArrayType *v, Oid element_type)
k,
indx[MAXDIM];
bool dummy_bool;
int dummy_int;
int ndim,
*dim;
@ -662,7 +660,7 @@ array_out(ArrayType *v, Oid element_type)
system_cache_lookup(element_type, false, &typlen, &typbyval,
&typdelim, &typelem, &typoutput, &typalign);
fmgr_info(typoutput, &outputproc, &dummy_int);
fmgr_info(typoutput, &outputproc);
sprintf(delim, "%c", typdelim);
ndim = ARR_NDIM(v);
dim = ARR_DIMS(v);
@ -688,21 +686,21 @@ array_out(ArrayType *v, Oid element_type)
switch (typlen)
{
case 1:
values[i] = (*outputproc) (*p, typelem);
values[i] = (*fmgr_faddr(&outputproc)) (*p, typelem);
break;
case 2:
values[i] = (*outputproc) (*(int16 *) p, typelem);
values[i] = (*fmgr_faddr(&outputproc)) (*(int16 *) p, typelem);
break;
case 3:
case 4:
values[i] = (*outputproc) (*(int32 *) p, typelem);
values[i] = (*fmgr_faddr(&outputproc)) (*(int32 *) p, typelem);
break;
}
p += typlen;
}
else
{
values[i] = (*outputproc) (p, typelem);
values[i] = (*fmgr_faddr(&outputproc)) (p, typelem);
if (typlen > 0)
p += typlen;
else

View File

@ -9,7 +9,7 @@
*
*
* 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)
procrel = heap_openr(ProcedureRelationName);
RelationSetLockForWrite(procrel);
fmgr_info(ObjectIdEqualRegProcedure,
&oidKey[0].sk_func,
&oidKey[0].sk_nargs);
&oidKey[0].sk_func);
oidKey[0].sk_nargs = oidKey[0].sk_func.fn_nargs;
oidKey[0].sk_argument = ObjectIdGetDatum(setoid);
pg_proc_scan = heap_beginscan(procrel,
0,

View File

@ -7,7 +7,7 @@
*
*
* 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:
* XXX This needs to use exception.h to handle recovery when
@ -213,8 +213,8 @@ CatalogCacheInitializeCache(struct catcache * cache,
EQPROC(tupdesc->attrs[cache->cc_key[i] - 1]->atttypid);
fmgr_info(cache->cc_skey[i].sk_procedure,
(func_ptr *) &cache->cc_skey[i].sk_func,
(int *) &cache->cc_skey[i].sk_nargs);
&cache->cc_skey[i].sk_func);
cache->cc_skey[i].sk_nargs = cache->cc_skey[i].sk_func.fn_nargs;
CACHE5_elog(DEBUG, "CatalogCacheInit %16s %d %d %x",
&relation->rd_rel->relname,

View File

@ -7,7 +7,7 @@
*
*
* 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,
* ----------------
*/
retval = (FunctionCachePtr) palloc(sizeof(FunctionCache));
memset(retval, 0, sizeof(FunctionCache));
if (!use_syscache)
elog(ERROR, "what the ????, init the fcache without the catalogs?");
@ -281,10 +282,12 @@ init_fcache(Oid foid,
if (retval->language != SQLlanguageId)
fmgr_info(foid, &(retval->func), &(retval->nargs));
else
retval->func = (func_ptr) NULL;
if (retval->language != SQLlanguageId) {
fmgr_info(foid, &(retval->func));
retval->nargs = retval->func.fn_nargs;
} else {
retval->func.fn_addr = (func_ptr) NULL;
}
return (retval);

View File

@ -7,7 +7,7 @@
*
*
* 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)
/* have to reinit the function pointers in the strategy maps */
for (i = 0; i < am->amstrategies; i++)
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;
/*

View File

@ -7,7 +7,7 @@
*
*
* 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,78 +32,64 @@
#include "commands/trigger.h"
char *
fmgr_pl(Oid func_id,
int n_arguments,
FmgrValues * values,
bool * isNull)
static FmgrInfo *fmgr_pl_finfo;
static char *
fmgr_pl(char *arg0, ...)
{
HeapTuple procedureTuple;
HeapTuple languageTuple;
Form_pg_proc procedureStruct;
Form_pg_language languageStruct;
func_ptr plcall_fn;
int plcall_nargs;
va_list pvar;
FmgrValues values;
bool isNull = false;
int i;
/* Fetch the pg_proc tuple from the syscache */
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);
memset(&values, 0, sizeof(values));
/* Fetch the pg_language tuple from the syscache */
languageTuple = SearchSysCacheTuple(LANOID,
ObjectIdGetDatum(procedureStruct->prolang),
0, 0, 0);
if (!HeapTupleIsValid(languageTuple))
{
elog(ERROR, "fmgr_pl(): Cache lookup of language %ld for procedure %ld failed.",
ObjectIdGetDatum(procedureStruct->prolang),
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));
if (fmgr_pl_finfo->fn_nargs > 0) {
values.data[0] = arg0;
if (fmgr_pl_finfo->fn_nargs > 1) {
va_start(pvar, arg0);
for (i = 1; i < fmgr_pl_finfo->fn_nargs; i++) {
values.data[i] = va_arg(pvar, char *);
}
va_end(pvar);
}
}
/* Call the PL handler */
CurrentTriggerData = NULL;
return (*plcall_fn) (func_id,
n_arguments,
values,
isNull);
}
char *
fmgr_c(func_ptr user_fn,
Oid func_id,
int n_arguments,
FmgrValues * values,
bool * isNull)
{
char *returnValue = (char *) NULL;
return (*(fmgr_pl_finfo->fn_plhandler)) (fmgr_pl_finfo,
&values,
&isNull);
}
char *
fmgr_c(FmgrInfo *finfo,
FmgrValues * values,
bool * isNull)
{
char *returnValue = (char *) NULL;
int n_arguments = finfo->fn_nargs;
func_ptr user_fn = fmgr_faddr(finfo);
if (user_fn == (func_ptr) NULL)
{
/*
* a NULL func_ptr denotet untrusted function (in postgres 4.2).
* Untrusted functions have very limited use and is clumsy. We now
* use this feature for procedural languages.
* Untrusted functions have very limited use and is clumsy. We
* just get rid of it.
*/
return fmgr_pl(func_id, n_arguments, values, isNull);
elog(WARN, "internal error: untrusted function not supported.");
}
/*
* If finfo contains a PL handler for this function,
* call that instead.
*/
if (finfo->fn_plhandler != NULL) {
return (*(finfo->fn_plhandler))(finfo, values, isNull);
}
switch (n_arguments)
@ -164,14 +150,14 @@ fmgr_c(func_ptr user_fn,
break;
default:
elog(ERROR, "fmgr_c: function %d: too many arguments (%d > %d)",
func_id, n_arguments, MAXFMGRARGS);
finfo->fn_oid, n_arguments, MAXFMGRARGS);
break;
}
return (returnValue);
}
void
fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
fmgr_info(Oid procedureId, FmgrInfo *finfo)
{
func_ptr user_fn = NULL;
FmgrCall *fcp;
@ -181,6 +167,10 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
Form_pg_language languageStruct;
Oid language;
finfo->fn_addr = NULL;
finfo->fn_plhandler = NULL;
finfo->fn_oid = procedureId;
if (!(fcp = fmgr_isbuiltin(procedureId)))
{
procedureTuple = SearchSysCacheTuple(PROOID,
@ -191,29 +181,29 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
elog(ERROR, "fmgr_info: function %d: cache lookup failed\n",
procedureId);
}
procedureStruct = (FormData_pg_proc *)
GETSTRUCT(procedureTuple);
procedureStruct = (FormData_pg_proc *) GETSTRUCT(procedureTuple);
if (!procedureStruct->proistrusted)
{
*function = (func_ptr) NULL;
*nargs = procedureStruct->pronargs;
finfo->fn_addr = (func_ptr) NULL;
finfo->fn_nargs = procedureStruct->pronargs;
return;
}
language = procedureStruct->prolang;
switch (language)
{
case INTERNALlanguageId:
user_fn = fmgr_lookupByName(procedureStruct->proname.data);
if (!user_fn)
elog(ERROR, "fmgr_info: function %s: not in internal table",
procedureStruct->proname.data);
finfo->fn_addr =
fmgr_lookupByName(procedureStruct->proname.data);
if (!finfo->fn_addr)
elog(WARN, "fmgr_info: function %s: not in internal table",
procedureStruct->proname.data);
break;
case ClanguageId:
user_fn = fmgr_dynamic(procedureId, nargs);
finfo->fn_addr = fmgr_dynamic(procedureId, &(finfo->fn_nargs));
break;
case SQLlanguageId:
user_fn = (func_ptr) NULL;
*nargs = procedureStruct->pronargs;
finfo->fn_addr = (func_ptr) NULL;
finfo->fn_nargs = procedureStruct->pronargs;
break;
default:
@ -236,8 +226,12 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
GETSTRUCT(languageTuple);
if (languageStruct->lanispl)
{
user_fn = (func_ptr) NULL;
*nargs = procedureStruct->pronargs;
FmgrInfo plfinfo;
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
{
@ -249,10 +243,16 @@ fmgr_info(Oid procedureId, func_ptr * function, int *nargs)
}
else
{
user_fn = fcp->func;
*nargs = fcp->nargs;
finfo->fn_addr = fcp->func;
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,...)
register i;
int pronargs;
FmgrValues values;
func_ptr user_fn;
FmgrInfo finfo;
bool isNull = false;
va_start(pvar, procedureId);
fmgr_info(procedureId, &user_fn, &pronargs);
fmgr_info(procedureId, &finfo);
pronargs = finfo.fn_nargs;
if (pronargs > MAXFMGRARGS)
{
@ -290,8 +291,7 @@ fmgr(Oid procedureId,...)
va_end(pvar);
/* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */
return (fmgr_c(user_fn, procedureId, pronargs, &values,
&isNull));
return (fmgr_c(&finfo, &values, &isNull));
}
/*
@ -301,20 +301,26 @@ fmgr(Oid procedureId,...)
* the pointer, but it's available for use with macros in fmgr.h if you
* want this routine to do sanity-checking for you.
*
* func_ptr, func_id, n_arguments, args...
* funcinfo, n_arguments, args...
*/
#ifdef NOT_USED
char *
fmgr_ptr(func_ptr user_fn, Oid func_id,...)
fmgr_ptr(FmgrInfo *finfo, ...)
{
va_list pvar;
register i;
int n_arguments;
FmgrInfo local_finfo;
FmgrValues values;
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);
local_finfo->fn_nargs = n_arguments;
if (n_arguments > MAXFMGRARGS)
{
elog(ERROR, "fmgr_ptr: function %d: too many arguments (%d > %d)",
@ -325,8 +331,7 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...)
va_end(pvar);
/* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */
return (fmgr_c(user_fn, func_id, n_arguments, &values,
&isNull));
return (fmgr_c(&local_finfo, &values, &isNull));
}
#endif
@ -339,16 +344,14 @@ fmgr_ptr(func_ptr user_fn, Oid func_id,...)
char *
fmgr_array_args(Oid procedureId, int nargs, char *args[], bool * isNull)
{
func_ptr user_fn;
int true_arguments;
FmgrInfo finfo;
fmgr_info(procedureId, &user_fn, &true_arguments);
fmgr_info(procedureId, &finfo);
finfo.fn_nargs = nargs;
/* XXX see WAY_COOL_ORTHOGONAL_FUNCTIONS */
return
(fmgr_c(user_fn,
procedureId,
true_arguments,
(fmgr_c(&finfo,
(FmgrValues *) args,
isNull));
}

View File

@ -8,7 +8,7 @@
*
*
* 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)
if (context->scanKeys[nkey].sk_flags & SK_COMMUTE)
{
if (!(result =
(long) (*context->scanKeys[nkey].sk_func) (rattr, lattr)))
(long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (rattr, lattr)))
result =
-(long) (*context->scanKeys[nkey].sk_func) (lattr, rattr);
-(long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (lattr, rattr);
}
else if (!(result =
(long) (*context->scanKeys[nkey].sk_func) (lattr, rattr)))
(long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (lattr, rattr)))
result =
-(long) (*context->scanKeys[nkey].sk_func) (rattr, lattr);
-(long) (*fmgr_faddr(&context->scanKeys[nkey].sk_func)) (rattr, lattr);
nkey++;
}
return (result == 1);

View File

@ -7,7 +7,7 @@
*
*
* 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
* Sorts the first relation into the second relation.
@ -1115,11 +1115,11 @@ _psort_cmp (HeapTuple *ltup, HeapTuple *rtup)
if (PsortKeys[nkey].sk_flags & SK_COMMUTE)
{
if (!(result = -(long) (*PsortKeys[nkey].sk_func) (rattr, lattr)))
result = (long) (*PsortKeys[nkey].sk_func) (lattr, rattr);
if (!(result = -(long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (rattr, lattr)))
result = (long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (lattr, rattr);
}
else if (!(result = -(long) (*PsortKeys[nkey].sk_func) (lattr, rattr)))
result = (long) (*PsortKeys[nkey].sk_func) (rattr, lattr);
else if (!(result = -(long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (lattr, rattr)))
result = (long) (*fmgr_faddr(&PsortKeys[nkey].sk_func)) (rattr, lattr);
nkey++;
}
return (result);

View File

@ -21,6 +21,8 @@
#include <utils/rel.h>
#include <storage/off.h>
#include <fmgr.h>
/*
** You can have as many strategies as you please in GiSTs, as
** long as your consistent method can handle them
@ -71,13 +73,13 @@ typedef struct GISTSTACK
typedef struct GISTSTATE
{
func_ptr consistentFn;
func_ptr unionFn;
func_ptr compressFn;
func_ptr decompressFn;
func_ptr penaltyFn;
func_ptr picksplitFn;
func_ptr equalFn;
FmgrInfo consistentFn;
FmgrInfo unionFn;
FmgrInfo compressFn;
FmgrInfo decompressFn;
FmgrInfo penaltyFn;
FmgrInfo picksplitFn;
FmgrInfo equalFn;
bool haskeytype;
bool keytypbyval;
} GISTSTATE;

View File

@ -6,7 +6,7 @@
*
* 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:
@ -17,13 +17,14 @@
#define SKEY_H
#include <access/attnum.h>
#include <fmgr.h>
typedef struct ScanKeyData
{
bits16 sk_flags; /* flags */
AttrNumber sk_attno; /* domain number */
RegProcedure sk_procedure; /* procedure OID */
func_ptr sk_func;
FmgrInfo sk_func;
int32 sk_nargs;
Datum sk_argument; /* data to compare */
} ScanKeyData;

View File

@ -6,7 +6,7 @@
*
* 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 \
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); \
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); \
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); \
\
if (!__test == !(__cur_keys->sk_flags & SK_NEGATE)) \

View File

@ -6,7 +6,7 @@
*
* 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
nonnull_cnt;
int32 max_cnt,
min_cnt;
func_ptr f_cmpeq,
FmgrInfo f_cmpeq,
f_cmplt,
f_cmpgt;
regproc outfunc;

View File

@ -6,19 +6,21 @@
*
* 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
#define FCACHE_H
#include <fmgr.h>
typedef struct
{
int typlen; /* length of the return type */
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) */
Oid foid; /* oid of the function in pg_proc */
Oid language; /* oid of the language in pg_language */

View File

@ -6,7 +6,7 @@
*
* 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
{
char *tgname;
Oid tgfoid;
func_ptr tgfunc;
func_ptr tgplfunc;
FmgrInfo tgfunc;
int16 tgtype;
int16 tgnargs;
int16 tgattr[8];