diff options
author | PostgreSQL Daemon <webmaster@postgresql.org> | 1998-01-15 19:46:37 +0000 |
---|---|---|
committer | PostgreSQL Daemon <webmaster@postgresql.org> | 1998-01-15 19:46:37 +0000 |
commit | baef78d96b799b6264a54f8cfce4fda2b2da9701 (patch) | |
tree | a842ceff78d7eba3de43ba866976d828cf6d2d34 /src/backend/access | |
parent | 763ff8aef848d71da079049890786edffc3302d6 (diff) | |
download | postgresql-baef78d96b799b6264a54f8cfce4fda2b2da9701.tar.gz postgresql-baef78d96b799b6264a54f8cfce4fda2b2da9701.zip |
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.
Diffstat (limited to 'src/backend/access')
-rw-r--r-- | src/backend/access/common/Makefile | 4 | ||||
-rw-r--r-- | src/backend/access/common/indexvalid.c | 6 | ||||
-rw-r--r-- | src/backend/access/common/scankey.c | 5 | ||||
-rw-r--r-- | src/backend/access/gist/gist.c | 35 | ||||
-rw-r--r-- | src/backend/access/gist/gistget.c | 4 | ||||
-rw-r--r-- | src/backend/access/index/istrat.c | 13 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtinsert.c | 5 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtsearch.c | 5 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtutils.c | 9 | ||||
-rw-r--r-- | src/backend/access/rtree/rtree.c | 59 |
10 files changed, 65 insertions, 80 deletions
diff --git a/src/backend/access/common/Makefile b/src/backend/access/common/Makefile index cf61311f553..594ec514db0 100644 --- a/src/backend/access/common/Makefile +++ b/src/backend/access/common/Makefile @@ -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 diff --git a/src/backend/access/common/indexvalid.c b/src/backend/access/common/indexvalid.c index 5a9f351568c..81240d2c443 100644 --- a/src/backend/access/common/indexvalid.c +++ b/src/backend/access/common/indexvalid.c @@ -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; } diff --git a/src/backend/access/common/scankey.c b/src/backend/access/common/scankey.c index 9fbe264ae5c..130a80ae6d3 100644 --- a/src/backend/access/common/scankey.c +++ b/src/backend/access/common/scankey.c @@ -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)); } diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index b247a93ed39..a510dc8b203 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -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) diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index 3e093745844..de250987755 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -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; diff --git a/src/backend/access/index/istrat.c b/src/backend/access/index/istrat.c index 3fc972a09a1..01825cc6848 100644 --- a/src/backend/access/index/istrat.c +++ b/src/backend/access/index/istrat.c @@ -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)) { diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index c903c6fd34a..b00dae99a0c 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -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); } diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index f763af2ee76..32bd77d8570 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -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; diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index ce6b3449de2..b7adfe2179e 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -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)); } diff --git a/src/backend/access/rtree/rtree.c b/src/backend/access/rtree/rtree.c index ac39b4d99b6..af401accd68 100644 --- a/src/backend/access/rtree/rtree.c +++ b/src/backend/access/rtree/rtree.c @@ -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; } |