From f2d120532207b8873a5e74e7350dd2904f377289 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 13 Jun 2000 07:35:40 +0000 Subject: [PATCH] Another batch of fmgr updates. I think I have gotten all old-style functions that take pass-by-value datatypes. Should be ready for port testing ... --- src/backend/access/gist/gist.c | 58 +- src/backend/access/gist/gistget.c | 10 +- src/backend/access/gist/gistscan.c | 51 +- src/backend/access/hash/hash.c | 124 ++-- src/backend/access/index/indexam.c | 7 +- src/backend/access/nbtree/nbtree.c | 104 ++- src/backend/access/rtree/rtget.c | 12 +- src/backend/access/rtree/rtproc.c | 12 +- src/backend/access/rtree/rtree.c | 48 +- src/backend/access/rtree/rtscan.c | 51 +- src/backend/catalog/pg_type.c | 8 +- src/backend/executor/execQual.c | 54 +- src/backend/parser/parse_node.c | 7 +- src/backend/utils/adt/arrayfuncs.c | 362 +++++---- src/backend/utils/adt/cash.c | 58 +- src/backend/utils/adt/chunk.c | 16 +- src/backend/utils/adt/float.c | 32 +- src/backend/utils/adt/formatting.c | 125 ++-- src/backend/utils/adt/geo_ops.c | 15 +- src/backend/utils/adt/int8.c | 695 ++++++++---------- src/backend/utils/adt/numeric.c | 122 ++- src/backend/utils/adt/oracle_compat.c | 59 +- src/backend/utils/adt/ruleutils.c | 18 +- src/backend/utils/adt/varchar.c | 198 +++-- src/backend/utils/adt/varlena.c | 85 +-- src/backend/utils/init/miscinit.c | 26 +- src/backend/utils/mb/common.c | 22 +- src/backend/utils/mb/mbutils.c | 10 +- src/include/access/gist.h | 13 +- src/include/access/gistscan.h | 12 +- src/include/access/hash.h | 24 +- src/include/access/nbtree.h | 25 +- src/include/access/rtree.h | 27 +- src/include/catalog/catversion.h | 4 +- src/include/catalog/pg_proc.h | 284 ++++--- src/include/fmgr.h | 65 +- src/include/mb/pg_wchar.h | 8 +- src/include/miscadmin.h | 9 +- src/include/postgres.h | 23 +- src/include/utils/array.h | 39 +- src/include/utils/builtins.h | 70 +- src/include/utils/cash.h | 6 +- src/include/utils/formatting.h | 14 +- src/include/utils/geo_decls.h | 47 +- src/include/utils/int8.h | 95 ++- src/include/utils/numeric.h | 11 +- .../regress/input/create_function_1.source | 2 +- .../regress/input/create_function_2.source | 8 +- .../regress/output/create_function_1.source | 2 +- .../regress/output/create_function_2.source | 8 +- src/test/regress/regress.c | 47 +- 51 files changed, 1640 insertions(+), 1592 deletions(-) diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 7c3bb452cc..1d8c25104c 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.55 2000/05/30 04:24:28 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.56 2000/06/13 07:34:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -47,7 +47,6 @@ static BlockNumber gistChooseSubtree(Relation r, IndexTuple itup, int level, static OffsetNumber gistchoose(Relation r, Page p, IndexTuple it, GISTSTATE *giststate); static int gistnospace(Page p, IndexTuple it); -void gistdelete(Relation r, ItemPointer tid); static IndexTuple gist_tuple_replacekey(Relation r, GISTENTRY entry, IndexTuple t); static void gistcentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, Relation r, Page pg, OffsetNumber o, int b, bool l); @@ -60,17 +59,20 @@ static char *int_range_out(INTRANGE *r); /* ** routine to build an index. Basically calls insert over and over */ -void -gistbuild(Relation heap, - Relation index, - int natts, - AttrNumber *attnum, - IndexStrategy istrat, - uint16 pint, - Datum *params, - FuncIndexInfo *finfo, - PredInfo *predInfo) +Datum +gistbuild(PG_FUNCTION_ARGS) { + Relation heap = (Relation) PG_GETARG_POINTER(0); + Relation index = (Relation) PG_GETARG_POINTER(1); + int32 natts = PG_GETARG_INT32(2); + AttrNumber *attnum = (AttrNumber *) PG_GETARG_POINTER(3); +#ifdef NOT_USED + IndexStrategy istrat = (IndexStrategy) PG_GETARG_POINTER(4); + uint16 pcount = PG_GETARG_UINT16(5); + Datum *params = (Datum *) PG_GETARG_POINTER(6); +#endif + FuncIndexInfo *finfo = (FuncIndexInfo *) PG_GETARG_POINTER(7); + PredInfo *predInfo = (PredInfo *) PG_GETARG_POINTER(8); HeapScanDesc scan; AttrNumber i; HeapTuple htup; @@ -83,12 +85,10 @@ gistbuild(Relation heap, int nb, nh, ni; - #ifndef OMIT_PARTIAL_INDEX ExprContext *econtext; TupleTable tupleTable; TupleTableSlot *slot; - #endif Node *pred, *oldPred; @@ -302,6 +302,8 @@ gistbuild(Relation heap, /* be tidy */ pfree(nulls); pfree(d); + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* @@ -310,9 +312,16 @@ gistbuild(Relation heap, * This is the public interface routine for tuple insertion in GiSTs. * It doesn't do any work; just locks the relation and passes the buck. */ -InsertIndexResult -gistinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) +Datum +gistinsert(PG_FUNCTION_ARGS) { + Relation r = (Relation) PG_GETARG_POINTER(0); + Datum *datum = (Datum *) PG_GETARG_POINTER(1); + char *nulls = (char *) PG_GETARG_POINTER(2); + ItemPointer ht_ctid = (ItemPointer) PG_GETARG_POINTER(3); +#ifdef NOT_USED + Relation heapRel = (Relation) PG_GETARG_POINTER(4); +#endif InsertIndexResult res; IndexTuple itup; GISTSTATE giststate; @@ -351,7 +360,7 @@ gistinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation pfree(itup); pfree(compvec); - return res; + PG_RETURN_POINTER(res); } /* @@ -596,7 +605,9 @@ gistAdjustKeys(Relation r, /* delete old tuple */ ItemPointerSet(&oldtid, stk->gs_blk, stk->gs_child); - gistdelete(r, (ItemPointer) &oldtid); + DirectFunctionCall2(gistdelete, + PointerGetDatum(r), + PointerGetDatum(&oldtid)); /* generate and insert new tuple */ tupDesc = r->rd_att; @@ -890,7 +901,9 @@ gistintinsert(Relation r, /* remove old left pointer, insert the 2 new entries */ ItemPointerSet(<id, stk->gs_blk, stk->gs_child); - gistdelete(r, (ItemPointer) <id); + DirectFunctionCall2(gistdelete, + PointerGetDatum(r), + PointerGetDatum(<id)); gistentryinserttwo(r, stk, ltup, rtup, giststate); } @@ -1105,9 +1118,11 @@ gistfreestack(GISTSTACK *s) /* ** remove an entry from a page */ -void -gistdelete(Relation r, ItemPointer tid) +Datum +gistdelete(PG_FUNCTION_ARGS) { + Relation r = (Relation) PG_GETARG_POINTER(0); + ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1); BlockNumber blkno; OffsetNumber offnum; Buffer buf; @@ -1134,6 +1149,7 @@ gistdelete(Relation r, ItemPointer tid) WriteBuffer(buf); + PG_RETURN_POINTER(NULL); /* no real return value */ } void diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index c08a5cc2fe..f7b49430d0 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -29,21 +29,23 @@ static bool gistindex_keytest(IndexTuple tuple, TupleDesc tupdesc, Relation r, Page p, OffsetNumber offset); -RetrieveIndexResult -gistgettuple(IndexScanDesc s, ScanDirection dir) +Datum +gistgettuple(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); + ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); RetrieveIndexResult res; /* if we have it cached in the scan desc, just return the value */ if ((res = gistscancache(s, dir)) != (RetrieveIndexResult) NULL) - return res; + PG_RETURN_POINTER(res); /* not cached, so we'll have to do some work */ if (ItemPointerIsValid(&(s->currentItemData))) res = gistnext(s, dir); else res = gistfirst(s, dir); - return res; + PG_RETURN_POINTER(res); } static RetrieveIndexResult diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index 2196e897e4..729837e800 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -48,12 +48,13 @@ typedef GISTScanListData *GISTScanList; /* pointer to list of local scans on GiSTs */ static GISTScanList GISTScans = (GISTScanList) NULL; -IndexScanDesc -gistbeginscan(Relation r, - bool fromEnd, - uint16 nkeys, - ScanKey key) +Datum +gistbeginscan(PG_FUNCTION_ARGS) { + Relation r = (Relation) PG_GETARG_POINTER(0); + bool fromEnd = PG_GETARG_BOOL(1); + uint16 nkeys = PG_GETARG_UINT16(2); + ScanKey key = (ScanKey) PG_GETARG_POINTER(3); IndexScanDesc s; /* @@ -65,21 +66,18 @@ gistbeginscan(Relation r, s = RelationGetIndexScan(r, fromEnd, nkeys, key); gistregscan(s); - return s; + PG_RETURN_POINTER(s); } -void -gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key) +Datum +gistrescan(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); + bool fromEnd = PG_GETARG_BOOL(1); + ScanKey key = (ScanKey) PG_GETARG_POINTER(2); GISTScanOpaque p; int i; - if (!IndexScanIsValid(s)) - { - elog(ERROR, "gistrescan: invalid scan."); - return; - } - /* * Clear all the pointers. */ @@ -155,11 +153,14 @@ gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key) s->keyData[i].sk_func = p->giststate->consistentFn; } } + + PG_RETURN_POINTER(NULL); /* no real return value */ } -void -gistmarkpos(IndexScanDesc s) +Datum +gistmarkpos(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); GISTScanOpaque p; GISTSTACK *o, *n, @@ -188,11 +189,14 @@ gistmarkpos(IndexScanDesc s) gistfreestack(p->s_markstk); p->s_markstk = o; + + PG_RETURN_POINTER(NULL); /* no real return value */ } -void -gistrestrpos(IndexScanDesc s) +Datum +gistrestrpos(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); GISTScanOpaque p; GISTSTACK *o, *n, @@ -221,12 +225,15 @@ gistrestrpos(IndexScanDesc s) gistfreestack(p->s_stack); p->s_stack = o; + + PG_RETURN_POINTER(NULL); /* no real return value */ } -void -gistendscan(IndexScanDesc s) +Datum +gistendscan(PG_FUNCTION_ARGS) { - GISTScanOpaque p; + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); + GISTScanOpaque p; p = (GISTScanOpaque) s->opaque; @@ -239,6 +246,8 @@ gistendscan(IndexScanDesc s) gistdropscan(s); /* XXX don't unset read lock -- two-phase locking */ + + PG_RETURN_POINTER(NULL); /* no real return value */ } static void diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index 1e5bc15bf2..eec339f42d 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.37 2000/04/12 17:14:43 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.38 2000/06/13 07:34:28 tgl Exp $ * * NOTES * This file contains only the public interface routines. @@ -36,17 +36,20 @@ bool BuildingHash = false; * since the index won't be visible until this transaction commits * and since building is guaranteed to be single-threaded. */ -void -hashbuild(Relation heap, - Relation index, - int natts, - AttrNumber *attnum, - IndexStrategy istrat, - uint16 pcount, - Datum *params, - FuncIndexInfo *finfo, - PredInfo *predInfo) +Datum +hashbuild(PG_FUNCTION_ARGS) { + Relation heap = (Relation) PG_GETARG_POINTER(0); + Relation index = (Relation) PG_GETARG_POINTER(1); + int32 natts = PG_GETARG_INT32(2); + AttrNumber *attnum = (AttrNumber *) PG_GETARG_POINTER(3); +#ifdef NOT_USED + IndexStrategy istrat = (IndexStrategy) PG_GETARG_POINTER(4); + uint16 pcount = PG_GETARG_UINT16(5); + Datum *params = (Datum *) PG_GETARG_POINTER(6); +#endif + FuncIndexInfo *finfo = (FuncIndexInfo *) PG_GETARG_POINTER(7); + PredInfo *predInfo = (PredInfo *) PG_GETARG_POINTER(8); HeapScanDesc hscan; HeapTuple htup; IndexTuple itup; @@ -262,6 +265,8 @@ hashbuild(Relation heap, /* all done */ BuildingHash = false; + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* @@ -271,20 +276,26 @@ hashbuild(Relation heap, * for the new tuple, put it there, and return an InsertIndexResult * to the caller. */ -InsertIndexResult -hashinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) +Datum +hashinsert(PG_FUNCTION_ARGS) { + Relation rel = (Relation) PG_GETARG_POINTER(0); + Datum *datum = (Datum *) PG_GETARG_POINTER(1); + char *nulls = (char *) PG_GETARG_POINTER(2); + ItemPointer ht_ctid = (ItemPointer) PG_GETARG_POINTER(3); +#ifdef NOT_USED + Relation heapRel = (Relation) PG_GETARG_POINTER(4); +#endif + InsertIndexResult res; HashItem hitem; IndexTuple itup; - InsertIndexResult res; - /* generate an index tuple */ itup = index_formtuple(RelationGetDescr(rel), datum, nulls); itup->t_tid = *ht_ctid; if (itup->t_info & INDEX_NULL_MASK) - return (InsertIndexResult) NULL; + PG_RETURN_POINTER((InsertIndexResult) NULL); hitem = _hash_formitem(itup); @@ -293,16 +304,18 @@ hashinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relatio pfree(hitem); pfree(itup); - return res; + PG_RETURN_POINTER(res); } /* * hashgettuple() -- Get the next tuple in the scan. */ -char * -hashgettuple(IndexScanDesc scan, ScanDirection dir) +Datum +hashgettuple(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); + ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); RetrieveIndexResult res; /* @@ -316,19 +329,20 @@ hashgettuple(IndexScanDesc scan, ScanDirection dir) else res = _hash_first(scan, dir); - return (char *) res; + PG_RETURN_POINTER(res); } /* * hashbeginscan() -- start a scan on a hash index */ -char * -hashbeginscan(Relation rel, - bool fromEnd, - uint16 keysz, - ScanKey scankey) +Datum +hashbeginscan(PG_FUNCTION_ARGS) { + Relation rel = (Relation) PG_GETARG_POINTER(0); + bool fromEnd = PG_GETARG_BOOL(1); + uint16 keysz = PG_GETARG_UINT16(2); + ScanKey scankey = (ScanKey) PG_GETARG_POINTER(3); IndexScanDesc scan; HashScanOpaque so; @@ -341,15 +355,20 @@ hashbeginscan(Relation rel, /* register scan in case we change pages it's using */ _hash_regscan(scan); - return (char *) scan; + PG_RETURN_POINTER(scan); } /* * hashrescan() -- rescan an index relation */ -void -hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) +Datum +hashrescan(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); +#ifdef NOT_USED /* XXX surely it's wrong to ignore this? */ + bool fromEnd = PG_GETARG_BOOL(1); +#endif + ScanKey scankey = (ScanKey) PG_GETARG_POINTER(2); ItemPointer iptr; HashScanOpaque so; @@ -376,15 +395,17 @@ hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) scankey, scan->numberOfKeys * sizeof(ScanKeyData)); } + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* * hashendscan() -- close down a scan */ -void -hashendscan(IndexScanDesc scan) +Datum +hashendscan(PG_FUNCTION_ARGS) { - + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer iptr; HashScanOpaque so; @@ -411,26 +432,21 @@ hashendscan(IndexScanDesc scan) /* be tidy */ pfree(scan->opaque); + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* * hashmarkpos() -- save current scan position * */ -void -hashmarkpos(IndexScanDesc scan) +Datum +hashmarkpos(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer iptr; HashScanOpaque so; - /* - * see if we ever call this code. if we do, then so_mrkbuf a useful - * element in the scan->opaque structure. if this procedure is never - * called, so_mrkbuf should be removed from the scan->opaque - * structure. - */ - elog(NOTICE, "Hashmarkpos() called."); - so = (HashScanOpaque) scan->opaque; /* release lock on old marked data, if any */ @@ -449,25 +465,20 @@ hashmarkpos(IndexScanDesc scan) HASH_READ); scan->currentMarkData = scan->currentItemData; } + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* * hashrestrpos() -- restore scan to last saved position */ -void -hashrestrpos(IndexScanDesc scan) +Datum +hashrestrpos(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer iptr; HashScanOpaque so; - /* - * see if we ever call this code. if we do, then so_mrkbuf a useful - * element in the scan->opaque structure. if this procedure is never - * called, so_mrkbuf should be removed from the scan->opaque - * structure. - */ - elog(NOTICE, "Hashrestrpos() called."); - so = (HashScanOpaque) scan->opaque; /* release lock on current data, if any */ @@ -487,15 +498,22 @@ hashrestrpos(IndexScanDesc scan) scan->currentItemData = scan->currentMarkData; } + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* stubs */ -void -hashdelete(Relation rel, ItemPointer tid) +Datum +hashdelete(PG_FUNCTION_ARGS) { + Relation rel = (Relation) PG_GETARG_POINTER(0); + ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1); + /* adjust any active scans that will be affected by this deletion */ _hash_adjscans(rel, tid); /* delete the data from the page */ _hash_pagedel(rel, tid); + + PG_RETURN_POINTER(NULL); /* no real return value */ } diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c index 7f402a33e3..2d1504238d 100644 --- a/src/backend/access/index/indexam.c +++ b/src/backend/access/index/indexam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.44 2000/05/30 04:24:32 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.45 2000/06/13 07:34:35 tgl Exp $ * * INTERFACE ROUTINES * index_open - open an index relation by relationId @@ -195,13 +195,12 @@ index_insert(Relation relation, * ---------------- */ specificResult = (InsertIndexResult) - DatumGetPointer(OidFunctionCall6(procedure, + DatumGetPointer(OidFunctionCall5(procedure, PointerGetDatum(relation), PointerGetDatum(datum), PointerGetDatum(nulls), PointerGetDatum(heap_t_ctid), - PointerGetDatum(heapRel), - PointerGetDatum(NULL))); + PointerGetDatum(heapRel))); /* must be pfree'ed */ return specificResult; diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index 58469932e9..ccd5a265d3 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -12,7 +12,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.55 2000/05/31 00:28:14 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.56 2000/06/13 07:34:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -42,17 +42,20 @@ static void _bt_restscan(IndexScanDesc scan); * since the index won't be visible until this transaction commits * and since building is guaranteed to be single-threaded. */ -void -btbuild(Relation heap, - Relation index, - int natts, - AttrNumber *attnum, - IndexStrategy istrat, - uint16 pcount, - Datum *params, - FuncIndexInfo *finfo, - PredInfo *predInfo) +Datum +btbuild(PG_FUNCTION_ARGS) { + Relation heap = (Relation) PG_GETARG_POINTER(0); + Relation index = (Relation) PG_GETARG_POINTER(1); + int32 natts = PG_GETARG_INT32(2); + AttrNumber *attnum = (AttrNumber *) PG_GETARG_POINTER(3); +#ifdef NOT_USED + IndexStrategy istrat = (IndexStrategy) PG_GETARG_POINTER(4); + uint16 pcount = PG_GETARG_UINT16(5); + Datum *params = (Datum *) PG_GETARG_POINTER(6); +#endif + FuncIndexInfo *finfo = (FuncIndexInfo *) PG_GETARG_POINTER(7); + PredInfo *predInfo = (PredInfo *) PG_GETARG_POINTER(8); HeapScanDesc hscan; HeapTuple htup; IndexTuple itup; @@ -332,6 +335,8 @@ btbuild(Relation heap, /* all done */ BuildingBtree = false; + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* @@ -341,12 +346,17 @@ btbuild(Relation heap, * new tuple, put it there, set its unique OID as appropriate, and * return an InsertIndexResult to the caller. */ -InsertIndexResult -btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) +Datum +btinsert(PG_FUNCTION_ARGS) { + Relation rel = (Relation) PG_GETARG_POINTER(0); + Datum *datum = (Datum *) PG_GETARG_POINTER(1); + char *nulls = (char *) PG_GETARG_POINTER(2); + ItemPointer ht_ctid = (ItemPointer) PG_GETARG_POINTER(3); + Relation heapRel = (Relation) PG_GETARG_POINTER(4); + InsertIndexResult res; BTItem btitem; IndexTuple itup; - InsertIndexResult res; /* generate an index tuple */ itup = index_formtuple(RelationGetDescr(rel), datum, nulls); @@ -355,7 +365,8 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation /* * See comments in btbuild. * - * if (itup->t_info & INDEX_NULL_MASK) return (InsertIndexResult) NULL; + * if (itup->t_info & INDEX_NULL_MASK) + * PG_RETURN_POINTER((InsertIndexResult) NULL); */ btitem = _bt_formitem(itup); @@ -366,15 +377,17 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation pfree(btitem); pfree(itup); - return res; + PG_RETURN_POINTER(res); } /* * btgettuple() -- Get the next tuple in the scan. */ -char * -btgettuple(IndexScanDesc scan, ScanDirection dir) +Datum +btgettuple(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); + ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); RetrieveIndexResult res; /* @@ -403,18 +416,23 @@ btgettuple(IndexScanDesc scan, ScanDirection dir) if (res) { ((BTScanOpaque) scan->opaque)->curHeapIptr = res->heap_iptr; - LockBuffer(((BTScanOpaque) scan->opaque)->btso_curbuf, BUFFER_LOCK_UNLOCK); + LockBuffer(((BTScanOpaque) scan->opaque)->btso_curbuf, + BUFFER_LOCK_UNLOCK); } - return (char *) res; + PG_RETURN_POINTER(res); } /* * btbeginscan() -- start a scan on a btree index */ -char * -btbeginscan(Relation rel, bool fromEnd, uint16 keysz, ScanKey scankey) +Datum +btbeginscan(PG_FUNCTION_ARGS) { + Relation rel = (Relation) PG_GETARG_POINTER(0); + bool fromEnd = PG_GETARG_BOOL(1); + uint16 keysz = PG_GETARG_UINT16(2); + ScanKey scankey = (ScanKey) PG_GETARG_POINTER(3); IndexScanDesc scan; /* get the scan */ @@ -423,15 +441,20 @@ btbeginscan(Relation rel, bool fromEnd, uint16 keysz, ScanKey scankey) /* register scan in case we change pages it's using */ _bt_regscan(scan); - return (char *) scan; + PG_RETURN_POINTER(scan); } /* * btrescan() -- rescan an index relation */ -void -btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) +Datum +btrescan(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); +#ifdef NOT_USED /* XXX surely it's wrong to ignore this? */ + bool fromEnd = PG_GETARG_BOOL(1); +#endif + ScanKey scankey = (ScanKey) PG_GETARG_POINTER(2); ItemPointer iptr; BTScanOpaque so; @@ -479,6 +502,7 @@ btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) so->numberOfKeys * sizeof(ScanKeyData)); } + PG_RETURN_POINTER(NULL); /* no real return value */ } void @@ -504,9 +528,10 @@ btmovescan(IndexScanDesc scan, Datum v) /* * btendscan() -- close down a scan */ -void -btendscan(IndexScanDesc scan) +Datum +btendscan(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer iptr; BTScanOpaque so; @@ -534,14 +559,17 @@ btendscan(IndexScanDesc scan) pfree(so); _bt_dropscan(scan); + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* * btmarkpos() -- save current scan position */ -void -btmarkpos(IndexScanDesc scan) +Datum +btmarkpos(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer iptr; BTScanOpaque so; @@ -563,14 +591,17 @@ btmarkpos(IndexScanDesc scan) scan->currentMarkData = scan->currentItemData; so->mrkHeapIptr = so->curHeapIptr; } + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* * btrestrpos() -- restore scan to last saved position */ -void -btrestrpos(IndexScanDesc scan) +Datum +btrestrpos(PG_FUNCTION_ARGS) { + IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ItemPointer iptr; BTScanOpaque so; @@ -593,17 +624,24 @@ btrestrpos(IndexScanDesc scan) scan->currentItemData = scan->currentMarkData; so->curHeapIptr = so->mrkHeapIptr; } + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* stubs */ -void -btdelete(Relation rel, ItemPointer tid) +Datum +btdelete(PG_FUNCTION_ARGS) { + Relation rel = (Relation) PG_GETARG_POINTER(0); + ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1); + /* adjust any active scans that will be affected by this deletion */ _bt_adjscans(rel, tid); /* delete the data from the page */ _bt_pagedel(rel, tid); + + PG_RETURN_POINTER(NULL); /* no real return value */ } static void diff --git a/src/backend/access/rtree/rtget.c b/src/backend/access/rtree/rtget.c index 5b99e807f6..8854163def 100644 --- a/src/backend/access/rtree/rtget.c +++ b/src/backend/access/rtree/rtget.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtget.c,v 1.20 2000/01/26 05:56:00 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtget.c,v 1.21 2000/06/13 07:34:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,21 +28,23 @@ static RetrieveIndexResult rtnext(IndexScanDesc s, ScanDirection dir); static ItemPointer rtheapptr(Relation r, ItemPointer itemp); -RetrieveIndexResult -rtgettuple(IndexScanDesc s, ScanDirection dir) +Datum +rtgettuple(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); + ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1); RetrieveIndexResult res; /* if we have it cached in the scan desc, just return the value */ if ((res = rtscancache(s, dir)) != (RetrieveIndexResult) NULL) - return res; + PG_RETURN_POINTER(res); /* not cached, so we'll have to do some work */ if (ItemPointerIsValid(&(s->currentItemData))) res = rtnext(s, dir); else res = rtfirst(s, dir); - return res; + PG_RETURN_POINTER(res); } static RetrieveIndexResult diff --git a/src/backend/access/rtree/rtproc.c b/src/backend/access/rtree/rtproc.c index 6b571c7d4a..df410045c2 100644 --- a/src/backend/access/rtree/rtproc.c +++ b/src/backend/access/rtree/rtproc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtproc.c,v 1.25 2000/01/26 05:56:00 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtproc.c,v 1.26 2000/06/13 07:34:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -102,13 +102,15 @@ rt_poly_union(POLYGON *a, POLYGON *b) return p; } -void -rt_poly_size(POLYGON *a, float *size) +Datum +rt_poly_size(PG_FUNCTION_ARGS) { + POLYGON *a = PG_GETARG_POLYGON_P(0); + /* NB: size is an output argument */ + float *size = (float *) PG_GETARG_POINTER(1); double xdim, ydim; - size = (float *) palloc(sizeof(float)); if (a == (POLYGON *) NULL || a->boundbox.high.x <= a->boundbox.low.x || a->boundbox.high.y <= a->boundbox.low.y) @@ -121,7 +123,7 @@ rt_poly_size(POLYGON *a, float *size) *size = (float) (xdim * ydim); } - return; + PG_RETURN_POINTER(NULL); /* no real return value */ } POLYGON * diff --git a/src/backend/access/rtree/rtree.c b/src/backend/access/rtree/rtree.c index 020f6bdff8..358d307d0b 100644 --- a/src/backend/access/rtree/rtree.c +++ b/src/backend/access/rtree/rtree.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.47 2000/05/30 04:24:34 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.48 2000/06/13 07:34:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -59,17 +59,20 @@ static int nospace(Page p, IndexTuple it); static void initRtstate(RTSTATE *rtstate, Relation index); -void -rtbuild(Relation heap, - Relation index, - int natts, - AttrNumber *attnum, - IndexStrategy istrat, - uint16 pcount, - Datum *params, - FuncIndexInfo *finfo, - PredInfo *predInfo) +Datum +rtbuild(PG_FUNCTION_ARGS) { + Relation heap = (Relation) PG_GETARG_POINTER(0); + Relation index = (Relation) PG_GETARG_POINTER(1); + int32 natts = PG_GETARG_INT32(2); + AttrNumber *attnum = (AttrNumber *) PG_GETARG_POINTER(3); +#ifdef NOT_USED + IndexStrategy istrat = (IndexStrategy) PG_GETARG_POINTER(4); + uint16 pcount = PG_GETARG_UINT16(5); + Datum *params = (Datum *) PG_GETARG_POINTER(6); +#endif + FuncIndexInfo *finfo = (FuncIndexInfo *) PG_GETARG_POINTER(7); + PredInfo *predInfo = (PredInfo *) PG_GETARG_POINTER(8); HeapScanDesc scan; AttrNumber i; HeapTuple htup; @@ -277,6 +280,8 @@ rtbuild(Relation heap, /* be tidy */ pfree(nulls); pfree(d); + + PG_RETURN_POINTER(NULL); /* no real return value */ } /* @@ -285,9 +290,16 @@ rtbuild(Relation heap, * This is the public interface routine for tuple insertion in rtrees. * It doesn't do any work; just locks the relation and passes the buck. */ -InsertIndexResult -rtinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) +Datum +rtinsert(PG_FUNCTION_ARGS) { + Relation r = (Relation) PG_GETARG_POINTER(0); + Datum *datum = (Datum *) PG_GETARG_POINTER(1); + char *nulls = (char *) PG_GETARG_POINTER(2); + ItemPointer ht_ctid = (ItemPointer) PG_GETARG_POINTER(3); +#ifdef NOT_USED + Relation heapRel = (Relation) PG_GETARG_POINTER(4); +#endif InsertIndexResult res; IndexTuple itup; RTSTATE rtState; @@ -305,7 +317,7 @@ rtinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation he res = rtdoinsert(r, itup, &rtState); - return res; + PG_RETURN_POINTER(res); } static InsertIndexResult @@ -982,9 +994,11 @@ freestack(RTSTACK *s) } } -char * -rtdelete(Relation r, ItemPointer tid) +Datum +rtdelete(PG_FUNCTION_ARGS) { + Relation r = (Relation) PG_GETARG_POINTER(0); + ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1); BlockNumber blkno; OffsetNumber offnum; Buffer buf; @@ -1011,7 +1025,7 @@ rtdelete(Relation r, ItemPointer tid) WriteBuffer(buf); - return (char *) NULL; + PG_RETURN_POINTER(NULL); /* no real return value */ } static void diff --git a/src/backend/access/rtree/rtscan.c b/src/backend/access/rtree/rtscan.c index 71e2acf5f8..97a71a0058 100644 --- a/src/backend/access/rtree/rtscan.c +++ b/src/backend/access/rtree/rtscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtscan.c,v 1.32 2000/04/12 17:14:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtscan.c,v 1.33 2000/06/13 07:34:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -51,12 +51,13 @@ typedef RTScanListData *RTScanList; /* pointer to list of local scans on rtrees */ static RTScanList RTScans = (RTScanList) NULL; -IndexScanDesc -rtbeginscan(Relation r, - bool fromEnd, - uint16 nkeys, - ScanKey key) +Datum +rtbeginscan(PG_FUNCTION_ARGS) { + Relation r = (Relation) PG_GETARG_POINTER(0); + bool fromEnd = PG_GETARG_BOOL(1); + uint16 nkeys = PG_GETARG_UINT16(2); + ScanKey key = (ScanKey) PG_GETARG_POINTER(3); IndexScanDesc s; /* @@ -68,22 +69,19 @@ rtbeginscan(Relation r, s = RelationGetIndexScan(r, fromEnd, nkeys, key); rtregscan(s); - return s; + PG_RETURN_POINTER(s); } -void -rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key) +Datum +rtrescan(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); + bool fromEnd = PG_GETARG_BOOL(1); + ScanKey key = (ScanKey) PG_GETARG_POINTER(2); RTreeScanOpaque p; RegProcedure internal_proc; int i; - if (!IndexScanIsValid(s)) - { - elog(ERROR, "rtrescan: invalid scan."); - return; - } - /* * Clear all the pointers. */ @@ -157,11 +155,14 @@ rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key) } } } + + PG_RETURN_POINTER(NULL); /* no real return value */ } -void -rtmarkpos(IndexScanDesc s) +Datum +rtmarkpos(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); RTreeScanOpaque p; RTSTACK *o, *n, @@ -190,11 +191,14 @@ rtmarkpos(IndexScanDesc s) freestack(p->s_markstk); p->s_markstk = o; + + PG_RETURN_POINTER(NULL); /* no real return value */ } -void -rtrestrpos(IndexScanDesc s) +Datum +rtrestrpos(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); RTreeScanOpaque p; RTSTACK *o, *n, @@ -223,11 +227,14 @@ rtrestrpos(IndexScanDesc s) freestack(p->s_stack); p->s_stack = o; + + PG_RETURN_POINTER(NULL); /* no real return value */ } -void -rtendscan(IndexScanDesc s) +Datum +rtendscan(PG_FUNCTION_ARGS) { + IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0); RTreeScanOpaque p; p = (RTreeScanOpaque) s->opaque; @@ -241,6 +248,8 @@ rtendscan(IndexScanDesc s) rtdropscan(s); /* XXX don't unset read lock -- two-phase locking */ + + PG_RETURN_POINTER(NULL); /* no real return value */ } static void diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 9386079997..bf706d5146 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.51 2000/05/28 17:55:54 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.52 2000/06/13 07:34:52 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -409,8 +409,8 @@ TypeCreate(char *typeName, /* * For array types, the input procedures may take 3 args (data * value, element OID, atttypmod); the pg_proc argtype - * signature is 0,0,INT4OID. The output procedures may take 2 - * args (data value, element OID). + * signature is 0,OIDOID,INT4OID. The output procedures may + * take 2 args (data value, element OID). */ if (OidIsValid(elementObjectId)) { @@ -420,11 +420,13 @@ TypeCreate(char *typeName, { /* output proc */ nargs = 2; + argList[1] = OIDOID; } else { /* input proc */ nargs = 3; + argList[1] = OIDOID; argList[2] = INT4OID; } tup = SearchSysCacheTuple(PROCNAME, diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c index a53957c4f4..06b2b49ca8 100644 --- a/src/backend/executor/execQual.c +++ b/src/backend/executor/execQual.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.70 2000/05/28 17:55:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.71 2000/06/13 07:34:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -105,6 +105,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, econtext, isNull, isDone); + /* If refexpr yields NULL, result is always NULL, for now anyway */ if (*isNull) return (Datum) NULL; } @@ -132,6 +133,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, econtext, isNull, &dummy); + /* If any index expr yields NULL, result is NULL */ if (*isNull) return (Datum) NULL; } @@ -148,6 +150,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, econtext, isNull, &dummy); + /* If any index expr yields NULL, result is NULL */ if (*isNull) return (Datum) NULL; } @@ -165,7 +168,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, econtext, isNull, &dummy); - + /* For now, can't cope with inserting NULL into an array */ if (*isNull) return (Datum) NULL; @@ -175,30 +178,43 @@ ExecEvalArrayRef(ArrayRef *arrayRef, if (array_scanner == NULL) return sourceData; /* XXX do something else? */ + /* + * XXX shouldn't we copy the array value before modifying it?? + * + * Or perhaps these array routines should deliver a modified copy + * instead of changing the source in-place. + */ if (lIndex == NULL) - return (Datum) array_set(array_scanner, i, upper.indx, - (char *) sourceData, - arrayRef->refelembyval, - arrayRef->refelemlength, - arrayRef->refattrlength, isNull); - return (Datum) array_assgn(array_scanner, i, upper.indx, - lower.indx, - (ArrayType *) sourceData, - arrayRef->refelembyval, - arrayRef->refelemlength, isNull); + return PointerGetDatum(array_set(array_scanner, i, + upper.indx, + sourceData, + arrayRef->refelembyval, + arrayRef->refelemlength, + arrayRef->refattrlength, + isNull)); + return PointerGetDatum(array_assgn(array_scanner, i, + upper.indx, lower.indx, + (ArrayType *) DatumGetPointer(sourceData), + arrayRef->refelembyval, + arrayRef->refelemlength, + isNull)); } execConstByVal = arrayRef->refelembyval; execConstLen = arrayRef->refelemlength; if (lIndex == NULL) - return (Datum) array_ref(array_scanner, i, upper.indx, - arrayRef->refelembyval, - arrayRef->refelemlength, - arrayRef->refattrlength, isNull); - return (Datum) array_clip(array_scanner, i, upper.indx, lower.indx, - arrayRef->refelembyval, - arrayRef->refelemlength, isNull); + return array_ref(array_scanner, i, + upper.indx, + arrayRef->refelembyval, + arrayRef->refelemlength, + arrayRef->refattrlength, + isNull); + return PointerGetDatum(array_clip(array_scanner, i, + upper.indx, lower.indx, + arrayRef->refelembyval, + arrayRef->refelemlength, + isNull)); } diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index dcec30b158..94293859db 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.40 2000/05/28 17:56:00 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_node.c,v 1.41 2000/06/13 07:35:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -450,7 +450,10 @@ make_const(Value *value) } else { - val = PointerGetDatum(numeric_in(strVal(value), 0, -1)); + val = DirectFunctionCall3(numeric_in, + CStringGetDatum(strVal(value)), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(-1)); typeid = NUMERICOID; typelen = -1; /* variable len */ diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index b721728919..d54a6847bd 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.56 2000/06/09 01:11:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.57 2000/06/13 07:35:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -68,7 +68,7 @@ static void _LOArrayRange(int *st, int *endp, int bsize, int srcfd, int destfd, ArrayType *array, int isSrcLO, bool *isNull); static void _ReadArray(int *st, int *endp, int bsize, int srcfd, int destfd, ArrayType *array, int isDestLO, bool *isNull); -static int ArrayCastAndSet(char *src, bool typbyval, int typlen, char *dest); +static int ArrayCastAndSet(Datum src, bool typbyval, int typlen, char *dest); static int SanityCheckInput(int ndim, int n, int *dim, int *lb, int *indx); static int array_read(char *destptr, int eltsize, int nitems, char *srcptr); static char *array_seek(char *ptr, int eltsize, int nitems); @@ -76,16 +76,17 @@ static char *array_seek(char *ptr, int eltsize, int nitems); /*--------------------------------------------------------------------- * array_in : * converts an array from the external format in "string" to - * it internal format. + * its internal format. * return value : * the internal representation of the input array *-------------------------------------------------------------------- */ -char * -array_in(char *string, /* input array in external form */ - Oid element_type, /* type OID of an array element */ - int32 typmod) +Datum +array_in(PG_FUNCTION_ARGS) { + char *string = PG_GETARG_CSTRING(0); /* external form */ + Oid element_type = PG_GETARG_OID(1); /* type of an array element */ + int32 typmod = PG_GETARG_INT32(2); /* typmod for array elements */ int typlen; bool typbyval, done; @@ -101,7 +102,7 @@ array_in(char *string, /* input array in external form */ nitems; int32 nbytes; char *dataPtr; - ArrayType *retval = NULL; + ArrayType *retval; int ndim, dim[MAXDIM], lBound[MAXDIM]; @@ -183,11 +184,10 @@ array_in(char *string, /* input array in external form */ nitems = getNitems(ndim, dim); if (nitems == 0) { - char *emptyArray = palloc(sizeof(ArrayType)); - - MemSet(emptyArray, 0, sizeof(ArrayType)); - *(int32 *) emptyArray = sizeof(ArrayType); - return emptyArray; + retval = (ArrayType *) palloc(sizeof(ArrayType)); + MemSet(retval, 0, sizeof(ArrayType)); + *(int32 *) retval = sizeof(ArrayType); + return PointerGetDatum(retval); } if (*p == '{') @@ -235,9 +235,10 @@ array_in(char *string, /* input array in external form */ memmove(ARR_DATA_PTR(retval), dataPtr, bytes); #endif elog(ERROR, "large object arrays not supported"); + PG_RETURN_NULL(); } pfree(string_save); - return (char *) retval; + return PointerGetDatum(retval); } /*----------------------------------------------------------------------------- @@ -578,7 +579,7 @@ _CopyArrayEls(char **values, { int inc; - inc = ArrayCastAndSet(values[i], typbyval, typlen, p); + inc = ArrayCastAndSet((Datum) values[i], typbyval, typlen, p); p += inc; if (!typbyval) pfree(values[i]); @@ -592,9 +593,11 @@ _CopyArrayEls(char **values, * containing the array in its external format. *------------------------------------------------------------------------- */ -char * -array_out(ArrayType *v, Oid element_type) +Datum +array_out(PG_FUNCTION_ARGS) { + ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0); + Oid element_type = PG_GETARG_OID(1); int typlen; bool typbyval; char typdelim; @@ -602,7 +605,6 @@ array_out(ArrayType *v, Oid element_type) typelem; FmgrInfo outputproc; char typalign; - char *p, *tmp, *retval, @@ -617,30 +619,31 @@ array_out(ArrayType *v, Oid element_type) l, #endif indx[MAXDIM]; - bool dummy_bool; int ndim, *dim; if (v == (ArrayType *) NULL) - return (char *) NULL; + PG_RETURN_CSTRING((char *) NULL); if (ARR_IS_LO(v) == true) { - char *p, - *save_p; - int nbytes; + text *p; + int plen, + nbytes; + + p = (text *) DatumGetPointer(DirectFunctionCall1(array_dims, + PointerGetDatum(v))); + plen = VARSIZE(p) - VARHDRSZ; /* get a wide string to print to */ - p = array_dims(v, &dummy_bool); - nbytes = strlen(ARR_DATA_PTR(v)) + VARHDRSZ + *(int *) p; + nbytes = strlen(ARR_DATA_PTR(v)) + strlen(ASSGN) + plen + 1; + retval = (char *) palloc(nbytes); - save_p = (char *) palloc(nbytes); - - strcpy(save_p, p + sizeof(int)); - strcat(save_p, ASSGN); - strcat(save_p, ARR_DATA_PTR(v)); + memcpy(retval, VARDATA(p), plen); + strcpy(retval + plen, ASSGN); + strcat(retval, ARR_DATA_PTR(v)); pfree(p); - return save_p; + PG_RETURN_CSTRING(retval); } system_cache_lookup(element_type, false, &typlen, &typbyval, @@ -653,12 +656,11 @@ array_out(ArrayType *v, Oid element_type) if (nitems == 0) { - char *emptyArray = palloc(3); - - emptyArray[0] = '{'; - emptyArray[1] = '}'; - emptyArray[2] = '\0'; - return emptyArray; + retval = (char *) palloc(3); + retval[0] = '{'; + retval[1] = '}'; + retval[2] = '\0'; + PG_RETURN_CSTRING(retval); } p = ARR_DATA_PTR(v); @@ -776,58 +778,61 @@ array_out(ArrayType *v, Oid element_type) } while (j != -1); pfree(values); - return retval; + PG_RETURN_CSTRING(retval); } /*----------------------------------------------------------------------------- * array_dims : - * returns the dimension of the array pointed to by "v" + * returns the dimensions of the array pointed to by "v", as a "text" *---------------------------------------------------------------------------- */ -char * -array_dims(ArrayType *v, bool *isNull) +Datum +array_dims(PG_FUNCTION_ARGS) { - char *p, - *save_p; + ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0); + text *result; + char *p; int nbytes, i; int *dimv, *lb; - if (v == (ArrayType *) NULL) - RETURN_NULL; - nbytes = ARR_NDIM(v) * 33; - + nbytes = ARR_NDIM(v) * 33 + 1; /* * 33 since we assume 15 digits per number + ':' +'[]' + * + * +1 allows for temp trailing null */ - save_p = p = (char *) palloc(nbytes + VARHDRSZ); - MemSet(save_p, 0, nbytes + VARHDRSZ); + + result = (text *) palloc(nbytes + VARHDRSZ); + MemSet(result, 0, nbytes + VARHDRSZ); + p = VARDATA(result); + dimv = ARR_DIMS(v); lb = ARR_LBOUND(v); - p += VARHDRSZ; + for (i = 0; i < ARR_NDIM(v); i++) { sprintf(p, "[%d:%d]", lb[i], dimv[i] + lb[i] - 1); p += strlen(p); } - nbytes = strlen(save_p + VARHDRSZ) + VARHDRSZ; - memmove(save_p, &nbytes, VARHDRSZ); - return save_p; + VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ; + + PG_RETURN_TEXT_P(result); } /*--------------------------------------------------------------------------- * array_ref : - * This routing takes an array pointer and an index array and returns + * This routine takes an array pointer and an index array and returns * a pointer to the referred element if element is passed by * reference otherwise returns the value of the referred element. *--------------------------------------------------------------------------- */ Datum array_ref(ArrayType *array, - int n, + int nSubscripts, int *indx, - int reftype, + bool elmbyval, int elmlen, int arraylen, bool *isNull) @@ -839,10 +844,11 @@ array_ref(ArrayType *array, offset, nbytes; struct varlena *v = NULL; - char *retval = NULL; + Datum result; + char *retval; if (array == (ArrayType *) NULL) - RETURN_NULL; + RETURN_NULL(Datum); if (arraylen > 0) { @@ -852,17 +858,17 @@ array_ref(ArrayType *array, if (indx[0] * elmlen > arraylen) elog(ERROR, "array_ref: array bound exceeded"); retval = (char *) array + indx[0] * elmlen; - return _ArrayCast(retval, reftype, elmlen); + return _ArrayCast(retval, elmbyval, elmlen); } dim = ARR_DIMS(array); lb = ARR_LBOUND(array); ndim = ARR_NDIM(array); nbytes = (*(int32 *) array) - ARR_OVERHEAD(ndim); - if (!SanityCheckInput(ndim, n, dim, lb, indx)) - RETURN_NULL; + if (!SanityCheckInput(ndim, nSubscripts, dim, lb, indx)) + RETURN_NULL(Datum); - offset = GetOffset(n, dim, lb, indx); + offset = GetOffset(nSubscripts, dim, lb, indx); if (ARR_IS_LO(array)) { @@ -874,7 +880,7 @@ array_ref(ArrayType *array, lo_name = (char *) ARR_DATA_PTR(array); #ifdef LOARRAY if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_READ : O_RDONLY)) < 0) - RETURN_NULL; + RETURN_NULL(Datum); #endif if (ARR_IS_CHUNKED(array)) v = _ReadChunkArray1El(indx, elmlen, fd, array, isNull); @@ -884,7 +890,7 @@ array_ref(ArrayType *array, Int32GetDatum(fd), Int32GetDatum(offset), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(Datum); #ifdef LOARRAY v = (struct varlena *) DatumGetPointer(DirectFunctionCall2(loread, @@ -893,20 +899,20 @@ array_ref(ArrayType *array, #endif } if (*isNull) - RETURN_NULL; + RETURN_NULL(Datum); if (VARSIZE(v) - VARHDRSZ < elmlen) - RETURN_NULL; + RETURN_NULL(Datum); DirectFunctionCall1(lo_close, Int32GetDatum(fd)); - retval = (char *) _ArrayCast((char *) VARDATA(v), reftype, elmlen); - if (reftype == 0) + result = _ArrayCast((char *) VARDATA(v), elmbyval, elmlen); + if (! elmbyval) { /* not by value */ char *tempdata = palloc(elmlen); - memmove(tempdata, retval, elmlen); - retval = tempdata; + memmove(tempdata, DatumGetPointer(result), elmlen); + result = PointerGetDatum(tempdata); } pfree(v); - return (Datum) retval; + return result; } if (elmlen > 0) @@ -914,32 +920,25 @@ array_ref(ArrayType *array, offset = offset * elmlen; /* off the end of the array */ if (nbytes - offset < 1) - RETURN_NULL; + RETURN_NULL(Datum); retval = ARR_DATA_PTR(array) + offset; - return _ArrayCast(retval, reftype, elmlen); + return _ArrayCast(retval, elmbyval, elmlen); } else { - bool done = false; - char *temp; int bytes = nbytes; - temp = ARR_DATA_PTR(array); + retval = ARR_DATA_PTR(array); i = 0; - while (bytes > 0 && !done) + while (bytes > 0) { if (i == offset) - { - retval = temp; - done = true; - } - bytes -= INTALIGN(*(int32 *) temp); - temp += INTALIGN(*(int32 *) temp); + return PointerGetDatum(retval); + bytes -= INTALIGN(*(int32 *) retval); + retval += INTALIGN(*(int32 *) retval); i++; } - if (!done) - RETURN_NULL; - return (Datum) retval; + RETURN_NULL(Datum); } } @@ -950,13 +949,13 @@ array_ref(ArrayType *array, * and returns a pointer to it. *----------------------------------------------------------------------------- */ -Datum +ArrayType * array_clip(ArrayType *array, - int n, + int nSubscripts, int *upperIndx, int *lowerIndx, - int reftype, - int len, + bool elmbyval, + int elmlen, bool *isNull) { int i, @@ -970,22 +969,20 @@ array_clip(ArrayType *array, /* timer_start(); */ if (array == (ArrayType *) NULL) - RETURN_NULL; + RETURN_NULL(ArrayType *); dim = ARR_DIMS(array); lb = ARR_LBOUND(array); ndim = ARR_NDIM(array); nbytes = (*(int32 *) array) - ARR_OVERHEAD(ndim); - if (!SanityCheckInput(ndim, n, dim, lb, upperIndx)) - RETURN_NULL; + if (!SanityCheckInput(ndim, nSubscripts, dim, lb, upperIndx) || + !SanityCheckInput(ndim, nSubscripts, dim, lb, lowerIndx)) + RETURN_NULL(ArrayType *); - if (!SanityCheckInput(ndim, n, dim, lb, lowerIndx)) - RETURN_NULL; - - for (i = 0; i < n; i++) + for (i = 0; i < nSubscripts; i++) if (lowerIndx[i] > upperIndx[i]) elog(ERROR, "lowerIndex cannot be larger than upperIndx"); - mda_get_range(n, span, lowerIndx, upperIndx); + mda_get_range(nSubscripts, span, lowerIndx, upperIndx); if (ARR_IS_LO(array)) { @@ -999,23 +996,23 @@ array_clip(ArrayType *array, isDestLO = true, rsize; - if (len < 0) - elog(ERROR, "array_clip: array of variable length objects not supported"); + if (elmlen < 0) + elog(ERROR, "array_clip: array of variable length objects not implemented"); #ifdef LOARRAY lo_name = (char *) ARR_DATA_PTR(array); if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_READ : O_RDONLY)) < 0) - RETURN_NULL; + RETURN_NULL(ArrayType *); newname = _array_newLO(&newfd, Unix); #endif - bytes = strlen(newname) + 1 + ARR_OVERHEAD(n); + bytes = strlen(newname) + 1 + ARR_OVERHEAD(nSubscripts); newArr = (ArrayType *) palloc(bytes); memmove(newArr, array, sizeof(ArrayType)); memmove(newArr, &bytes, sizeof(int)); - memmove(ARR_DIMS(newArr), span, n * sizeof(int)); - memmove(ARR_LBOUND(newArr), lowerIndx, n * sizeof(int)); + memmove(ARR_DIMS(newArr), span, nSubscripts * sizeof(int)); + memmove(ARR_LBOUND(newArr), lowerIndx, nSubscripts * sizeof(int)); strcpy(ARR_DATA_PTR(newArr), newname); - rsize = compute_size(lowerIndx, upperIndx, n, len); + rsize = compute_size(lowerIndx, upperIndx, nSubscripts, elmlen); if (rsize < MAX_BUFF_SIZE) { char *buff; @@ -1026,12 +1023,12 @@ array_clip(ArrayType *array, isDestLO = false; if (ARR_IS_CHUNKED(array)) { - _ReadChunkArray(lowerIndx, upperIndx, len, fd, &(buff[VARHDRSZ]), + _ReadChunkArray(lowerIndx, upperIndx, elmlen, fd, &(buff[VARHDRSZ]), array, 0, isNull); } else { - _ReadArray(lowerIndx, upperIndx, len, fd, (int) &(buff[VARHDRSZ]), + _ReadArray(lowerIndx, upperIndx, elmlen, fd, (int) &(buff[VARHDRSZ]), array, 0, isNull); } @@ -1048,11 +1045,11 @@ array_clip(ArrayType *array, { if (ARR_IS_CHUNKED(array)) { - _ReadChunkArray(lowerIndx, upperIndx, len, fd, (char *) newfd, array, + _ReadChunkArray(lowerIndx, upperIndx, elmlen, fd, (char *) newfd, array, 1, isNull); } else - _ReadArray(lowerIndx, upperIndx, len, fd, newfd, array, 1, isNull); + _ReadArray(lowerIndx, upperIndx, elmlen, fd, newfd, array, 1, isNull); } #ifdef LOARRAY LOclose(fd); @@ -1064,42 +1061,42 @@ array_clip(ArrayType *array, newArr = NULL; } /* timer_end(); */ - return (Datum) newArr; + return newArr; } - if (len > 0) + if (elmlen > 0) { - bytes = getNitems(n, span); - bytes = bytes * len + ARR_OVERHEAD(n); + bytes = getNitems(nSubscripts, span); + bytes = bytes * elmlen + ARR_OVERHEAD(nSubscripts); } else { bytes = _ArrayClipCount(lowerIndx, upperIndx, array); - bytes += ARR_OVERHEAD(n); + bytes += ARR_OVERHEAD(nSubscripts); } newArr = (ArrayType *) palloc(bytes); memmove(newArr, array, sizeof(ArrayType)); memmove(newArr, &bytes, sizeof(int)); - memmove(ARR_DIMS(newArr), span, n * sizeof(int)); - memmove(ARR_LBOUND(newArr), lowerIndx, n * sizeof(int)); - _ArrayRange(lowerIndx, upperIndx, len, ARR_DATA_PTR(newArr), array, 1); - return (Datum) newArr; + memmove(ARR_DIMS(newArr), span, nSubscripts * sizeof(int)); + memmove(ARR_LBOUND(newArr), lowerIndx, nSubscripts * sizeof(int)); + _ArrayRange(lowerIndx, upperIndx, elmlen, ARR_DATA_PTR(newArr), array, 1); + return newArr; } /*----------------------------------------------------------------------------- * array_set : - * This routine sets the value of an array location (specified by an index array) - * to a new value specified by "dataPtr". + * This routine sets the value of an array location (specified by + * an index array) to a new value specified by "dataValue". * result : * returns a pointer to the modified array. *----------------------------------------------------------------------------- */ -char * +ArrayType * array_set(ArrayType *array, - int n, + int nSubscripts, int *indx, - char *dataPtr, - int reftype, + Datum dataValue, + bool elmbyval, int elmlen, int arraylen, bool *isNull) @@ -1112,7 +1109,7 @@ array_set(ArrayType *array, char *pos; if (array == (ArrayType *) NULL) - RETURN_NULL; + RETURN_NULL(ArrayType *); if (arraylen > 0) { @@ -1122,20 +1119,20 @@ array_set(ArrayType *array, if (indx[0] * elmlen > arraylen) elog(ERROR, "array_ref: array bound exceeded"); pos = (char *) array + indx[0] * elmlen; - ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, pos); - return (char *) array; + ArrayCastAndSet(dataValue, elmbyval, elmlen, pos); + return array; } dim = ARR_DIMS(array); lb = ARR_LBOUND(array); ndim = ARR_NDIM(array); nbytes = (*(int32 *) array) - ARR_OVERHEAD(ndim); - if (!SanityCheckInput(ndim, n, dim, lb, indx)) + if (!SanityCheckInput(ndim, nSubscripts, dim, lb, indx)) { elog(ERROR, "array_set: array bound exceeded"); - return (char *) array; + return array; } - offset = GetOffset(n, dim, lb, indx); + offset = GetOffset(nSubscripts, dim, lb, indx); if (ARR_IS_LO(array)) { @@ -1149,35 +1146,33 @@ array_set(ArrayType *array, lo_name = ARR_DATA_PTR(array); if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_WRITE : O_WRONLY)) < 0) - return (char *) array; + return array; #endif if (DatumGetInt32(DirectFunctionCall3(lo_lseek, Int32GetDatum(fd), Int32GetDatum(offset), Int32GetDatum(SEEK_SET))) < 0) - return (char *) array; + return array; v = (struct varlena *) palloc(elmlen + VARHDRSZ); VARSIZE(v) = elmlen + VARHDRSZ; - ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, VARDATA(v)); + ArrayCastAndSet(dataValue, elmbyval, elmlen, VARDATA(v)); #ifdef LOARRAY - n = DatumGetInt32(DirectFunctionCall2(lowrite, + if (DatumGetInt32(DirectFunctionCall2(lowrite, Int32GetDatum(fd), - PointerGetDatum(v))); + PointerGetDatum(v))) + != elmlen) + RETURN_NULL(ArrayType *); #endif - - /* - * if (n < VARSIZE(v) - VARHDRSZ) RETURN_NULL; - */ pfree(v); DirectFunctionCall1(lo_close, Int32GetDatum(fd)); - return (char *) array; + return array; } if (elmlen > 0) { offset = offset * elmlen; /* off the end of the array */ if (nbytes - offset < 1) - return (char *) array; + return array; pos = ARR_DATA_PTR(array) + offset; } else @@ -1194,18 +1189,18 @@ array_set(ArrayType *array, elt_ptr = array_seek(ARR_DATA_PTR(array), -1, offset); oldlen = INTALIGN(*(int32 *) elt_ptr); - newlen = INTALIGN(*(int32 *) dataPtr); + newlen = INTALIGN(*(int32 *) DatumGetPointer(dataValue)); if (oldlen == newlen) { /* new element with same size, overwrite old data */ - ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, elt_ptr); - return (char *) array; + ArrayCastAndSet(dataValue, elmbyval, elmlen, elt_ptr); + return array; } /* new element with different size, reallocate the array */ oldsize = array->size; - lth0 = ARR_OVERHEAD(n); + lth0 = ARR_OVERHEAD(nSubscripts); lth1 = (int) (elt_ptr - ARR_DATA_PTR(array)); lth2 = (int) (oldsize - lth0 - lth1 - oldlen); newsize = lth0 + lth1 + newlen + lth2; @@ -1213,16 +1208,16 @@ array_set(ArrayType *array, newarray = (ArrayType *) palloc(newsize); memmove((char *) newarray, (char *) array, lth0 + lth1); newarray->size = newsize; - newlen = ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, + newlen = ArrayCastAndSet(dataValue, elmbyval, elmlen, (char *) newarray + lth0 + lth1); memmove((char *) newarray + lth0 + lth1 + newlen, (char *) array + lth0 + lth1 + oldlen, lth2); /* ??? who should free this storage ??? */ - return (char *) newarray; + return newarray; } - ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, pos); - return (char *) array; + ArrayCastAndSet(dataValue, elmbyval, elmlen, pos); + return array; } /*---------------------------------------------------------------------------- @@ -1234,14 +1229,14 @@ array_set(ArrayType *array, * returns a pointer to the modified array. *---------------------------------------------------------------------------- */ -char * +ArrayType * array_assgn(ArrayType *array, - int n, + int nSubscripts, int *upperIndx, int *lowerIndx, ArrayType *newArr, - int reftype, - int len, + bool elmbyval, + int elmlen, bool *isNull) { int i, @@ -1250,19 +1245,19 @@ array_assgn(ArrayType *array, *lb; if (array == (ArrayType *) NULL) - RETURN_NULL; - if (len < 0) - elog(ERROR, "array_assgn:updates on arrays of variable length elements not allowed"); + RETURN_NULL(ArrayType *); + if (elmlen < 0) + elog(ERROR, "array_assgn: updates on arrays of variable length elements not implemented"); dim = ARR_DIMS(array); lb = ARR_LBOUND(array); ndim = ARR_NDIM(array); - if (!SanityCheckInput(ndim, n, dim, lb, upperIndx) || - !SanityCheckInput(ndim, n, dim, lb, lowerIndx)) - return (char *) array; + if (!SanityCheckInput(ndim, nSubscripts, dim, lb, upperIndx) || + !SanityCheckInput(ndim, nSubscripts, dim, lb, lowerIndx)) + RETURN_NULL(ArrayType *); - for (i = 0; i < n; i++) + for (i = 0; i < nSubscripts; i++) if (lowerIndx[i] > upperIndx[i]) elog(ERROR, "lowerIndex larger than upperIndx"); @@ -1276,28 +1271,28 @@ array_assgn(ArrayType *array, lo_name = (char *) ARR_DATA_PTR(array); if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_WRITE : O_WRONLY)) < 0) - return (char *) array; + return array; #endif if (ARR_IS_LO(newArr)) { #ifdef LOARRAY lo_name = (char *) ARR_DATA_PTR(newArr); if ((newfd = LOopen(lo_name, ARR_IS_INV(newArr) ? INV_READ : O_RDONLY)) < 0) - return (char *) array; + return array; #endif - _LOArrayRange(lowerIndx, upperIndx, len, fd, newfd, array, 1, isNull); + _LOArrayRange(lowerIndx, upperIndx, elmlen, fd, newfd, array, 1, isNull); DirectFunctionCall1(lo_close, Int32GetDatum(newfd)); } else { - _LOArrayRange(lowerIndx, upperIndx, len, fd, (int) ARR_DATA_PTR(newArr), + _LOArrayRange(lowerIndx, upperIndx, elmlen, fd, (int) ARR_DATA_PTR(newArr), array, 0, isNull); } DirectFunctionCall1(lo_close, Int32GetDatum(fd)); - return (char *) array; + return array; } - _ArrayRange(lowerIndx, upperIndx, len, ARR_DATA_PTR(newArr), array, 0); - return (char *) array; + _ArrayRange(lowerIndx, upperIndx, elmlen, ARR_DATA_PTR(newArr), array, 0); + return array; } /* @@ -1353,7 +1348,7 @@ array_map(FunctionCallInfo fcinfo, Oid inpType, Oid retType) elog(ERROR, "array_map: invalid nargs: %d", fcinfo->nargs); if (PG_ARGISNULL(0)) elog(ERROR, "array_map: null input array"); - v = (ArrayType *) PG_GETARG_POINTER(0); + v = (ArrayType *) PG_GETARG_VARLENA_P(0); /* Large objects not yet supported */ if (ARR_IS_LO(v) == true) @@ -1466,19 +1461,20 @@ array_map(FunctionCallInfo fcinfo, Oid inpType, Oid retType) * array_eq : * compares two arrays for equality * result : - * returns 1 if the arrays are equal, 0 otherwise. + * returns true if the arrays are equal, false otherwise. *----------------------------------------------------------------------------- */ -int -array_eq(ArrayType *array1, ArrayType *array2) +Datum +array_eq(PG_FUNCTION_ARGS) { - if ((array1 == NULL) || (array2 == NULL)) - return 0; - if (*(int *) array1 != *(int *) array2) - return 0; - if (memcmp(array1, array2, *(int *) array1)) - return 0; - return 1; + ArrayType *array1 = (ArrayType *) PG_GETARG_VARLENA_P(0); + ArrayType *array2 = (ArrayType *) PG_GETARG_VARLENA_P(1); + + if (*(int32 *) array1 != *(int32 *) array2) + PG_RETURN_BOOL(false); + if (memcmp(array1, array2, *(int32 *) array1) != 0) + PG_RETURN_BOOL(false); + PG_RETURN_BOOL(true); } /***************************************************************************/ @@ -1545,7 +1541,7 @@ _ArrayCast(char *value, bool byval, int len) static int -ArrayCastAndSet(char *src, +ArrayCastAndSet(Datum src, bool typbyval, int typlen, char *dest) @@ -1565,18 +1561,18 @@ ArrayCastAndSet(char *src, *(int16 *) dest = DatumGetInt16(src); break; case 4: - *(int32 *) dest = (int32) src; + *(int32 *) dest = DatumGetInt32(src); break; } } else - memmove(dest, src, typlen); + memmove(dest, DatumGetPointer(src), typlen); inc = typlen; } else { - memmove(dest, src, *(int32 *) src); - inc = (INTALIGN(*(int32 *) src)); + memmove(dest, DatumGetPointer(src), *(int32 *) DatumGetPointer(src)); + inc = (INTALIGN(*(int32 *) DatumGetPointer(src))); } return inc; } diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c index 9bfc46bda6..861d5931d4 100644 --- a/src/backend/utils/adt/cash.c +++ b/src/backend/utils/adt/cash.c @@ -9,7 +9,7 @@ * workings can be found in the book "Software Solutions in C" by * Dale Schumacher, Academic Press, ISBN: 0-12-632360-7. * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.37 2000/06/05 07:28:51 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.38 2000/06/13 07:35:03 tgl Exp $ */ #include @@ -535,31 +535,31 @@ cash_div_flt4(Cash *c, float4 *f) /* cash_mul_int4() * Multiply cash by int4. */ -Cash * -cash_mul_int4(Cash *c, int4 i) +Datum +cash_mul_int4(PG_FUNCTION_ARGS) { - Cash *result; + Cash c = PG_GETARG_CASH(0); + int32 i = PG_GETARG_INT32(1); + Cash result; - if (!PointerIsValid(c)) - return NULL; - - if (!PointerIsValid(result = palloc(sizeof(Cash)))) - elog(ERROR, "Memory allocation failed, can't multiply cash"); - - *result = ((i) * (*c)); - - return result; -} /* cash_mul_int4() */ + result = c * i; + PG_RETURN_CASH(result); +} /* int4_mul_cash() * Multiply int4 by cash. */ -Cash * -int4_mul_cash(int4 i, Cash *c) +Datum +int4_mul_cash(PG_FUNCTION_ARGS) { - return cash_mul_int4(c, i); -} /* int4_mul_cash() */ + int32 i = PG_GETARG_INT32(0); + Cash c = PG_GETARG_CASH(1); + Cash result; + + result = i * c; + PG_RETURN_CASH(result); +} /* cash_div_int4() @@ -568,24 +568,20 @@ int4_mul_cash(int4 i, Cash *c) * XXX Don't know if rounding or truncating is correct behavior. * Round for now. - tgl 97/04/15 */ -Cash * -cash_div_int4(Cash *c, int4 i) +Datum +cash_div_int4(PG_FUNCTION_ARGS) { - Cash *result; - - if (!PointerIsValid(c)) - return NULL; - - if (!PointerIsValid(result = palloc(sizeof(Cash)))) - elog(ERROR, "Memory allocation failed, can't divide cash"); + Cash c = PG_GETARG_CASH(0); + int32 i = PG_GETARG_INT32(1); + Cash result; if (i == 0) - elog(ERROR, "cash_idiv: divide by 0 error"); + elog(ERROR, "cash_div_int4: divide by 0 error"); - *result = rint(*c / i); + result = rint(c / i); - return result; -} /* cash_div_int4() */ + PG_RETURN_CASH(result); +} /* cash_mul_int2() diff --git a/src/backend/utils/adt/chunk.c b/src/backend/utils/adt/chunk.c index 34c8c46221..1d8ec1aec8 100644 --- a/src/backend/utils/adt/chunk.c +++ b/src/backend/utils/adt/chunk.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/chunk.c,v 1.26 2000/06/09 01:11:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/chunk.c,v 1.27 2000/06/13 07:35:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -517,7 +517,7 @@ _ReadChunkArray(int *st, Int32GetDatum(fp), Int32GetDatum(srcOff), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(int); jj = n - 1; for (i = 0; i < n; chunk_off[i++] = 0) @@ -541,7 +541,7 @@ _ReadChunkArray(int *st, Int32GetDatum((int32) destfp), Int32GetDatum(bptr), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(int); } else destfp = baseDestFp + bptr; @@ -556,7 +556,7 @@ _ReadChunkArray(int *st, Int32GetDatum(fp), Int32GetDatum(srcOff), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(int); } for (i = n - 1, to_read = bsize; i >= 0; to_read *= min(C[i], array_span[i]), i--) @@ -571,7 +571,7 @@ _ReadChunkArray(int *st, Int32GetDatum(fp), Int32GetDatum(srcOff), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(int); } block_seek += cdist[j]; bptr += adist[j] * bsize; @@ -581,13 +581,13 @@ _ReadChunkArray(int *st, Int32GetDatum((int32) destfp), Int32GetDatum(bptr), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(int); } else destfp = baseDestFp + bptr; temp = _LOtransfer((char **) &destfp, to_read, 1, (char **) &fp, 1, isDestLO); if (temp < to_read) - RETURN_NULL; + RETURN_NULL(int); srcOff += to_read; words_read += to_read; bptr += to_read; @@ -702,7 +702,7 @@ _ReadChunkArray1El(int *st, Int32GetDatum(fp), Int32GetDatum(srcOff), Int32GetDatum(SEEK_SET))) < 0) - RETURN_NULL; + RETURN_NULL(struct varlena *); #ifdef LOARRAY return (struct varlena *) DatumGetPointer(DirectFunctionCall2(loread, diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 93800b067d..428fb5bf2c 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.59 2000/06/08 22:37:28 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.60 2000/06/13 07:35:04 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -48,12 +48,11 @@ */ #include #include - #include /* faked on sunos4 */ - #include #include "postgres.h" + #ifdef HAVE_LIMITS_H #include #ifndef MAXINT @@ -64,6 +63,7 @@ #include #endif #endif + #include "fmgr.h" #include "utils/builtins.h" @@ -844,15 +844,14 @@ dtoi2(PG_FUNCTION_ARGS) /* * i4tod - converts an int4 number to a float8 number */ -float64 -i4tod(int32 num) +Datum +i4tod(PG_FUNCTION_ARGS) { - float64 result; + int32 num = PG_GETARG_INT32(0); + float8 result; - result = (float64) palloc(sizeof(float64data)); - - *result = num; - return result; + result = num; + PG_RETURN_FLOAT8(result); } @@ -909,15 +908,14 @@ ftoi2(PG_FUNCTION_ARGS) /* * i4tof - converts an int4 number to a float8 number */ -float32 -i4tof(int32 num) +Datum +i4tof(PG_FUNCTION_ARGS) { - float32 result; + int32 num = PG_GETARG_INT32(0); + float4 result; - result = (float32) palloc(sizeof(float32data)); - - *result = num; - return result; + result = num; + PG_RETURN_FLOAT4(result); } diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 19cbd8ef20..6f6e3a54c8 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * formatting.c * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.11 2000/06/09 03:18:34 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.12 2000/06/13 07:35:04 tgl Exp $ * * * Portions Copyright (c) 1999-2000, PostgreSQL, Inc @@ -3848,13 +3848,11 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, * ---------- */ #define NUM_TOCHAR_prepare { \ - if (!PointerIsValid(fmt)) \ - return NULL; \ \ len = VARSIZE(fmt) - VARHDRSZ; \ \ - if (!len) \ - return textin(""); \ + if (len <= 0) \ + return PointerGetDatum(textin("")); \ \ result = (text *) palloc( (len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \ format = NUM_cache(len, &Num, VARDATA(fmt), &flag); \ @@ -3891,26 +3889,24 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, * NUMERIC to_number() (convert string to numeric) * ------------------- */ -Numeric -numeric_to_number(text *value, text *fmt) +Datum +numeric_to_number(PG_FUNCTION_ARGS) { + text *value = PG_GETARG_TEXT_P(0); + text *fmt = PG_GETARG_TEXT_P(1); NUMDesc Num; - Numeric result; + Datum result; FormatNode *format; char *numstr; int flag = 0; int len = 0; - int scale, precision; - if ((!PointerIsValid(value)) || (!PointerIsValid(fmt))) - return NULL; - len = VARSIZE(fmt) - VARHDRSZ; - if (!len) - return numeric_in(NULL, 0, 0); + if (len <= 0) + PG_RETURN_NULL(); format = NUM_cache(len, &Num, VARDATA(fmt), &flag); @@ -3925,7 +3921,10 @@ numeric_to_number(text *value, text *fmt) if (flag) pfree(format); - result = numeric_in(numstr, 0, ((precision << 16) | scale) + VARHDRSZ); + result = DirectFunctionCall3(numeric_in, + CStringGetDatum(numstr), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(((precision << 16) | scale) + VARHDRSZ)); pfree(numstr); return result; } @@ -3934,9 +3933,11 @@ numeric_to_number(text *value, text *fmt) * NUMERIC to_char() * ------------------ */ -text * -numeric_to_char(Numeric value, text *fmt) +Datum +numeric_to_char(PG_FUNCTION_ARGS) { + Numeric value = PG_GETARG_NUMERIC(0); + text *fmt = PG_GETARG_TEXT_P(1); NUMDesc Num; FormatNode *format; text *result, @@ -3948,7 +3949,7 @@ numeric_to_char(Numeric value, text *fmt) char *numstr, *orgnum, *p; - Numeric x = NULL; + Numeric x; NUM_TOCHAR_prepare; @@ -3958,10 +3959,11 @@ numeric_to_char(Numeric value, text *fmt) */ if (IS_ROMAN(&Num)) { - x = numeric_round(value, 0); + x = DatumGetNumeric(DirectFunctionCall2(numeric_round, + NumericGetDatum(value), + Int32GetDatum(0))); numstr = orgnum = int_to_roman(numeric_int4(x)); pfree(x); - } else { @@ -3969,8 +3971,10 @@ numeric_to_char(Numeric value, text *fmt) if (IS_MULTI(&Num)) { - Numeric a = int4_numeric(10); - Numeric b = int4_numeric(Num.multi); + Numeric a = DatumGetNumeric(DirectFunctionCall1(int4_numeric, + Int32GetDatum(10))); + Numeric b = DatumGetNumeric(DirectFunctionCall1(int4_numeric, + Int32GetDatum(Num.multi))); x = numeric_power(a, b); val = numeric_mul(value, x); @@ -3980,8 +3984,11 @@ numeric_to_char(Numeric value, text *fmt) Num.pre += Num.multi; } - x = numeric_round(val, Num.post); - orgnum = numeric_out(x); + x = DatumGetNumeric(DirectFunctionCall2(numeric_round, + NumericGetDatum(val), + Int32GetDatum(Num.post))); + orgnum = DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(x))); pfree(x); if (*orgnum == '-') @@ -4014,16 +4021,18 @@ numeric_to_char(Numeric value, text *fmt) } NUM_TOCHAR_finish; - return result; + PG_RETURN_TEXT_P(result); } /* --------------- * INT4 to_char() * --------------- */ -text * -int4_to_char(int32 value, text *fmt) +Datum +int4_to_char(PG_FUNCTION_ARGS) { + int32 value = PG_GETARG_INT32(0); + text *fmt = PG_GETARG_TEXT_P(1); NUMDesc Num; FormatNode *format; text *result, @@ -4044,7 +4053,6 @@ int4_to_char(int32 value, text *fmt) if (IS_ROMAN(&Num)) { numstr = orgnum = int_to_roman(value); - } else { @@ -4097,16 +4105,18 @@ int4_to_char(int32 value, text *fmt) } NUM_TOCHAR_finish; - return result; + PG_RETURN_TEXT_P(result); } /* --------------- * INT8 to_char() * --------------- */ -text * -int8_to_char(int64 *value, text *fmt) +Datum +int8_to_char(PG_FUNCTION_ARGS) { + int64 value = PG_GETARG_INT64(0); + text *fmt = PG_GETARG_TEXT_P(1); NUMDesc Num; FormatNode *format; text *result, @@ -4126,8 +4136,9 @@ int8_to_char(int64 *value, text *fmt) */ if (IS_ROMAN(&Num)) { - numstr = orgnum = int_to_roman(int84(value)); - + /* Currently don't support int8 conversion to roman... */ + numstr = orgnum = int_to_roman(DatumGetInt32( + DirectFunctionCall1(int84, Int64GetDatum(value)))); } else { @@ -4135,11 +4146,15 @@ int8_to_char(int64 *value, text *fmt) { double multi = pow((double) 10, (double) Num.multi); - orgnum = int8out(int8mul(value, dtoi8((float64) &multi))); + value = DatumGetInt64(DirectFunctionCall2(int8mul, + Int64GetDatum(value), + DirectFunctionCall1(dtoi8, + Float8GetDatum(multi)))); Num.pre += Num.multi; } - else - orgnum = int8out(value); + + orgnum = DatumGetCString(DirectFunctionCall1(int8out, + Int64GetDatum(value))); len = strlen(orgnum); if (*orgnum == '-') @@ -4178,16 +4193,18 @@ int8_to_char(int64 *value, text *fmt) } NUM_TOCHAR_finish; - return result; + PG_RETURN_TEXT_P(result); } /* ----------------- * FLOAT4 to_char() * ----------------- */ -text * -float4_to_char(float32 value, text *fmt) +Datum +float4_to_char(PG_FUNCTION_ARGS) { + float4 value = PG_GETARG_FLOAT4(0); + text *fmt = PG_GETARG_TEXT_P(1); NUMDesc Num; FormatNode *format; text *result, @@ -4204,30 +4221,30 @@ float4_to_char(float32 value, text *fmt) if (IS_ROMAN(&Num)) { - numstr = orgnum = int_to_roman((int) rint(*value)); + numstr = orgnum = int_to_roman((int) rint(value)); } else { - float32 val = value; + float4 val = value; if (IS_MULTI(&Num)) { float multi = pow((double) 10, (double) Num.multi); - val = float4mul(value, (float32) &multi); + val = value * multi; Num.pre += Num.multi; } orgnum = (char *) palloc(MAXFLOATWIDTH + 1); - len = sprintf(orgnum, "%.0f", fabs(*val)); + len = sprintf(orgnum, "%.0f", fabs(val)); if (Num.pre > len) plen = Num.pre - len; if (len >= FLT_DIG) Num.post = 0; else if (Num.post + len > FLT_DIG) Num.post = FLT_DIG - len; - sprintf(orgnum, "%.*f", Num.post, *val); + sprintf(orgnum, "%.*f", Num.post, val); if (*orgnum == '-') { /* < 0 */ @@ -4256,16 +4273,18 @@ float4_to_char(float32 value, text *fmt) } NUM_TOCHAR_finish; - return result; + PG_RETURN_TEXT_P(result); } /* ----------------- * FLOAT8 to_char() * ----------------- */ -text * -float8_to_char(float64 value, text *fmt) +Datum +float8_to_char(PG_FUNCTION_ARGS) { + float8 value = PG_GETARG_FLOAT8(0); + text *fmt = PG_GETARG_TEXT_P(1); NUMDesc Num; FormatNode *format; text *result, @@ -4282,29 +4301,29 @@ float8_to_char(float64 value, text *fmt) if (IS_ROMAN(&Num)) { - numstr = orgnum = int_to_roman((int) rint(*value)); + numstr = orgnum = int_to_roman((int) rint(value)); } else { - float64 val = value; + float8 val = value; if (IS_MULTI(&Num)) { double multi = pow((double) 10, (double) Num.multi); - val = float8mul(value, (float64) &multi); + val = value * multi; Num.pre += Num.multi; } orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1); - len = sprintf(orgnum, "%.0f", fabs(*val)); + len = sprintf(orgnum, "%.0f", fabs(val)); if (Num.pre > len) plen = Num.pre - len; if (len >= DBL_DIG) Num.post = 0; else if (Num.post + len > DBL_DIG) Num.post = DBL_DIG - len; - sprintf(orgnum, "%.*f", Num.post, *val); + sprintf(orgnum, "%.*f", Num.post, val); if (*orgnum == '-') { /* < 0 */ @@ -4333,5 +4352,5 @@ float8_to_char(float64 value, text *fmt) } NUM_TOCHAR_finish; - return result; + PG_RETURN_TEXT_P(result); } diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index 0e8bb4405b..dc6e077d6b 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.50 2000/04/12 17:15:50 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.51 2000/06/13 07:35:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -4361,22 +4361,21 @@ box_circle(BOX *box) } /* box_circle() */ -POLYGON * -circle_poly(int npts, CIRCLE *circle) +Datum +circle_poly(PG_FUNCTION_ARGS) { + int32 npts = PG_GETARG_INT32(0); + CIRCLE *circle = PG_GETARG_CIRCLE_P(1); POLYGON *poly; int size; int i; double angle; - if (!PointerIsValid(circle)) - return NULL; - if (FPzero(circle->radius) || (npts < 2)) elog(ERROR, "Unable to convert circle to polygon"); size = offsetof(POLYGON, p[0]) +(sizeof(poly->p[0]) * npts); - poly = palloc(size); + poly = (POLYGON *) palloc(size); MemSet((char *) poly, 0, size); /* zero any holes */ poly->size = size; @@ -4391,7 +4390,7 @@ circle_poly(int npts, CIRCLE *circle) make_bound_box(poly); - return poly; + PG_RETURN_POLYGON_P(poly); } /* poly_circle - convert polygon to circle diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index a30a920b6a..774e9aba89 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.19 2000/05/28 17:56:05 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.20 2000/06/13 07:35:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -57,17 +57,15 @@ /* int8in() */ -int64 * -int8in(char *str) +Datum +int8in(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + char *str = PG_GETARG_CSTRING(0); + int64 result; char *ptr = str; int64 tmp = 0; int sign = 1; - if (!PointerIsValid(str)) - elog(ERROR, "Bad (null) int8 external representation"); - /* * Do our own scan, rather than relying on sscanf which might be * broken for long long. @@ -91,34 +89,28 @@ int8in(char *str) if (*ptr) /* trailing junk? */ elog(ERROR, "Bad int8 external representation \"%s\"", str); - *result = (sign < 0) ? -tmp : tmp; + result = (sign < 0) ? -tmp : tmp; - return result; -} /* int8in() */ + PG_RETURN_INT64(result); +} /* int8out() */ -char * -int8out(int64 *val) +Datum +int8out(PG_FUNCTION_ARGS) { + int64 val = PG_GETARG_INT64(0); char *result; - int len; char buf[MAXINT8LEN + 1]; - if (!PointerIsValid(val)) - return NULL; - - if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, *val)) < 0) + if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, val)) < 0) elog(ERROR, "Unable to format int8"); - result = palloc(len + 1); - - strcpy(result, buf); - - return result; -} /* int8out() */ + result = pstrdup(buf); + PG_RETURN_CSTRING(result); +} /*---------------------------------------------------------- @@ -128,511 +120,403 @@ int8out(int64 *val) /* int8relop() * Is val1 relop val2? */ -bool -int8eq(int64 *val1, int64 *val2) +Datum +int8eq(PG_FUNCTION_ARGS) { - if (!val1 || !val2) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - return *val1 == *val2; -} /* int8eq() */ + PG_RETURN_BOOL(val1 == val2); +} -bool -int8ne(int64 *val1, int64 *val2) +Datum +int8ne(PG_FUNCTION_ARGS) { - if (!val1 || !val2) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - return *val1 != *val2; -} /* int8ne() */ + PG_RETURN_BOOL(val1 != val2); +} -bool -int8lt(int64 *val1, int64 *val2) +Datum +int8lt(PG_FUNCTION_ARGS) { - if (!val1 || !val2) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - return *val1 < *val2; -} /* int8lt() */ + PG_RETURN_BOOL(val1 < val2); +} -bool -int8gt(int64 *val1, int64 *val2) +Datum +int8gt(PG_FUNCTION_ARGS) { - if (!val1 || !val2) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - return *val1 > *val2; -} /* int8gt() */ + PG_RETURN_BOOL(val1 > val2); +} -bool -int8le(int64 *val1, int64 *val2) +Datum +int8le(PG_FUNCTION_ARGS) { - if (!val1 || !val2) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - return *val1 <= *val2; -} /* int8le() */ + PG_RETURN_BOOL(val1 <= val2); +} -bool -int8ge(int64 *val1, int64 *val2) +Datum +int8ge(PG_FUNCTION_ARGS) { - if (!val1 || !val2) - return 0; - - return *val1 >= *val2; -} /* int8ge() */ + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); + PG_RETURN_BOOL(val1 >= val2); +} /* int84relop() * Is 64-bit val1 relop 32-bit val2? */ -bool -int84eq(int64 *val1, int32 val2) +Datum +int84eq(PG_FUNCTION_ARGS) { - if (!val1) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - return *val1 == val2; -} /* int84eq() */ + PG_RETURN_BOOL(val1 == val2); +} -bool -int84ne(int64 *val1, int32 val2) +Datum +int84ne(PG_FUNCTION_ARGS) { - if (!val1) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - return *val1 != val2; -} /* int84ne() */ + PG_RETURN_BOOL(val1 != val2); +} -bool -int84lt(int64 *val1, int32 val2) +Datum +int84lt(PG_FUNCTION_ARGS) { - if (!val1) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - return *val1 < val2; -} /* int84lt() */ + PG_RETURN_BOOL(val1 < val2); +} -bool -int84gt(int64 *val1, int32 val2) +Datum +int84gt(PG_FUNCTION_ARGS) { - if (!val1) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - return *val1 > val2; -} /* int84gt() */ + PG_RETURN_BOOL(val1 > val2); +} -bool -int84le(int64 *val1, int32 val2) +Datum +int84le(PG_FUNCTION_ARGS) { - if (!val1) - return 0; + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - return *val1 <= val2; -} /* int84le() */ + PG_RETURN_BOOL(val1 <= val2); +} -bool -int84ge(int64 *val1, int32 val2) +Datum +int84ge(PG_FUNCTION_ARGS) { - if (!val1) - return 0; - - return *val1 >= val2; -} /* int84ge() */ + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); + PG_RETURN_BOOL(val1 >= val2); +} /* int48relop() * Is 32-bit val1 relop 64-bit val2? */ -bool -int48eq(int32 val1, int64 *val2) +Datum +int48eq(PG_FUNCTION_ARGS) { - if (!val2) - return 0; + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - return val1 == *val2; -} /* int48eq() */ + PG_RETURN_BOOL(val1 == val2); +} -bool -int48ne(int32 val1, int64 *val2) +Datum +int48ne(PG_FUNCTION_ARGS) { - if (!val2) - return 0; + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - return val1 != *val2; -} /* int48ne() */ + PG_RETURN_BOOL(val1 != val2); +} -bool -int48lt(int32 val1, int64 *val2) +Datum +int48lt(PG_FUNCTION_ARGS) { - if (!val2) - return 0; + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - return val1 < *val2; -} /* int48lt() */ + PG_RETURN_BOOL(val1 < val2); +} -bool -int48gt(int32 val1, int64 *val2) +Datum +int48gt(PG_FUNCTION_ARGS) { - if (!val2) - return 0; + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - return val1 > *val2; -} /* int48gt() */ + PG_RETURN_BOOL(val1 > val2); +} -bool -int48le(int32 val1, int64 *val2) +Datum +int48le(PG_FUNCTION_ARGS) { - if (!val2) - return 0; + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - return val1 <= *val2; -} /* int48le() */ + PG_RETURN_BOOL(val1 <= val2); +} -bool -int48ge(int32 val1, int64 *val2) +Datum +int48ge(PG_FUNCTION_ARGS) { - if (!val2) - return 0; + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - return val1 >= *val2; -} /* int48ge() */ + PG_RETURN_BOOL(val1 >= val2); +} /*---------------------------------------------------------- * Arithmetic operators on 64-bit integers. *---------------------------------------------------------*/ -int64 * -int8um(int64 *val) +Datum +int8um(PG_FUNCTION_ARGS) { - int64 temp = 0; - int64 *result = palloc(sizeof(int64)); + int64 val = PG_GETARG_INT64(0); - if (!PointerIsValid(val)) - return NULL; + PG_RETURN_INT64(- val); +} - result = int8mi(&temp, val); - - return result; -} /* int8um() */ - - -int64 * -int8pl(int64 *val1, int64 *val2) +Datum +int8pl(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - if ((!PointerIsValid(val1)) || (!PointerIsValid(val2))) - return NULL; + PG_RETURN_INT64(val1 + val2); +} - *result = *val1 + *val2; - - return result; -} /* int8pl() */ - -int64 * -int8mi(int64 *val1, int64 *val2) +Datum +int8mi(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - if ((!PointerIsValid(val1)) || (!PointerIsValid(val2))) - return NULL; + PG_RETURN_INT64(val1 - val2); +} - *result = *val1 - *val2; - - return result; -} /* int8mi() */ - -int64 * -int8mul(int64 *val1, int64 *val2) +Datum +int8mul(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - if ((!PointerIsValid(val1)) || (!PointerIsValid(val2))) - return NULL; + PG_RETURN_INT64(val1 * val2); +} - *result = *val1 * *val2; - - return result; -} /* int8mul() */ - -int64 * -int8div(int64 *val1, int64 *val2) +Datum +int8div(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); - if ((!PointerIsValid(val1)) || (!PointerIsValid(val2))) - return NULL; - - *result = *val1 / *val2; - - return result; -} /* int8div() */ + PG_RETURN_INT64(val1 / val2); +} /* int8abs() * Absolute value */ -int64 * -int8abs(int64 *arg1) +Datum +int8abs(PG_FUNCTION_ARGS) { - int64 *result; + int64 arg1 = PG_GETARG_INT64(0); - if (!PointerIsValid(arg1)) - return NULL; - - result = palloc(sizeof(*result)); - - *result = ((*arg1 < 0) ? -*arg1 : *arg1); - - return result; + PG_RETURN_INT64((arg1 < 0) ? -arg1 : arg1); } /* int8mod() * Modulo operation. */ -int64 * -int8mod(int64 *val1, int64 *val2) +Datum +int8mod(PG_FUNCTION_ARGS) { - int64 *result; + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); + int64 result; - /* use the divide operation to check params and allocate storage */ - result = int8div(val1, val2); - *result *= *val2; - *result = *val1 - *result; + result = val1 / val2; + result *= val2; + result = val1 - result; - return result; -} /* int8mod() */ + PG_RETURN_INT64(result); +} /* int8fac() * Factorial */ -int64 * -int8fac(int64 *arg1) +Datum +int8fac(PG_FUNCTION_ARGS) { - int64 *result; + int64 arg1 = PG_GETARG_INT64(0); + int64 result; int64 i; - if (!PointerIsValid(arg1)) - return NULL; - - result = palloc(sizeof(*result)); - - if (*arg1 < 1) - *result = 0; + if (arg1 < 1) + result = 0; else - for (i = *arg1, *result = 1; i > 0; --i) - *result *= i; + for (i = arg1, result = 1; i > 0; --i) + result *= i; - return result; + PG_RETURN_INT64(result); } -int64 * -int8larger(int64 *val1, int64 *val2) +Datum +int8larger(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); + int64 result; - if ((!PointerIsValid(val1)) || (!PointerIsValid(val2))) - return NULL; + result = ((val1 > val2) ? val1 : val2); - *result = ((*val1 > *val2) ? *val1 : *val2); + PG_RETURN_INT64(result); +} - return result; -} /* int8larger() */ - -int64 * -int8smaller(int64 *val1, int64 *val2) +Datum +int8smaller(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int64 val2 = PG_GETARG_INT64(1); + int64 result; - if ((!PointerIsValid(val1)) || (!PointerIsValid(val2))) - return NULL; + result = ((val1 < val2) ? val1 : val2); - *result = ((*val1 < *val2) ? *val1 : *val2); + PG_RETURN_INT64(result); +} - return result; -} /* int8smaller() */ - - -int64 * -int84pl(int64 *val1, int32 val2) +Datum +int84pl(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - if (!PointerIsValid(val1)) - return NULL; + PG_RETURN_INT64(val1 + val2); +} - *result = *val1 + (int64) val2; - - return result; -} /* int84pl() */ - -int64 * -int84mi(int64 *val1, int32 val2) +Datum +int84mi(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - if (!PointerIsValid(val1)) - return NULL; + PG_RETURN_INT64(val1 - val2); +} - *result = *val1 - (int64) val2; - - return result; -} /* int84mi() */ - -int64 * -int84mul(int64 *val1, int32 val2) +Datum +int84mul(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - if (!PointerIsValid(val1)) - return NULL; + PG_RETURN_INT64(val1 * val2); +} - *result = *val1 * (int64) val2; - - return result; -} /* int84mul() */ - -int64 * -int84div(int64 *val1, int32 val2) +Datum +int84div(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int64 val1 = PG_GETARG_INT64(0); + int32 val2 = PG_GETARG_INT32(1); - if (!PointerIsValid(val1)) - return NULL; + PG_RETURN_INT64(val1 / val2); +} - *result = *val1 / (int64) val2; - - return result; -} /* int84div() */ - - -int64 * -int48pl(int32 val1, int64 *val2) +Datum +int48pl(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - if (!PointerIsValid(val2)) - return NULL; + PG_RETURN_INT64(val1 + val2); +} - *result = (int64) val1 + *val2; - - return result; -} /* int48pl() */ - -int64 * -int48mi(int32 val1, int64 *val2) +Datum +int48mi(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - if (!PointerIsValid(val2)) - return NULL; + PG_RETURN_INT64(val1 - val2); +} - *result = (int64) val1 - *val2; - - return result; -} /* int48mi() */ - -int64 * -int48mul(int32 val1, int64 *val2) +Datum +int48mul(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - if (!PointerIsValid(val2)) - return NULL; + PG_RETURN_INT64(val1 * val2); +} - *result = (int64) val1 **val2; - - return result; -} /* int48mul() */ - -int64 * -int48div(int32 val1, int64 *val2) +Datum +int48div(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int32 val1 = PG_GETARG_INT32(0); + int64 val2 = PG_GETARG_INT64(1); - if (!PointerIsValid(val2)) - return NULL; - - *result = (int64) val1 / *val2; - - return result; -} /* int48div() */ + PG_RETURN_INT64(val1 / val2); +} /*---------------------------------------------------------- * Conversion operators. *---------------------------------------------------------*/ -int64 * -int48(int32 val) +Datum +int48(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + int32 val = PG_GETARG_INT32(0); - *result = val; + PG_RETURN_INT64((int64) val); +} - return result; -} /* int48() */ - -int32 -int84(int64 *val) +Datum +int84(PG_FUNCTION_ARGS) { + int64 val = PG_GETARG_INT64(0); int32 result; - if (!PointerIsValid(val)) - elog(ERROR, "Invalid (null) int64, can't convert int8 to int4"); - - if ((*val < INT_MIN) || (*val > INT_MAX)) + if ((val < INT_MIN) || (val > INT_MAX)) elog(ERROR, "int8 conversion to int4 is out of range"); - result = *val; + result = (int32) val; - return result; -} /* int84() */ + PG_RETURN_INT32(result); +} -#if NOT_USED -int64 * -int2vector (int16 val) +Datum +i8tod(PG_FUNCTION_ARGS) { - int64 *result; + int64 val = PG_GETARG_INT64(0); + float8 result; - result = palloc(sizeof(int64)); + result = val; - *result = val; - - return result; -} /* int2vector() */ - -int16 -int82(int64 *val) -{ - int16 result; - - if (!PointerIsValid(val)) - elog(ERROR, "Invalid (null) int8, can't convert to int2"); - - if ((*val < SHRT_MIN) || (*val > SHRT_MAX)) - elog(ERROR, "int8 conversion to int2 is out of range"); - - result = *val; - - return result; -} /* int82() */ - -#endif - -float64 -i8tod(int64 *val) -{ - float64 result = palloc(sizeof(float64data)); - - if (!PointerIsValid(val)) - elog(ERROR, "Invalid (null) int8, can't convert to float8"); - - *result = *val; - - return result; -} /* i8tod() */ + PG_RETURN_FLOAT8(result); +} /* dtoi8() * Convert double float to 8-byte integer. @@ -644,62 +528,63 @@ i8tod(int64 *val) * does the right thing on my i686/linux-rh4.2 box. * - thomas 1998-06-16 */ -int64 * -dtoi8(float64 val) +Datum +dtoi8(PG_FUNCTION_ARGS) { - int64 *result = palloc(sizeof(int64)); + float8 val = PG_GETARG_FLOAT8(0); + int64 result; - if (!PointerIsValid(val)) - elog(ERROR, "Invalid (null) float8, can't convert to int8"); - - if ((*val < (-pow(2, 63) + 1)) || (*val > (pow(2, 63) - 1))) + if ((val < (-pow(2.0, 63.0) + 1)) || (val > (pow(2.0, 63.0) - 1))) elog(ERROR, "Floating point conversion to int64 is out of range"); - *result = *val; + result = (int64) val; - return result; -} /* dtoi8() */ + PG_RETURN_INT64(result); +} /* text_int8() */ -int64 * -text_int8(text *str) +Datum +text_int8(PG_FUNCTION_ARGS) { + text *str = PG_GETARG_TEXT_P(0); int len; char *s; - - if (!PointerIsValid(str)) - elog(ERROR, "Bad (null) int8 external representation"); + Datum result; len = (VARSIZE(str) - VARHDRSZ); s = palloc(len + 1); - memmove(s, VARDATA(str), len); + memcpy(s, VARDATA(str), len); *(s + len) = '\0'; - return int8in(s); -} /* text_int8() */ + result = DirectFunctionCall1(int8in, CStringGetDatum(s)); + + pfree(s); + + return result; +} /* int8_text() */ -text * -int8_text(int64 *val) +Datum +int8_text(PG_FUNCTION_ARGS) { + /* val is int64, but easier to leave it as Datum */ + Datum val = PG_GETARG_DATUM(0); + char *s; + int len; text *result; - int len; - char *s; - - if (!PointerIsValid(val)) - return NULL; - - s = int8out(val); + s = DatumGetCString(DirectFunctionCall1(int8out, val)); len = strlen(s); - result = palloc(VARHDRSZ + len); + result = (text *) palloc(VARHDRSZ + len); VARSIZE(result) = len + VARHDRSZ; - memmove(VARDATA(result), s, len); + memcpy(VARDATA(result), s, len); - return result; -} /* int8_text() */ + pfree(s); + + PG_RETURN_TEXT_P(result); +} diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 500cb151ac..a628e9c8f3 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -5,7 +5,7 @@ * * 1998 Jan Wieck * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.28 2000/06/05 07:28:52 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.29 2000/06/13 07:35:07 tgl Exp $ * * ---------- */ @@ -33,9 +33,6 @@ * Local definitions * ---------- */ -#define PG_GETARG_NUMERIC(n) ((Numeric) DatumGetPointer(fcinfo->arg[n])) -#define PG_RETURN_NUMERIC(x) return PointerGetDatum(x) - #ifndef MIN #define MIN(a,b) (((a)<(b)) ? (a) : (b)) #endif @@ -189,28 +186,23 @@ static void sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result); * Input function for numeric data type * ---------- */ -Numeric -numeric_in(char *str, int dummy, int32 typmod) +Datum +numeric_in(PG_FUNCTION_ARGS) { + char *str = PG_GETARG_CSTRING(0); +#ifdef NOT_USED + Oid typelem = PG_GETARG_OID(1); +#endif + int32 typmod = PG_GETARG_INT32(2); NumericVar value; Numeric res; - /* ---------- - * Check for NULL - * ---------- - */ - if (str == NULL) - return NULL; - - if (strcmp(str, "NULL") == 0) - return NULL; - /* ---------- * Check for NaN * ---------- */ if (strcmp(str, "NaN") == 0) - return make_result(&const_nan); + PG_RETURN_NUMERIC(make_result(&const_nan)); /* ---------- * Use set_var_from_str() to parse the input string @@ -225,7 +217,7 @@ numeric_in(char *str, int dummy, int32 typmod) res = make_result(&value); free_var(&value); - return res; + PG_RETURN_NUMERIC(res); } @@ -235,25 +227,19 @@ numeric_in(char *str, int dummy, int32 typmod) * Output function for numeric data type * ---------- */ -char * -numeric_out(Numeric num) +Datum +numeric_out(PG_FUNCTION_ARGS) { + Numeric num = PG_GETARG_NUMERIC(0); NumericVar x; char *str; - /* ---------- - * Handle NULL - * ---------- - */ - if (num == NULL) - return pstrdup("NULL"); - /* ---------- * Handle NaN * ---------- */ if (NUMERIC_IS_NAN(num)) - return pstrdup("NaN"); + PG_RETURN_CSTRING(pstrdup("NaN")); /* ---------- * Get the number in the variable format. @@ -271,7 +257,7 @@ numeric_out(Numeric num) free_var(&x); - return str; + PG_RETURN_CSTRING(str); } @@ -283,9 +269,11 @@ numeric_out(Numeric num) * scale of the attribute have to be applied on the value. * ---------- */ -Numeric -numeric(Numeric num, int32 typmod) +Datum +numeric(PG_FUNCTION_ARGS) { + Numeric num = PG_GETARG_NUMERIC(0); + int32 typmod = PG_GETARG_INT32(1); Numeric new; int32 tmp_typmod; int precision; @@ -293,19 +281,12 @@ numeric(Numeric num, int32 typmod) int maxweight; NumericVar var; - /* ---------- - * Handle NULL - * ---------- - */ - if (num == NULL) - return NULL; - /* ---------- * Handle NaN * ---------- */ if (NUMERIC_IS_NAN(num)) - return make_result(&const_nan); + PG_RETURN_NUMERIC(make_result(&const_nan)); /* ---------- * If the value isn't a valid type modifier, simply return a @@ -316,7 +297,7 @@ numeric(Numeric num, int32 typmod) { new = (Numeric) palloc(num->varlen); memcpy(new, num, num->varlen); - return new; + PG_RETURN_NUMERIC(new); } /* ---------- @@ -341,7 +322,7 @@ numeric(Numeric num, int32 typmod) new->n_rscale = scale; new->n_sign_dscale = NUMERIC_SIGN(new) | ((uint16) scale & NUMERIC_DSCALE_MASK); - return new; + PG_RETURN_NUMERIC(new); } /* ---------- @@ -357,7 +338,7 @@ numeric(Numeric num, int32 typmod) free_var(&var); - return new; + PG_RETURN_NUMERIC(new); } @@ -502,26 +483,21 @@ numeric_sign(Numeric num) * point --- Oracle interprets rounding that way. * ---------- */ -Numeric -numeric_round(Numeric num, int32 scale) +Datum +numeric_round(PG_FUNCTION_ARGS) { + Numeric num = PG_GETARG_NUMERIC(0); + int32 scale = PG_GETARG_INT32(1); Numeric res; NumericVar arg; int i; - /* ---------- - * Handle NULL - * ---------- - */ - if (num == NULL) - return NULL; - /* ---------- * Handle NaN * ---------- */ if (NUMERIC_IS_NAN(num)) - return make_result(&const_nan); + PG_RETURN_NUMERIC(make_result(&const_nan)); /* ---------- * Limit the scale value to avoid possible overflow in calculations below. @@ -587,7 +563,7 @@ numeric_round(Numeric num, int32 scale) res = make_result(&arg); free_var(&arg); - return res; + PG_RETURN_NUMERIC(res); } @@ -599,25 +575,20 @@ numeric_round(Numeric num, int32 scale) * point --- Oracle interprets truncation that way. * ---------- */ -Numeric -numeric_trunc(Numeric num, int32 scale) +Datum +numeric_trunc(PG_FUNCTION_ARGS) { + Numeric num = PG_GETARG_NUMERIC(0); + int32 scale = PG_GETARG_INT32(1); Numeric res; NumericVar arg; - /* ---------- - * Handle NULL - * ---------- - */ - if (num == NULL) - return NULL; - /* ---------- * Handle NaN * ---------- */ if (NUMERIC_IS_NAN(num)) - return make_result(&const_nan); + PG_RETURN_NUMERIC(make_result(&const_nan)); /* ---------- * Limit the scale value to avoid possible overflow in calculations below. @@ -650,7 +621,7 @@ numeric_trunc(Numeric num, int32 scale) res = make_result(&arg); free_var(&arg); - return res; + PG_RETURN_NUMERIC(res); } @@ -1708,9 +1679,10 @@ numeric_power(Numeric num1, Numeric num2) */ -Numeric -int4_numeric(int32 val) +Datum +int4_numeric(PG_FUNCTION_ARGS) { + int32 val = PG_GETARG_INT32(0); Numeric res; NumericVar result; char *tmp; @@ -1725,7 +1697,7 @@ int4_numeric(int32 val) free_var(&result); pfree(tmp); - return res; + PG_RETURN_NUMERIC(res); } @@ -1769,7 +1741,8 @@ int8_numeric(int64 *val) init_var(&result); - tmp = int8out(val); + tmp = DatumGetCString(DirectFunctionCall1(int8out, + PointerGetDatum(val))); set_var_from_str(tmp, &result); res = make_result(&result); @@ -1785,7 +1758,7 @@ numeric_int8(Numeric num) { NumericVar x; char *str; - int64 *result; + Datum result; if (num == NULL) return NULL; @@ -1804,10 +1777,11 @@ numeric_int8(Numeric num) free_var(&x); - result = int8in(str); + result = DirectFunctionCall1(int8in, CStringGetDatum(str)); + pfree(str); - return result; + return (int64 *) (result); } @@ -1904,7 +1878,8 @@ numeric_float8(Numeric num) return result; } - tmp = numeric_out(num); + tmp = DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(num))); result = float8in(tmp); pfree(tmp); @@ -1954,7 +1929,8 @@ numeric_float4(Numeric num) return result; } - tmp = numeric_out(num); + tmp = DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(num))); result = float4in(tmp); pfree(tmp); diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index 522e6c7bce..4455c04c55 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -1,7 +1,7 @@ /* * Edmund Mergl * - * $Id: oracle_compat.c,v 1.24 2000/04/12 17:15:51 momjian Exp $ + * $Id: oracle_compat.c,v 1.25 2000/06/13 07:35:07 tgl Exp $ * */ @@ -150,9 +150,12 @@ initcap(text *string) * ********************************************************************/ -text * -lpad(text *string1, int4 len, text *string2) +Datum +lpad(PG_FUNCTION_ARGS) { + text *string1 = PG_GETARG_TEXT_P(0); + int32 len = PG_GETARG_INT32(1); + text *string2 = PG_GETARG_TEXT_P(2); text *ret; char *ptr1, *ptr2, @@ -160,12 +163,10 @@ lpad(text *string1, int4 len, text *string2) int m, n; - if ((string1 == (text *) NULL) || - (len <= (VARSIZE(string1) - VARHDRSZ)) || - ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) || - (string2 == (text *) NULL) || + if (((VARSIZE(string1) - VARHDRSZ) < 0) || + ((m = len - (VARSIZE(string1) - VARHDRSZ)) <= 0) || ((VARSIZE(string2) - VARHDRSZ) <= 0)) - return string1; + PG_RETURN_TEXT_P(string1); ret = (text *) palloc(VARHDRSZ + len); VARSIZE(ret) = VARHDRSZ + len; @@ -176,7 +177,7 @@ lpad(text *string1, int4 len, text *string2) while (m--) { *ptr_ret++ = *ptr2; - ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2; + ptr2 = (ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1) ? VARDATA(string2) : ++ptr2; } n = VARSIZE(string1) - VARHDRSZ; @@ -185,7 +186,7 @@ lpad(text *string1, int4 len, text *string2) while (n--) *ptr_ret++ = *ptr1++; - return ret; + PG_RETURN_TEXT_P(ret); } @@ -204,9 +205,12 @@ lpad(text *string1, int4 len, text *string2) * ********************************************************************/ -text * -rpad(text *string1, int4 len, text *string2) +Datum +rpad(PG_FUNCTION_ARGS) { + text *string1 = PG_GETARG_TEXT_P(0); + int32 len = PG_GETARG_INT32(1); + text *string2 = PG_GETARG_TEXT_P(2); text *ret; char *ptr1, *ptr2, @@ -214,12 +218,10 @@ rpad(text *string1, int4 len, text *string2) int m, n; - if ((string1 == (text *) NULL) || - (len <= (VARSIZE(string1) - VARHDRSZ)) || - ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) || - (string2 == (text *) NULL) || + if (((VARSIZE(string1) - VARHDRSZ) < 0) || + ((m = len - (VARSIZE(string1) - VARHDRSZ)) <= 0) || ((VARSIZE(string2) - VARHDRSZ) <= 0)) - return string1; + PG_RETURN_TEXT_P(string1); ret = (text *) palloc(VARHDRSZ + len); VARSIZE(ret) = VARHDRSZ + len; @@ -236,10 +238,10 @@ rpad(text *string1, int4 len, text *string2) while (m--) { *ptr_ret++ = *ptr2; - ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2; + ptr2 = (ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1) ? VARDATA(string2) : ++ptr2; } - return ret; + PG_RETURN_TEXT_P(ret); } @@ -551,22 +553,25 @@ ascii(text *string) } /* ascii() */ -text * -ichar(int4 cvalue) +Datum +ichar(PG_FUNCTION_ARGS) { + int32 cvalue = PG_GETARG_INT32(0); text *result; result = (text *) palloc(VARHDRSZ + 1); VARSIZE(result) = VARHDRSZ + 1; *VARDATA(result) = (char) cvalue; - return result; -} /* ichar() */ + PG_RETURN_TEXT_P(result); +} -text * -repeat(text *string, int4 count) +Datum +repeat(PG_FUNCTION_ARGS) { + text *string = PG_GETARG_TEXT_P(0); + int32 count = PG_GETARG_INT32(1); text *result; int slen, tlen; @@ -589,5 +594,5 @@ repeat(text *string, int4 count) cp += slen; } - return result; -} /* repeat() */ + PG_RETURN_TEXT_P(result); +} diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7bee5abe28..5b2a2ea016 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * out of its tuple * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.53 2000/06/12 19:40:43 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.54 2000/06/13 07:35:08 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -551,18 +551,19 @@ pg_get_indexdef(PG_FUNCTION_ARGS) * fallback to 'unknown (UID=n)' * ---------- */ -NameData * -pg_get_userbyid(int32 uid) +Datum +pg_get_userbyid(PG_FUNCTION_ARGS) { + int32 uid = PG_GETARG_INT32(0); + Name result; HeapTuple usertup; Form_pg_shadow user_rec; - NameData *result; /* ---------- * Allocate space for the result * ---------- */ - result = (NameData *) palloc(NAMEDATALEN); + result = (Name) palloc(NAMEDATALEN); memset(NameStr(*result), 0, NAMEDATALEN); /* ---------- @@ -570,16 +571,17 @@ pg_get_userbyid(int32 uid) * ---------- */ usertup = SearchSysCacheTuple(SHADOWSYSID, - ObjectIdGetDatum(uid), 0, 0, 0); + ObjectIdGetDatum(uid), + 0, 0, 0); if (HeapTupleIsValid(usertup)) { user_rec = (Form_pg_shadow) GETSTRUCT(usertup); StrNCpy(NameStr(*result), NameStr(user_rec->usename), NAMEDATALEN); } else - sprintf((char *) result, "unknown (UID=%d)", uid); + sprintf(NameStr(*result), "unknown (UID=%d)", uid); - return result; + PG_RETURN_NAME(result); } /* ---------- diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 781d6591b3..80d8a6a8db 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.63 2000/06/05 07:28:52 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.64 2000/06/13 07:35:08 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -61,20 +61,21 @@ extern char *convertstr(char *, int, int); /* * bpcharin - * converts a string of char() type to the internal representation. - * len is the length specified in () plus VARHDRSZ bytes. (XXX dummy is here - * because we pass typelem as the second argument for array_in.) + * len is the length specified in () plus VARHDRSZ bytes. */ -char * -bpcharin(char *s, int dummy, int32 atttypmod) +Datum +bpcharin(PG_FUNCTION_ARGS) { - char *result, - *r; + char *s = PG_GETARG_CSTRING(0); +#ifdef NOT_USED + Oid typelem = PG_GETARG_OID(1); +#endif + int32 atttypmod = PG_GETARG_INT32(2); + BpChar *result; + char *r; int len; int i; - if (s == NULL) - return (char *) NULL; - if (atttypmod < (int32) VARHDRSZ) { /* If typmod is -1 (or invalid), use the actual string length */ @@ -84,7 +85,7 @@ bpcharin(char *s, int dummy, int32 atttypmod) else len = atttypmod - VARHDRSZ; - result = (char *) palloc(atttypmod); + result = (BpChar *) palloc(atttypmod); VARSIZE(result) = atttypmod; r = VARDATA(result); for (i = 0; i < len; i++, r++, s++) @@ -95,85 +96,78 @@ bpcharin(char *s, int dummy, int32 atttypmod) } #ifdef CYR_RECODE - convertstr(result + VARHDRSZ, len, 0); + convertstr(VARDATA(result), len, 0); #endif /* blank pad the string if necessary */ for (; i < len; i++) *r++ = ' '; - return result; + + PG_RETURN_BPCHAR_P(result); } -char * -bpcharout(char *s) +Datum +bpcharout(PG_FUNCTION_ARGS) { + BpChar *s = PG_GETARG_BPCHAR_P(0); char *result; int len; - if (s == NULL) - { - result = (char *) palloc(2); - result[0] = '-'; - result[1] = '\0'; - } - else - { - len = VARSIZE(s) - VARHDRSZ; - result = (char *) palloc(len + 1); - StrNCpy(result, VARDATA(s), len + 1); /* these are blank-padded */ - } + len = VARSIZE(s) - VARHDRSZ; + result = (char *) palloc(len + 1); + StrNCpy(result, VARDATA(s), len + 1); /* copy and add null term */ #ifdef CYR_RECODE convertstr(result, len, 1); #endif - return result; + PG_RETURN_CSTRING(result); } /* bpchar() * Converts a char() type to a specific internal length. * len is the length specified in () plus VARHDRSZ bytes. */ -char * -bpchar(char *s, int32 len) +Datum +bpchar(PG_FUNCTION_ARGS) { - char *result, - *r; + BpChar *str = PG_GETARG_BPCHAR_P(0); + int32 len = PG_GETARG_INT32(1); + BpChar *result; + char *r, + *s; int rlen, slen; int i; - if (s == NULL) - return (char *) NULL; - /* No work if typmod is invalid or supplied data matches it already */ - if (len < (int32) VARHDRSZ || len == VARSIZE(s)) - return s; + if (len < (int32) VARHDRSZ || len == VARSIZE(str)) + PG_RETURN_BPCHAR_P(str); rlen = len - VARHDRSZ; #ifdef STRINGDEBUG printf("bpchar- convert string length %d (%d) ->%d (%d)\n", - VARSIZE(s) - VARHDRSZ, VARSIZE(s), rlen, len); + VARSIZE(str) - VARHDRSZ, VARSIZE(str), rlen, len); #endif - result = (char *) palloc(len); + result = (BpChar *) palloc(len); VARSIZE(result) = len; r = VARDATA(result); -#ifdef MULTIBYTE +#ifdef MULTIBYTE /* * truncate multi-byte string in a way not to break multi-byte * boundary */ - if (VARSIZE(s) > len) - slen = pg_mbcliplen(VARDATA(s), VARSIZE(s) - VARHDRSZ, rlen); + if (VARSIZE(str) > len) + slen = pg_mbcliplen(VARDATA(str), VARSIZE(str) - VARHDRSZ, rlen); else - slen = VARSIZE(s) - VARHDRSZ; + slen = VARSIZE(str) - VARHDRSZ; #else - slen = VARSIZE(s) - VARHDRSZ; + slen = VARSIZE(str) - VARHDRSZ; #endif - s = VARDATA(s); + s = VARDATA(str); #ifdef STRINGDEBUG printf("bpchar- string is '"); @@ -181,13 +175,9 @@ bpchar(char *s, int32 len) for (i = 0; (i < rlen) && (i < slen); i++) { - if (*s == '\0') - break; - #ifdef STRINGDEBUG printf("%c", *s); #endif - *r++ = *s++; } @@ -199,19 +189,21 @@ bpchar(char *s, int32 len) for (; i < rlen; i++) *r++ = ' '; - return result; -} /* bpchar() */ + PG_RETURN_BPCHAR_P(result); +} /* _bpchar() - * Converts an array of char() type to a specific internal length. + * Converts an array of char() elements to a specific internal length. * len is the length specified in () plus VARHDRSZ bytes. */ -ArrayType * -_bpchar(ArrayType *v, int32 len) +Datum +_bpchar(PG_FUNCTION_ARGS) { + ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0); + int32 len = PG_GETARG_INT32(1); FunctionCallInfoData locfcinfo; - Datum result; - /* Since bpchar() is a built-in function, we should only need to + /* + * Since bpchar() is a built-in function, we should only need to * look it up once per run. */ static FmgrInfo bpchar_finfo; @@ -226,9 +218,7 @@ _bpchar(ArrayType *v, int32 len) locfcinfo.arg[0] = PointerGetDatum(v); locfcinfo.arg[1] = Int32GetDatum(len); - result = array_map(&locfcinfo, BPCHAROID, BPCHAROID); - - return (ArrayType *) DatumGetPointer(result); + return array_map(&locfcinfo, BPCHAROID, BPCHAROID); } @@ -240,7 +230,7 @@ _bpchar(ArrayType *v, int32 len) Datum bpchar_char(PG_FUNCTION_ARGS) { - struct varlena *s = PG_GETARG_BPCHAR_P(0); + BpChar *s = PG_GETARG_BPCHAR_P(0); PG_RETURN_CHAR(*VARDATA(s)); } @@ -252,9 +242,9 @@ Datum char_bpchar(PG_FUNCTION_ARGS) { char c = PG_GETARG_CHAR(0); - struct varlena *result; + BpChar *result; - result = (struct varlena *) palloc(VARHDRSZ + 1); + result = (BpChar *) palloc(VARHDRSZ + 1); VARSIZE(result) = VARHDRSZ + 1; *(VARDATA(result)) = c; @@ -338,75 +328,67 @@ name_bpchar(NameData *s) /* * varcharin - * converts a string of varchar() type to the internal representation. - * len is the length specified in () plus VARHDRSZ bytes. (XXX dummy is here - * because we pass typelem as the second argument for array_in.) + * len is the length specified in () plus VARHDRSZ bytes. */ -char * -varcharin(char *s, int dummy, int32 atttypmod) +Datum +varcharin(PG_FUNCTION_ARGS) { - char *result; + char *s = PG_GETARG_CSTRING(0); +#ifdef NOT_USED + Oid typelem = PG_GETARG_OID(1); +#endif + int32 atttypmod = PG_GETARG_INT32(2); + VarChar *result; int len; - if (s == NULL) - return (char *) NULL; - len = strlen(s) + VARHDRSZ; if (atttypmod >= (int32) VARHDRSZ && len > atttypmod) len = atttypmod; /* clip the string at max length */ - result = (char *) palloc(len); + result = (VarChar *) palloc(len); VARSIZE(result) = len; - strncpy(VARDATA(result), s, len - VARHDRSZ); + memcpy(VARDATA(result), s, len - VARHDRSZ); #ifdef CYR_RECODE - convertstr(result + VARHDRSZ, len, 0); + convertstr(VARDATA(result), len, 0); #endif - return result; + PG_RETURN_VARCHAR_P(result); } -char * -varcharout(char *s) +Datum +varcharout(PG_FUNCTION_ARGS) { + VarChar *s = PG_GETARG_VARCHAR_P(0); char *result; int len; - if (s == NULL) - { - result = (char *) palloc(2); - result[0] = '-'; - result[1] = '\0'; - } - else - { - len = VARSIZE(s) - VARHDRSZ; - result = (char *) palloc(len + 1); - StrNCpy(result, VARDATA(s), len + 1); - } + len = VARSIZE(s) - VARHDRSZ; + result = (char *) palloc(len + 1); + StrNCpy(result, VARDATA(s), len + 1); /* copy and add null term */ #ifdef CYR_RECODE convertstr(result, len, 1); #endif - return result; + PG_RETURN_CSTRING(result); } /* varchar() * Converts a varchar() type to the specified size. * slen is the length specified in () plus VARHDRSZ bytes. */ -char * -varchar(char *s, int32 slen) +Datum +varchar(PG_FUNCTION_ARGS) { - char *result; + VarChar *s = PG_GETARG_VARCHAR_P(0); + int32 slen = PG_GETARG_INT32(1); + VarChar *result; int len; - if (s == NULL) - return (char *) NULL; - len = VARSIZE(s); if (slen < (int32) VARHDRSZ || len <= slen) - return (char *) s; + PG_RETURN_VARCHAR_P(s); /* only reach here if we need to truncate string... */ @@ -422,23 +404,25 @@ varchar(char *s, int32 slen) len = slen - VARHDRSZ; #endif - result = (char *) palloc(slen); + result = (VarChar *) palloc(slen); VARSIZE(result) = slen; - strncpy(VARDATA(result), VARDATA(s), len); + memcpy(VARDATA(result), VARDATA(s), len); - return result; -} /* varchar() */ + PG_RETURN_VARCHAR_P(result); +} /* _varchar() - * Converts an array of varchar() type to the specified size. + * Converts an array of varchar() elements to the specified size. * len is the length specified in () plus VARHDRSZ bytes. */ -ArrayType * -_varchar(ArrayType *v, int32 len) +Datum +_varchar(PG_FUNCTION_ARGS) { + ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0); + int32 len = PG_GETARG_INT32(1); FunctionCallInfoData locfcinfo; - Datum result; - /* Since varchar() is a built-in function, we should only need to + /* + * Since varchar() is a built-in function, we should only need to * look it up once per run. */ static FmgrInfo varchar_finfo; @@ -453,9 +437,7 @@ _varchar(ArrayType *v, int32 len) locfcinfo.arg[0] = PointerGetDatum(v); locfcinfo.arg[1] = Int32GetDatum(len); - result = array_map(&locfcinfo, VARCHAROID, VARCHAROID); - - return (ArrayType *) DatumGetPointer(result); + return array_map(&locfcinfo, VARCHAROID, VARCHAROID); } diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 154d8beb27..34a3c13e1a 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.58 2000/04/12 17:15:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.59 2000/06/13 07:35:08 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -323,21 +323,19 @@ textcat(text *t1, text *t2) * Formerly returned the entire string; now returns a portion. * - Thomas Lockhart 1998-12-10 */ -text * -text_substr(text *string, int32 m, int32 n) +Datum +text_substr(PG_FUNCTION_ARGS) { + text *string = PG_GETARG_TEXT_P(0); + int32 m = PG_GETARG_INT32(1); + int32 n = PG_GETARG_INT32(2); text *ret; int len; - #ifdef MULTIBYTE int i; char *p; - #endif - if (string == (text *) NULL) - return string; - len = VARSIZE(string) - VARHDRSZ; #ifdef MULTIBYTE len = pg_mbstrlen_with_len(VARDATA(string), len); @@ -374,13 +372,14 @@ text_substr(text *string, int32 m, int32 n) p += pg_mblen(p); n = p - (VARDATA(string) + m); #endif + ret = (text *) palloc(VARHDRSZ + n); VARSIZE(ret) = VARHDRSZ + n; memcpy(VARDATA(ret), VARDATA(string) + m, n); - return ret; -} /* text_substr() */ + PG_RETURN_TEXT_P(ret); +} /* * textpos - @@ -636,19 +635,17 @@ byteaoctetlen(bytea *v) * byteaGetByte * * this routine treats "bytea" as an array of bytes. - * It returns the Nth byte (a number between 0 and 255) or - * it dies if the length of this array is less than n. + * It returns the Nth byte (a number between 0 and 255). *------------------------------------------------------------- */ -int32 -byteaGetByte(bytea *v, int32 n) +Datum +byteaGetByte(PG_FUNCTION_ARGS) { + bytea *v = PG_GETARG_BYTEA_P(0); + int32 n = PG_GETARG_INT32(1); int len; int byte; - if (!PointerIsValid(v)) - return 0; - len = VARSIZE(v) - VARHDRSZ; if (n < 0 || n >= len) @@ -657,7 +654,7 @@ byteaGetByte(bytea *v, int32 n) byte = ((unsigned char *) VARDATA(v))[n]; - return (int32) byte; + PG_RETURN_INT32(byte); } /*------------------------------------------------------------- @@ -665,21 +662,19 @@ byteaGetByte(bytea *v, int32 n) * * This routine treats a "bytea" type like an array of bits. * It returns the value of the Nth bit (0 or 1). - * If 'n' is out of range, it dies! * *------------------------------------------------------------- */ -int32 -byteaGetBit(bytea *v, int32 n) +Datum +byteaGetBit(PG_FUNCTION_ARGS) { + bytea *v = PG_GETARG_BYTEA_P(0); + int32 n = PG_GETARG_INT32(1); int byteNo, bitNo; int len; int byte; - if (!PointerIsValid(v)) - return 0; - len = VARSIZE(v) - VARHDRSZ; if (n < 0 || n >= len * 8) @@ -692,9 +687,9 @@ byteaGetBit(bytea *v, int32 n) byte = ((unsigned char *) VARDATA(v))[byteNo]; if (byte & (1 << bitNo)) - return (int32) 1; + PG_RETURN_INT32(1); else - return (int32) 0; + PG_RETURN_INT32(0); } /*------------------------------------------------------------- @@ -705,15 +700,15 @@ byteaGetBit(bytea *v, int32 n) * *------------------------------------------------------------- */ -bytea * -byteaSetByte(bytea *v, int32 n, int32 newByte) +Datum +byteaSetByte(PG_FUNCTION_ARGS) { + bytea *v = PG_GETARG_BYTEA_P(0); + int32 n = PG_GETARG_INT32(1); + int32 newByte = PG_GETARG_INT32(2); int len; bytea *res; - if (!PointerIsValid(v)) - return 0; - len = VARSIZE(v) - VARHDRSZ; if (n < 0 || n >= len) @@ -731,7 +726,7 @@ byteaSetByte(bytea *v, int32 n, int32 newByte) */ ((unsigned char *) VARDATA(res))[n] = newByte; - return res; + PG_RETURN_BYTEA_P(res); } /*------------------------------------------------------------- @@ -742,9 +737,12 @@ byteaSetByte(bytea *v, int32 n, int32 newByte) * *------------------------------------------------------------- */ -bytea * -byteaSetBit(bytea *v, int32 n, int32 newBit) +Datum +byteaSetBit(PG_FUNCTION_ARGS) { + bytea *v = PG_GETARG_BYTEA_P(0); + int32 n = PG_GETARG_INT32(1); + int32 newBit = PG_GETARG_INT32(2); bytea *res; int len; int oldByte, @@ -752,9 +750,6 @@ byteaSetBit(bytea *v, int32 n, int32 newBit) int byteNo, bitNo; - if (!PointerIsValid(v)) - return NULL; - len = VARSIZE(v) - VARHDRSZ; if (n < 0 || n >= len * 8) @@ -771,24 +766,24 @@ byteaSetBit(bytea *v, int32 n, int32 newBit) elog(ERROR, "byteaSetBit: new bit must be 0 or 1"); /* - * get the byte where the bit we want is stored. + * Make a copy of the original varlena. */ - oldByte = byteaGetByte(v, byteNo); + res = (bytea *) palloc(VARSIZE(v)); + memcpy((char *) res, (char *) v, VARSIZE(v)); /* - * calculate the new value for that byte + * Update the byte. */ + oldByte = ((unsigned char *) VARDATA(res))[byteNo]; + if (newBit == 0) newByte = oldByte & (~(1 << bitNo)); else newByte = oldByte | (1 << bitNo); - /* - * NOTE: 'byteaSetByte' creates a copy of 'v' & sets the byte. - */ - res = byteaSetByte(v, byteNo, newByte); + ((unsigned char *) VARDATA(res))[byteNo] = newByte; - return res; + PG_RETURN_BYTEA_P(res); } diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 12facde811..3dee08ec51 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.48 2000/06/08 22:37:33 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.49 2000/06/13 07:35:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,6 +28,7 @@ #include "catalog/catname.h" #include "catalog/pg_shadow.h" #include "miscadmin.h" +#include "utils/builtins.h" #include "utils/syscache.h" static char *GetPidFname(void); @@ -98,25 +99,26 @@ SetDatabaseName(const char *name) } #ifndef MULTIBYTE -/* even if MULTIBYTE is not enabled, this function is neccesary - * since pg_proc.h has entries for them. +/* even if MULTIBYTE is not enabled, these functions are necessary + * since pg_proc.h has references to them. */ -const char * -getdatabaseencoding() + +Datum +getdatabaseencoding(PG_FUNCTION_ARGS) { - return ("SQL_ASCII"); + PG_RETURN_NAME("SQL_ASCII"); } -const char * -pg_encoding_to_char(int encoding) +Datum +PG_encoding_to_char(PG_FUNCTION_ARGS) { - return ("SQL_ASCII"); + PG_RETURN_NAME("SQL_ASCII"); } -int -pg_char_to_encoding(const char *encoding_string) +Datum +PG_char_to_encoding(PG_FUNCTION_ARGS) { - return (0); + PG_RETURN_INT32(0); } #endif diff --git a/src/backend/utils/mb/common.c b/src/backend/utils/mb/common.c index 2927bc5e94..89f63ad2ec 100644 --- a/src/backend/utils/mb/common.c +++ b/src/backend/utils/mb/common.c @@ -2,7 +2,7 @@ * This file contains some public functions * usable for both the backend and the frontend. * Tatsuo Ishii - * $Id: common.c,v 1.8 2000/01/18 05:14:24 ishii Exp $ */ + * $Id: common.c,v 1.9 2000/06/13 07:35:15 tgl Exp $ */ #include #include @@ -14,8 +14,10 @@ #endif #include "postgres.h" + #include "miscadmin.h" #include "mb/pg_wchar.h" +#include "utils/builtins.h" /* * convert encoding char to encoding symbol value. @@ -38,6 +40,15 @@ pg_char_to_encoding(const char *s) return (p->encoding); } +/* Same, as an fmgr-callable function */ +Datum +PG_char_to_encoding(PG_FUNCTION_ARGS) +{ + Name s = PG_GETARG_NAME(0); + + PG_RETURN_INT32(pg_char_to_encoding(NameStr(*s))); +} + /* * check to see if encoding name is valid */ @@ -77,6 +88,15 @@ pg_encoding_to_char(int encoding) return (p->name); } +/* Same, as an fmgr-callable function */ +Datum +PG_encoding_to_char(PG_FUNCTION_ARGS) +{ + int32 encoding = PG_GETARG_INT32(0); + + PG_RETURN_NAME(pg_encoding_to_char(encoding)); +} + /* returns the byte length of a multi-byte word for an encoding */ int pg_encoding_mblen(int encoding, const unsigned char *mbstr) diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index ba22ec347f..2e21f4f37a 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -3,12 +3,14 @@ * client encoding and server internal encoding. * (currently mule internal code (mic) is used) * Tatsuo Ishii - * $Id: mbutils.c,v 1.9 1999/09/11 22:28:00 tgl Exp $ */ + * $Id: mbutils.c,v 1.10 2000/06/13 07:35:12 tgl Exp $ */ #include "postgres.h" + #include "miscadmin.h" #include "mb/pg_wchar.h" +#include "utils/builtins.h" static int client_encoding = -1; static void (*client_to_mic) ();/* something to MIC */ @@ -266,10 +268,10 @@ GetDatabaseEncoding() } /* for builtin-function */ -const char * -getdatabaseencoding() +Datum +getdatabaseencoding(PG_FUNCTION_ARGS) { - return (pg_encoding_to_char(DatabaseEncoding)); + PG_RETURN_NAME(pg_encoding_to_char(DatabaseEncoding)); } /* set and get template1 database encoding */ diff --git a/src/include/access/gist.h b/src/include/access/gist.h index 8c3c7a75fd..dd8f557e9b 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -182,14 +182,9 @@ typedef struct intrange int flag; } INTRANGE; -extern void gistbuild(Relation heap, - Relation index, int natts, - AttrNumber *attnum, IndexStrategy istrat, - uint16 pint, Datum *params, - FuncIndexInfo *finfo, - PredInfo *predInfo); -extern InsertIndexResult gistinsert(Relation r, Datum *datum, - char *nulls, ItemPointer ht_ctid, Relation heapRel); +extern Datum gistbuild(PG_FUNCTION_ARGS); +extern Datum gistinsert(PG_FUNCTION_ARGS); +extern Datum gistdelete(PG_FUNCTION_ARGS); extern void _gistdump(Relation r); extern void gistfreestack(GISTSTACK *s); extern void initGISTstate(GISTSTATE *giststate, Relation index); @@ -198,6 +193,6 @@ extern void gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, extern StrategyNumber RelationGetGISTStrategy(Relation, AttrNumber, RegProcedure); /* gistget.c */ -extern RetrieveIndexResult gistgettuple(IndexScanDesc s, ScanDirection dir); +extern Datum gistgettuple(PG_FUNCTION_ARGS); #endif /* GIST_H */ diff --git a/src/include/access/gistscan.h b/src/include/access/gistscan.h index ef55ab3951..98498965f7 100644 --- a/src/include/access/gistscan.h +++ b/src/include/access/gistscan.h @@ -10,15 +10,15 @@ *------------------------------------------------------------------------- */ #ifndef GISTSCAN_H +#define GISTSCAN_H #include "access/relscan.h" -extern IndexScanDesc gistbeginscan(Relation r, bool fromEnd, - uint16 nkeys, ScanKey key); -extern void gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key); -extern void gistmarkpos(IndexScanDesc s); -extern void gistrestrpos(IndexScanDesc s); -extern void gistendscan(IndexScanDesc s); +extern Datum gistbeginscan(PG_FUNCTION_ARGS); +extern Datum gistrescan(PG_FUNCTION_ARGS); +extern Datum gistmarkpos(PG_FUNCTION_ARGS); +extern Datum gistrestrpos(PG_FUNCTION_ARGS); +extern Datum gistendscan(PG_FUNCTION_ARGS); extern void gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum); #endif /* GISTSCAN_H */ diff --git a/src/include/access/hash.h b/src/include/access/hash.h index 06c0fda959..294531fdb3 100644 --- a/src/include/access/hash.h +++ b/src/include/access/hash.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: hash.h,v 1.32 2000/06/05 07:28:57 tgl Exp $ + * $Id: hash.h,v 1.33 2000/06/13 07:35:17 tgl Exp $ * * NOTES * modeled after Margo Seltzer's hash implementation for unix. @@ -248,19 +248,15 @@ typedef HashItemData *HashItem; /* public routines */ -extern void hashbuild(Relation heap, Relation index, int natts, - AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, - Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); -extern InsertIndexResult hashinsert(Relation rel, Datum *datum, char *nulls, - ItemPointer ht_ctid, Relation heapRel); -extern char *hashgettuple(IndexScanDesc scan, ScanDirection dir); -extern char *hashbeginscan(Relation rel, bool fromEnd, uint16 keysz, - ScanKey scankey); -extern void hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey); -extern void hashendscan(IndexScanDesc scan); -extern void hashmarkpos(IndexScanDesc scan); -extern void hashrestrpos(IndexScanDesc scan); -extern void hashdelete(Relation rel, ItemPointer tid); +extern Datum hashbuild(PG_FUNCTION_ARGS); +extern Datum hashinsert(PG_FUNCTION_ARGS); +extern Datum hashgettuple(PG_FUNCTION_ARGS); +extern Datum hashbeginscan(PG_FUNCTION_ARGS); +extern Datum hashrescan(PG_FUNCTION_ARGS); +extern Datum hashendscan(PG_FUNCTION_ARGS); +extern Datum hashmarkpos(PG_FUNCTION_ARGS); +extern Datum hashrestrpos(PG_FUNCTION_ARGS); +extern Datum hashdelete(PG_FUNCTION_ARGS); /* * Datatype-specific hash functions in hashfunc.c. diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h index 5880a4047e..8dc3a162a3 100644 --- a/src/include/access/nbtree.h +++ b/src/include/access/nbtree.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: nbtree.h,v 1.36 2000/06/08 22:37:38 momjian Exp $ + * $Id: nbtree.h,v 1.37 2000/06/13 07:35:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -227,21 +227,16 @@ extern void _bt_pagedel(Relation rel, ItemPointer tid); */ extern bool BuildingBtree; /* in nbtree.c */ -extern void btbuild(Relation heap, Relation index, int natts, - AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, - Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); -extern InsertIndexResult btinsert(Relation rel, Datum *datum, char *nulls, - ItemPointer ht_ctid, Relation heapRel); -extern char *btgettuple(IndexScanDesc scan, ScanDirection dir); -extern char *btbeginscan(Relation rel, bool fromEnd, uint16 keysz, - ScanKey scankey); - -extern void btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey); +extern Datum btbuild(PG_FUNCTION_ARGS); +extern Datum btinsert(PG_FUNCTION_ARGS); +extern Datum btgettuple(PG_FUNCTION_ARGS); +extern Datum btbeginscan(PG_FUNCTION_ARGS); +extern Datum btrescan(PG_FUNCTION_ARGS); extern void btmovescan(IndexScanDesc scan, Datum v); -extern void btendscan(IndexScanDesc scan); -extern void btmarkpos(IndexScanDesc scan); -extern void btrestrpos(IndexScanDesc scan); -extern void btdelete(Relation rel, ItemPointer tid); +extern Datum btendscan(PG_FUNCTION_ARGS); +extern Datum btmarkpos(PG_FUNCTION_ARGS); +extern Datum btrestrpos(PG_FUNCTION_ARGS); +extern Datum btdelete(PG_FUNCTION_ARGS); /* * prototypes for functions in nbtscan.c diff --git a/src/include/access/rtree.h b/src/include/access/rtree.h index 06de77cf2c..c5e0967f57 100644 --- a/src/include/access/rtree.h +++ b/src/include/access/rtree.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: rtree.h,v 1.17 2000/01/26 05:57:51 momjian Exp $ + * $Id: rtree.h,v 1.18 2000/06/13 07:35:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -104,28 +104,21 @@ typedef RTreeScanOpaqueData *RTreeScanOpaque; /* defined in rtree.c */ extern void freestack(RTSTACK *s); -/* rget.c */ -extern RetrieveIndexResult rtgettuple(IndexScanDesc s, ScanDirection dir); - /* * RTree code. * Defined in access/index-rtree/ */ -extern InsertIndexResult rtinsert(Relation r, Datum *datum, char *nulls, - ItemPointer ht_ctid, Relation heapRel); -extern char *rtdelete(Relation r, ItemPointer tid); +extern Datum rtinsert(PG_FUNCTION_ARGS); +extern Datum rtdelete(PG_FUNCTION_ARGS); -extern RetrieveIndexResult rtgettuple(IndexScanDesc s, ScanDirection dir); -extern IndexScanDesc rtbeginscan(Relation r, bool fromEnd, uint16 nkeys, - ScanKey key); +extern Datum rtgettuple(PG_FUNCTION_ARGS); +extern Datum rtbeginscan(PG_FUNCTION_ARGS); -extern void rtendscan(IndexScanDesc s); -extern void rtmarkpos(IndexScanDesc s); -extern void rtrestrpos(IndexScanDesc s); -extern void rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key); -extern void rtbuild(Relation heap, Relation index, int natts, - AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, - Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); +extern Datum rtendscan(PG_FUNCTION_ARGS); +extern Datum rtmarkpos(PG_FUNCTION_ARGS); +extern Datum rtrestrpos(PG_FUNCTION_ARGS); +extern Datum rtrescan(PG_FUNCTION_ARGS); +extern Datum rtbuild(PG_FUNCTION_ARGS); extern void _rtdump(Relation r); /* rtscan.c */ diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index f15a07fe2b..fd099038a5 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -37,7 +37,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: catversion.h,v 1.30 2000/06/12 22:36:12 momjian Exp $ + * $Id: catversion.h,v 1.31 2000/06/13 07:35:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 200006121 +#define CATALOG_VERSION_NO 200006131 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index e870737bf2..acd9207239 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,12 +7,12 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pg_proc.h,v 1.138 2000/06/11 20:07:51 tgl Exp $ + * $Id: pg_proc.h,v 1.139 2000/06/13 07:35:19 tgl Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki * information from the DATA() statements. utils/Gen_fmgrtab.sh - * generates fmgr.h and fmgrtab.c the same way. + * generates fmgroids.h and fmgrtab.c the same way. * * XXX do NOT break up DATA() statements into multiple lines! * the scripts are not as smart as you might think... @@ -217,7 +217,7 @@ DESCR("btree cost estimator"); /* OIDS 100 - 199 */ -DATA(insert OID = 100 ( int8fac PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8fac - )); +DATA(insert OID = 100 ( int8fac PGUID 12 f t t t 1 f 20 "20" 100 0 0 100 int8fac - )); DESCR("factorial"); DATA(insert OID = 101 ( eqsel PGUID 12 f t f t 5 f 701 "26 26 21 0 23" 100 0 0 100 eqsel - )); DESCR("restriction selectivity of = and related operators"); @@ -412,7 +412,7 @@ DATA(insert OID = 197 ( rt_poly_union PGUID 11 f t t t 2 f 604 "604 604" 100 DESCR("r-tree"); DATA(insert OID = 198 ( rt_poly_inter PGUID 11 f t t t 2 f 604 "604 604" 100 0 0 100 rt_poly_inter - )); DESCR("r-tree"); -DATA(insert OID = 199 ( rt_poly_size PGUID 11 f t t t 2 f 23 "604 23" 100 0 0 100 rt_poly_size - )); +DATA(insert OID = 199 ( rt_poly_size PGUID 12 f t t t 2 f 23 "604 700" 100 0 0 100 rt_poly_size - )); DESCR("r-tree"); /* OIDS 200 - 299 */ @@ -662,51 +662,51 @@ DATA(insert OID = 314 ( int2 PGUID 12 f t t t 1 f 21 "23" 100 0 0 100 i DESCR("convert int4 to int2"); DATA(insert OID = 315 ( int2vectoreq PGUID 12 f t t t 2 f 16 "22 22" 100 0 0 100 int2vectoreq - )); DESCR("equal"); -DATA(insert OID = 316 ( float8 PGUID 11 f t t t 1 f 701 "23" 100 0 0 100 i4tod - )); +DATA(insert OID = 316 ( float8 PGUID 12 f t t t 1 f 701 "23" 100 0 0 100 i4tod - )); DESCR("convert int4 to float8"); DATA(insert OID = 317 ( int4 PGUID 11 f t t t 1 f 23 "701" 100 0 0 100 dtoi4 - )); DESCR("convert float8 to int4"); -DATA(insert OID = 318 ( float4 PGUID 11 f t t t 1 f 700 "23" 100 0 0 100 i4tof - )); +DATA(insert OID = 318 ( float4 PGUID 12 f t t t 1 f 700 "23" 100 0 0 100 i4tof - )); DESCR("convert int4 to float4"); DATA(insert OID = 319 ( int4 PGUID 11 f t t t 1 f 23 "700" 100 0 0 100 ftoi4 - )); DESCR("convert float4 to int4"); -DATA(insert OID = 320 ( rtinsert PGUID 11 f t f t 5 f 23 "0" 100 0 0 100 rtinsert - )); +DATA(insert OID = 320 ( rtinsert PGUID 12 f t f t 5 f 23 "0 0 0 0 0" 100 0 0 100 rtinsert - )); DESCR("r-tree(internal)"); -DATA(insert OID = 321 ( rtdelete PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 rtdelete - )); +DATA(insert OID = 321 ( rtdelete PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 rtdelete - )); DESCR("r-tree(internal)"); -DATA(insert OID = 322 ( rtgettuple PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 rtgettuple - )); +DATA(insert OID = 322 ( rtgettuple PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 rtgettuple - )); DESCR("r-tree(internal)"); -DATA(insert OID = 323 ( rtbuild PGUID 11 f t f t 9 f 23 "0" 100 0 0 100 rtbuild - )); +DATA(insert OID = 323 ( rtbuild PGUID 12 f t f t 9 f 23 "0 0 0 0 0 0 0 0 0" 100 0 0 100 rtbuild - )); DESCR("r-tree(internal)"); -DATA(insert OID = 324 ( rtbeginscan PGUID 11 f t f t 4 f 23 "0" 100 0 0 100 rtbeginscan - )); +DATA(insert OID = 324 ( rtbeginscan PGUID 12 f t f t 4 f 23 "0 0 0 0" 100 0 0 100 rtbeginscan - )); DESCR("r-tree(internal)"); -DATA(insert OID = 325 ( rtendscan PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 rtendscan - )); +DATA(insert OID = 325 ( rtendscan PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 rtendscan - )); DESCR("r-tree(internal)"); -DATA(insert OID = 326 ( rtmarkpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 rtmarkpos - )); +DATA(insert OID = 326 ( rtmarkpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 rtmarkpos - )); DESCR("r-tree(internal)"); -DATA(insert OID = 327 ( rtrestrpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 rtrestrpos - )); +DATA(insert OID = 327 ( rtrestrpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 rtrestrpos - )); DESCR("r-tree(internal)"); -DATA(insert OID = 328 ( rtrescan PGUID 11 f t f t 3 f 23 "0" 100 0 0 100 rtrescan - )); +DATA(insert OID = 328 ( rtrescan PGUID 12 f t f t 3 f 23 "0 0 0" 100 0 0 100 rtrescan - )); DESCR("r-tree(internal)"); -DATA(insert OID = 330 ( btgettuple PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 btgettuple - )); +DATA(insert OID = 330 ( btgettuple PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 btgettuple - )); DESCR("btree(internal)"); -DATA(insert OID = 331 ( btinsert PGUID 11 f t f t 5 f 23 "0" 100 0 0 100 btinsert - )); +DATA(insert OID = 331 ( btinsert PGUID 12 f t f t 5 f 23 "0 0 0 0 0" 100 0 0 100 btinsert - )); DESCR("btree(internal)"); -DATA(insert OID = 332 ( btdelete PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 btdelete - )); +DATA(insert OID = 332 ( btdelete PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 btdelete - )); DESCR("btree(internal)"); -DATA(insert OID = 333 ( btbeginscan PGUID 11 f t f t 4 f 23 "0" 100 0 0 100 btbeginscan - )); +DATA(insert OID = 333 ( btbeginscan PGUID 12 f t f t 4 f 23 "0 0 0 0" 100 0 0 100 btbeginscan - )); DESCR("btree(internal)"); -DATA(insert OID = 334 ( btrescan PGUID 11 f t f t 3 f 23 "0" 100 0 0 100 btrescan - )); +DATA(insert OID = 334 ( btrescan PGUID 12 f t f t 3 f 23 "0 0 0" 100 0 0 100 btrescan - )); DESCR("btree(internal)"); -DATA(insert OID = 335 ( btendscan PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 btendscan - )); +DATA(insert OID = 335 ( btendscan PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 btendscan - )); DESCR("btree(internal)"); -DATA(insert OID = 336 ( btmarkpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 btmarkpos - )); +DATA(insert OID = 336 ( btmarkpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 btmarkpos - )); DESCR("btree(internal)"); -DATA(insert OID = 337 ( btrestrpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 btrestrpos - )); +DATA(insert OID = 337 ( btrestrpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 btrestrpos - )); DESCR("btree(internal)"); -DATA(insert OID = 338 ( btbuild PGUID 11 f t f t 9 f 23 "0" 100 0 0 100 btbuild - )); +DATA(insert OID = 338 ( btbuild PGUID 12 f t f t 9 f 23 "0 0 0 0 0 0 0 0 0" 100 0 0 100 btbuild - )); DESCR("btree(internal)"); DATA(insert OID = 339 ( poly_same PGUID 11 f t t t 2 f 16 "604 604" 100 0 1 0 poly_same - )); @@ -798,23 +798,23 @@ DESCR("convert char() to name"); DATA(insert OID = 438 ( hashcostestimate PGUID 12 f t f t 7 f 0 "0 0 0 0 0 0 0" 100 0 0 100 hashcostestimate - )); DESCR("hash index cost estimator"); -DATA(insert OID = 440 ( hashgettuple PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 hashgettuple - )); +DATA(insert OID = 440 ( hashgettuple PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 hashgettuple - )); DESCR("hash(internal)"); -DATA(insert OID = 441 ( hashinsert PGUID 11 f t f t 5 f 23 "0" 100 0 0 100 hashinsert - )); +DATA(insert OID = 441 ( hashinsert PGUID 12 f t f t 5 f 23 "0 0 0 0 0" 100 0 0 100 hashinsert - )); DESCR("hash(internal)"); -DATA(insert OID = 442 ( hashdelete PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 hashdelete - )); +DATA(insert OID = 442 ( hashdelete PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 hashdelete - )); DESCR("hash(internal)"); -DATA(insert OID = 443 ( hashbeginscan PGUID 11 f t f t 4 f 23 "0" 100 0 0 100 hashbeginscan - )); +DATA(insert OID = 443 ( hashbeginscan PGUID 12 f t f t 4 f 23 "0 0 0 0" 100 0 0 100 hashbeginscan - )); DESCR("hash(internal)"); -DATA(insert OID = 444 ( hashrescan PGUID 11 f t f t 3 f 23 "0" 100 0 0 100 hashrescan - )); +DATA(insert OID = 444 ( hashrescan PGUID 12 f t f t 3 f 23 "0 0 0" 100 0 0 100 hashrescan - )); DESCR("hash(internal)"); -DATA(insert OID = 445 ( hashendscan PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 hashendscan - )); +DATA(insert OID = 445 ( hashendscan PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 hashendscan - )); DESCR("hash(internal)"); -DATA(insert OID = 446 ( hashmarkpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 hashmarkpos - )); +DATA(insert OID = 446 ( hashmarkpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 hashmarkpos - )); DESCR("hash(internal)"); -DATA(insert OID = 447 ( hashrestrpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 hashrestrpos - )); +DATA(insert OID = 447 ( hashrestrpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 hashrestrpos - )); DESCR("hash(internal)"); -DATA(insert OID = 448 ( hashbuild PGUID 11 f t f t 9 f 23 "0" 100 0 0 100 hashbuild - )); +DATA(insert OID = 448 ( hashbuild PGUID 12 f t f t 9 f 23 "0 0 0 0 0 0 0 0 0" 100 0 0 100 hashbuild - )); DESCR("hash(internal)"); DATA(insert OID = 449 ( hashint2 PGUID 12 f t t t 1 f 23 "21" 100 0 0 100 hashint2 - )); DESCR("hash"); @@ -841,53 +841,53 @@ DESCR("larger of two"); DATA(insert OID = 459 ( text_smaller PGUID 11 f t t t 2 f 25 "25 25" 100 0 0 100 text_smaller - )); DESCR("smaller of two"); -DATA(insert OID = 460 ( int8in PGUID 11 f t t t 1 f 20 "0" 100 0 0 100 int8in - )); +DATA(insert OID = 460 ( int8in PGUID 12 f t t t 1 f 20 "0" 100 0 0 100 int8in - )); DESCR("(internal)"); -DATA(insert OID = 461 ( int8out PGUID 11 f t t t 1 f 23 "0" 100 0 0 100 int8out - )); +DATA(insert OID = 461 ( int8out PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 int8out - )); DESCR("(internal)"); -DATA(insert OID = 462 ( int8um PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8um - )); +DATA(insert OID = 462 ( int8um PGUID 12 f t t t 1 f 20 "20" 100 0 0 100 int8um - )); DESCR("negate"); -DATA(insert OID = 463 ( int8pl PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8pl - )); +DATA(insert OID = 463 ( int8pl PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8pl - )); DESCR("addition"); -DATA(insert OID = 464 ( int8mi PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8mi - )); +DATA(insert OID = 464 ( int8mi PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8mi - )); DESCR("subtraction"); -DATA(insert OID = 465 ( int8mul PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8mul - )); +DATA(insert OID = 465 ( int8mul PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8mul - )); DESCR("multiply"); -DATA(insert OID = 466 ( int8div PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8div - )); +DATA(insert OID = 466 ( int8div PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8div - )); DESCR("divide"); -DATA(insert OID = 467 ( int8eq PGUID 11 f t t t 2 f 16 "20 20" 100 0 0 100 int8eq - )); +DATA(insert OID = 467 ( int8eq PGUID 12 f t t t 2 f 16 "20 20" 100 0 0 100 int8eq - )); DESCR("equal"); -DATA(insert OID = 468 ( int8ne PGUID 11 f t t t 2 f 16 "20 20" 100 0 0 100 int8ne - )); +DATA(insert OID = 468 ( int8ne PGUID 12 f t t t 2 f 16 "20 20" 100 0 0 100 int8ne - )); DESCR("not equal"); -DATA(insert OID = 469 ( int8lt PGUID 11 f t t t 2 f 16 "20 20" 100 0 0 100 int8lt - )); +DATA(insert OID = 469 ( int8lt PGUID 12 f t t t 2 f 16 "20 20" 100 0 0 100 int8lt - )); DESCR("less-than"); -DATA(insert OID = 470 ( int8gt PGUID 11 f t t t 2 f 16 "20 20" 100 0 0 100 int8gt - )); +DATA(insert OID = 470 ( int8gt PGUID 12 f t t t 2 f 16 "20 20" 100 0 0 100 int8gt - )); DESCR("greater-than"); -DATA(insert OID = 471 ( int8le PGUID 11 f t t t 2 f 16 "20 20" 100 0 0 100 int8le - )); +DATA(insert OID = 471 ( int8le PGUID 12 f t t t 2 f 16 "20 20" 100 0 0 100 int8le - )); DESCR("less-than-or-equal"); -DATA(insert OID = 472 ( int8ge PGUID 11 f t t t 2 f 16 "20 20" 100 0 0 100 int8ge - )); +DATA(insert OID = 472 ( int8ge PGUID 12 f t t t 2 f 16 "20 20" 100 0 0 100 int8ge - )); DESCR("greater-than-or-equal"); -DATA(insert OID = 474 ( int84eq PGUID 11 f t t t 2 f 16 "20 23" 100 0 0 100 int84eq - )); +DATA(insert OID = 474 ( int84eq PGUID 12 f t t t 2 f 16 "20 23" 100 0 0 100 int84eq - )); DESCR("equal"); -DATA(insert OID = 475 ( int84ne PGUID 11 f t t t 2 f 16 "20 23" 100 0 0 100 int84ne - )); +DATA(insert OID = 475 ( int84ne PGUID 12 f t t t 2 f 16 "20 23" 100 0 0 100 int84ne - )); DESCR("not equal"); -DATA(insert OID = 476 ( int84lt PGUID 11 f t t t 2 f 16 "20 23" 100 0 0 100 int84lt - )); +DATA(insert OID = 476 ( int84lt PGUID 12 f t t t 2 f 16 "20 23" 100 0 0 100 int84lt - )); DESCR("less-than"); -DATA(insert OID = 477 ( int84gt PGUID 11 f t t t 2 f 16 "20 23" 100 0 0 100 int84gt - )); +DATA(insert OID = 477 ( int84gt PGUID 12 f t t t 2 f 16 "20 23" 100 0 0 100 int84gt - )); DESCR("greater-than"); -DATA(insert OID = 478 ( int84le PGUID 11 f t t t 2 f 16 "20 23" 100 0 0 100 int84le - )); +DATA(insert OID = 478 ( int84le PGUID 12 f t t t 2 f 16 "20 23" 100 0 0 100 int84le - )); DESCR("less-than-or-equal"); -DATA(insert OID = 479 ( int84ge PGUID 11 f t t t 2 f 16 "20 23" 100 0 0 100 int84ge - )); +DATA(insert OID = 479 ( int84ge PGUID 12 f t t t 2 f 16 "20 23" 100 0 0 100 int84ge - )); DESCR("greater-than-or-equal"); -DATA(insert OID = 480 ( int4 PGUID 11 f t t t 1 f 23 "20" 100 0 0 100 int84 - )); +DATA(insert OID = 480 ( int4 PGUID 12 f t t t 1 f 23 "20" 100 0 0 100 int84 - )); DESCR("convert int8 to int4"); -DATA(insert OID = 481 ( int8 PGUID 11 f t t t 1 f 20 "23" 100 0 0 100 int48 - )); +DATA(insert OID = 481 ( int8 PGUID 12 f t t t 1 f 20 "23" 100 0 0 100 int48 - )); DESCR("convert int4 to int8"); -DATA(insert OID = 482 ( float8 PGUID 11 f t t t 1 f 701 "20" 100 0 0 100 i8tod - )); +DATA(insert OID = 482 ( float8 PGUID 12 f t t t 1 f 701 "20" 100 0 0 100 i8tod - )); DESCR("convert int8 to float8"); -DATA(insert OID = 483 ( int8 PGUID 11 f t t t 1 f 20 "701" 100 0 0 100 dtoi8 - )); +DATA(insert OID = 483 ( int8 PGUID 12 f t t t 1 f 20 "701" 100 0 0 100 dtoi8 - )); DESCR("convert float8 to int8"); /* OIDS 500 - 599 */ @@ -913,10 +913,10 @@ DESCR("greater-than-or-equal"); DATA(insert OID = 659 ( namene PGUID 11 f t t t 2 f 16 "19 19" 100 0 0 100 namene - )); DESCR("not equal"); -DATA(insert OID = 668 ( bpchar PGUID 11 f t t t 2 f 1042 "1042 23" 100 0 0 100 bpchar - )); -DESCR("truncate char()"); -DATA(insert OID = 669 ( varchar PGUID 11 f t t t 2 f 1043 "1043 23" 100 0 0 100 varchar - )); -DESCR("truncate varchar()"); +DATA(insert OID = 668 ( bpchar PGUID 12 f t t t 2 f 1042 "1042 23" 100 0 0 100 bpchar - )); +DESCR("adjust char() to typmod length"); +DATA(insert OID = 669 ( varchar PGUID 12 f t t t 2 f 1043 "1043 23" 100 0 0 100 varchar - )); +DESCR("adjust varchar() to typmod length"); DATA(insert OID = 676 ( mktinterval PGUID 12 f t f t 2 f 704 "702 702" 100 0 0 100 mktinterval - )); DESCR("convert to tinterval"); @@ -949,13 +949,13 @@ DESCR("equal"); DATA(insert OID = 720 ( octet_length PGUID 11 f t t t 1 f 23 "17" 100 0 0 100 byteaoctetlen - )); DESCR(""); -DATA(insert OID = 721 ( get_byte PGUID 11 f t t t 2 f 23 "17 23" 100 0 0 100 byteaGetByte - )); +DATA(insert OID = 721 ( get_byte PGUID 12 f t t t 2 f 23 "17 23" 100 0 0 100 byteaGetByte - )); DESCR(""); -DATA(insert OID = 722 ( set_byte PGUID 11 f t t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetByte - )); +DATA(insert OID = 722 ( set_byte PGUID 12 f t t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetByte - )); DESCR(""); -DATA(insert OID = 723 ( get_bit PGUID 11 f t t t 2 f 23 "17 23" 100 0 0 100 byteaGetBit - )); +DATA(insert OID = 723 ( get_bit PGUID 12 f t t t 2 f 23 "17 23" 100 0 0 100 byteaGetBit - )); DESCR(""); -DATA(insert OID = 724 ( set_bit PGUID 11 f t t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetBit - )); +DATA(insert OID = 724 ( set_bit PGUID 12 f t t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetBit - )); DESCR(""); DATA(insert OID = 725 ( dist_pl PGUID 11 f t t t 2 f 701 "600 628" 100 0 0 100 dist_pl - )); @@ -981,26 +981,18 @@ DESCR("greater-than"); DATA(insert OID = 743 ( text_ge PGUID 11 f t t t 2 f 16 "25 25" 100 0 0 0 text_ge - )); DESCR("greater-than-or-equal"); -DATA(insert OID = 744 ( array_eq PGUID 11 f t t t 2 f 16 "0 0" 100 0 0 100 array_eq -)); -DESCR("equal"); -DATA(insert OID = 745 ( array_assgn PGUID 11 f t t t 8 f 23 "0 23 0 0 0 23 23 0" 100 0 0 100 array_assgn -)); +DATA(insert OID = 744 ( array_eq PGUID 12 f t t t 2 f 16 "0 0" 100 0 0 100 array_eq -)); +DESCR("array equal"); +DATA(insert OID = 747 ( array_dims PGUID 12 f t t t 1 f 25 "0" 100 0 0 100 array_dims -)); +DESCR("array dimensions"); +DATA(insert OID = 750 ( array_in PGUID 12 f t t t 3 f 23 "0 26 23" 100 0 0 100 array_in - )); DESCR("array"); -DATA(insert OID = 746 ( array_clip PGUID 11 f t t t 7 f 23 "0 23 0 0 23 23 0" 100 0 0 100 array_clip -)); -DESCR("array"); -DATA(insert OID = 747 ( array_dims PGUID 11 f t t t 1 f 25 "0" 100 0 0 100 array_dims -)); -DESCR("array(internal)"); -DATA(insert OID = 748 ( array_set PGUID 11 f t t t 8 f 23 "0 23 0 0 23 23 23 0" 100 0 0 100 array_set -)); -DESCR("array"); -DATA(insert OID = 749 ( array_ref PGUID 11 f t t t 7 f 23 "0 23 0 23 23 23 0" 100 0 0 100 array_ref -)); -DESCR("array"); -DATA(insert OID = 750 ( array_in PGUID 11 f t t t 3 f 23 "0 0 23" 100 0 0 100 array_in - )); -DESCR("array"); -DATA(insert OID = 751 ( array_out PGUID 11 f t t t 2 f 23 "0 0" 100 0 0 100 array_out - )); +DATA(insert OID = 751 ( array_out PGUID 12 f t t t 2 f 23 "0 26" 100 0 0 100 array_out - )); DESCR("array"); DATA(insert OID = 752 ( filename_in PGUID 11 f t t t 1 f 605 "0" 100 0 0 100 filename_in - )); DESCR("(internal)"); -DATA(insert OID = 753 ( filename_out PGUID 11 f t t t 2 f 23 "0 0" 100 0 0 100 filename_out - )); +DATA(insert OID = 753 ( filename_out PGUID 11 f t t t 2 f 23 "0 26" 100 0 0 100 filename_out - )); DESCR("(internal)"); DATA(insert OID = 760 ( smgrin PGUID 12 f t f t 1 f 210 "0" 100 0 0 100 smgrin - )); @@ -1032,23 +1024,23 @@ DESCR("smaller of two"); DATA(insert OID = 772 ( gistcostestimate PGUID 12 f t f t 7 f 0 "0 0 0 0 0 0 0" 100 0 0 100 gistcostestimate - )); DESCR("gist cost estimator"); -DATA(insert OID = 774 ( gistgettuple PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 gistgettuple - )); +DATA(insert OID = 774 ( gistgettuple PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 gistgettuple - )); DESCR("gist(internal)"); -DATA(insert OID = 775 ( gistinsert PGUID 11 f t f t 5 f 23 "0" 100 0 0 100 gistinsert - )); +DATA(insert OID = 775 ( gistinsert PGUID 12 f t f t 5 f 23 "0 0 0 0 0" 100 0 0 100 gistinsert - )); DESCR("gist(internal)"); -DATA(insert OID = 776 ( gistdelete PGUID 11 f t f t 2 f 23 "0" 100 0 0 100 gistdelete - )); +DATA(insert OID = 776 ( gistdelete PGUID 12 f t f t 2 f 23 "0 0" 100 0 0 100 gistdelete - )); DESCR("gist(internal)"); -DATA(insert OID = 777 ( gistbeginscan PGUID 11 f t f t 4 f 23 "0" 100 0 0 100 gistbeginscan - )); +DATA(insert OID = 777 ( gistbeginscan PGUID 12 f t f t 4 f 23 "0 0 0 0" 100 0 0 100 gistbeginscan - )); DESCR("gist(internal)"); -DATA(insert OID = 778 ( gistrescan PGUID 11 f t f t 3 f 23 "0" 100 0 0 100 gistrescan - )); +DATA(insert OID = 778 ( gistrescan PGUID 12 f t f t 3 f 23 "0 0 0" 100 0 0 100 gistrescan - )); DESCR("gist(internal)"); -DATA(insert OID = 779 ( gistendscan PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 gistendscan - )); +DATA(insert OID = 779 ( gistendscan PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 gistendscan - )); DESCR("gist(internal)"); -DATA(insert OID = 780 ( gistmarkpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 gistmarkpos - )); +DATA(insert OID = 780 ( gistmarkpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 gistmarkpos - )); DESCR("gist(internal)"); -DATA(insert OID = 781 ( gistrestrpos PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 gistrestrpos - )); +DATA(insert OID = 781 ( gistrestrpos PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 gistrestrpos - )); DESCR("gist(internal)"); -DATA(insert OID = 782 ( gistbuild PGUID 11 f t f t 9 f 23 "0" 100 0 0 100 gistbuild - )); +DATA(insert OID = 782 ( gistbuild PGUID 12 f t f t 9 f 23 "0 0 0 0 0 0 0 0 0" 100 0 0 100 gistbuild - )); DESCR("gist(internal)"); DATA(insert OID = 784 ( tintervaleq PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervaleq - )); @@ -1096,17 +1088,17 @@ DESCR("matches LIKE expression"); DATA(insert OID = 851 ( textnlike PGUID 11 f t t t 2 f 16 "25 25" 100 0 1 0 textnlike - )); DESCR("does not match LIKE expression"); -DATA(insert OID = 852 ( int48eq PGUID 11 f t t t 2 f 16 "23 20" 100 0 0 100 int48eq - )); +DATA(insert OID = 852 ( int48eq PGUID 12 f t t t 2 f 16 "23 20" 100 0 0 100 int48eq - )); DESCR("equal"); -DATA(insert OID = 853 ( int48ne PGUID 11 f t t t 2 f 16 "23 20" 100 0 0 100 int48ne - )); +DATA(insert OID = 853 ( int48ne PGUID 12 f t t t 2 f 16 "23 20" 100 0 0 100 int48ne - )); DESCR("not equal"); -DATA(insert OID = 854 ( int48lt PGUID 11 f t t t 2 f 16 "23 20" 100 0 0 100 int48lt - )); +DATA(insert OID = 854 ( int48lt PGUID 12 f t t t 2 f 16 "23 20" 100 0 0 100 int48lt - )); DESCR("less-than"); -DATA(insert OID = 855 ( int48gt PGUID 11 f t t t 2 f 16 "23 20" 100 0 0 100 int48gt - )); +DATA(insert OID = 855 ( int48gt PGUID 12 f t t t 2 f 16 "23 20" 100 0 0 100 int48gt - )); DESCR("greater-than"); -DATA(insert OID = 856 ( int48le PGUID 11 f t t t 2 f 16 "23 20" 100 0 0 100 int48le - )); +DATA(insert OID = 856 ( int48le PGUID 12 f t t t 2 f 16 "23 20" 100 0 0 100 int48le - )); DESCR("less-than-or-equal"); -DATA(insert OID = 857 ( int48ge PGUID 11 f t t t 2 f 16 "23 20" 100 0 0 100 int48ge - )); +DATA(insert OID = 857 ( int48ge PGUID 12 f t t t 2 f 16 "23 20" 100 0 0 100 int48ge - )); DESCR("greater-than-or-equal"); DATA(insert OID = 858 ( namelike PGUID 11 f t t t 2 f 16 "19 25" 100 0 0 100 namelike - )); @@ -1119,13 +1111,13 @@ DESCR("convert char to char()"); DATA(insert OID = 861 ( char PGUID 12 f t t t 1 f 18 "1042" 100 0 0 100 bpchar_char - )); DESCR("convert char() to char"); -DATA(insert OID = 862 ( int4_mul_cash PGUID 11 f t t t 2 f 790 "23 790" 100 0 0 100 int4_mul_cash - )); +DATA(insert OID = 862 ( int4_mul_cash PGUID 12 f t t t 2 f 790 "23 790" 100 0 0 100 int4_mul_cash - )); DESCR("multiply"); DATA(insert OID = 863 ( int2_mul_cash PGUID 12 f t t t 2 f 790 "21 790" 100 0 0 100 int2_mul_cash - )); DESCR("multiply"); -DATA(insert OID = 864 ( cash_mul_int4 PGUID 11 f t t t 2 f 790 "790 23" 100 0 0 100 cash_mul_int4 - )); +DATA(insert OID = 864 ( cash_mul_int4 PGUID 12 f t t t 2 f 790 "790 23" 100 0 0 100 cash_mul_int4 - )); DESCR("multiply"); -DATA(insert OID = 865 ( cash_div_int4 PGUID 11 f t t t 2 f 790 "790 23" 100 0 0 100 cash_div_int4 - )); +DATA(insert OID = 865 ( cash_div_int4 PGUID 12 f t t t 2 f 790 "790 23" 100 0 0 100 cash_div_int4 - )); DESCR("divide"); DATA(insert OID = 866 ( cash_mul_int2 PGUID 12 f t t t 2 f 790 "790 21" 100 0 0 100 cash_mul_int2 - )); DESCR("multiply"); @@ -1187,9 +1179,9 @@ DESCR("modulus"); DATA(insert OID = 943 ( mod PGUID 12 f t t t 2 f 23 "23 21" 100 0 0 100 int42mod - )); DESCR("modulus"); -DATA(insert OID = 945 ( int8mod PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8mod - )); +DATA(insert OID = 945 ( int8mod PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8mod - )); DESCR("modulus"); -DATA(insert OID = 947 ( mod PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8mod - )); +DATA(insert OID = 947 ( mod PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8mod - )); DESCR("modulus"); DATA(insert OID = 944 ( char PGUID 12 f t t t 1 f 18 "25" 100 0 0 100 text_char - )); @@ -1304,13 +1296,13 @@ DATA(insert OID = 1037 ( aclcontains PGUID 11 f t f t 2 f 16 "1034 1033" 100 DESCR("matches regex., case-sensitive"); DATA(insert OID = 1038 ( seteval PGUID 12 f t f t 1 f 23 "26" 100 0 0 100 seteval - )); DESCR(""); -DATA(insert OID = 1044 ( bpcharin PGUID 11 f t t t 3 f 1042 "0 0 23" 100 0 0 100 bpcharin - )); +DATA(insert OID = 1044 ( bpcharin PGUID 12 f t t t 3 f 1042 "0 26 23" 100 0 0 100 bpcharin - )); DESCR("(internal)"); -DATA(insert OID = 1045 ( bpcharout PGUID 11 f t t t 1 f 23 "0" 100 0 0 100 bpcharout - )); +DATA(insert OID = 1045 ( bpcharout PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 bpcharout - )); DESCR("(internal)"); -DATA(insert OID = 1046 ( varcharin PGUID 11 f t t t 3 f 1043 "0 0 23" 100 0 0 100 varcharin - )); +DATA(insert OID = 1046 ( varcharin PGUID 12 f t t t 3 f 1043 "0 26 23" 100 0 0 100 varcharin - )); DESCR("(internal)"); -DATA(insert OID = 1047 ( varcharout PGUID 11 f t t t 1 f 23 "0" 100 0 0 100 varcharout - )); +DATA(insert OID = 1047 ( varcharout PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 varcharout - )); DESCR("(internal)"); DATA(insert OID = 1048 ( bpchareq PGUID 11 f t t t 2 f 16 "1042 1042" 100 0 0 100 bpchareq - )); DESCR("equal"); @@ -1500,12 +1492,12 @@ DESCR("truncate timestamp to specified units"); DATA(insert OID = 1218 ( date_trunc PGUID 12 f t f t 2 f 1186 "25 1186" 100 0 0 100 interval_trunc - )); DESCR("truncate interval to specified units"); -DATA(insert OID = 1230 ( int8abs PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8abs - )); +DATA(insert OID = 1230 ( int8abs PGUID 12 f t t t 1 f 20 "20" 100 0 0 100 int8abs - )); DESCR("absolute value"); -DATA(insert OID = 1236 ( int8larger PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8larger - )); +DATA(insert OID = 1236 ( int8larger PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8larger - )); DESCR("larger of two"); -DATA(insert OID = 1237 ( int8smaller PGUID 11 f t t t 2 f 20 "20 20" 100 0 0 100 int8smaller - )); +DATA(insert OID = 1237 ( int8smaller PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8smaller - )); DESCR("smaller of two"); DATA(insert OID = 1238 ( texticregexeq PGUID 11 f t t t 2 f 16 "25 25" 100 0 1 0 texticregexeq - )); @@ -1530,32 +1522,32 @@ DESCR("SQL92 interval comparison"); DATA(insert OID = 1272 ( datetime_pl PGUID 12 f t f t 2 f 1184 "1082 1083" 100 0 0 100 datetime_timestamp - )); DESCR("convert date and time to timestamp"); -DATA(insert OID = 1274 ( int84pl PGUID 11 f t t t 2 f 20 "20 23" 100 0 0 100 int84pl - )); +DATA(insert OID = 1274 ( int84pl PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100 int84pl - )); DESCR("addition"); -DATA(insert OID = 1275 ( int84mi PGUID 11 f t t t 2 f 20 "20 23" 100 0 0 100 int84mi - )); +DATA(insert OID = 1275 ( int84mi PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100 int84mi - )); DESCR("subtraction"); -DATA(insert OID = 1276 ( int84mul PGUID 11 f t t t 2 f 20 "20 23" 100 0 0 100 int84mul - )); +DATA(insert OID = 1276 ( int84mul PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100 int84mul - )); DESCR("multiply"); -DATA(insert OID = 1277 ( int84div PGUID 11 f t t t 2 f 20 "20 23" 100 0 0 100 int84div - )); +DATA(insert OID = 1277 ( int84div PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100 int84div - )); DESCR("divide"); -DATA(insert OID = 1278 ( int48pl PGUID 11 f t t t 2 f 20 "23 20" 100 0 0 100 int48pl - )); +DATA(insert OID = 1278 ( int48pl PGUID 12 f t t t 2 f 20 "23 20" 100 0 0 100 int48pl - )); DESCR("addition"); -DATA(insert OID = 1279 ( int48mi PGUID 11 f t t t 2 f 20 "23 20" 100 0 0 100 int48mi - )); +DATA(insert OID = 1279 ( int48mi PGUID 12 f t t t 2 f 20 "23 20" 100 0 0 100 int48mi - )); DESCR("subtraction"); -DATA(insert OID = 1280 ( int48mul PGUID 11 f t t t 2 f 20 "23 20" 100 0 0 100 int48mul - )); +DATA(insert OID = 1280 ( int48mul PGUID 12 f t t t 2 f 20 "23 20" 100 0 0 100 int48mul - )); DESCR("multiply"); -DATA(insert OID = 1281 ( int48div PGUID 11 f t t t 2 f 20 "23 20" 100 0 0 100 int48div - )); +DATA(insert OID = 1281 ( int48div PGUID 12 f t t t 2 f 20 "23 20" 100 0 0 100 int48div - )); DESCR("divide"); -DATA(insert OID = 1288 ( text PGUID 11 f t t t 1 f 25 "20" 100 0 0 100 int8_text - )); +DATA(insert OID = 1288 ( text PGUID 12 f t t t 1 f 25 "20" 100 0 0 100 int8_text - )); DESCR("convert int8 to text"); -DATA(insert OID = 1289 ( int8 PGUID 11 f t t t 1 f 20 "25" 100 0 0 100 text_int8 - )); +DATA(insert OID = 1289 ( int8 PGUID 12 f t t t 1 f 20 "25" 100 0 0 100 text_int8 - )); DESCR("convert text to int8"); -DATA(insert OID = 1290 ( _bpchar PGUID 11 f t t t 2 f 1014 "1014 23" 100 0 0 100 _bpchar - )); -DESCR("truncate _char()"); -DATA(insert OID = 1291 ( _varchar PGUID 11 f t t t 2 f 1015 "1015 23" 100 0 0 100 _varchar - )); -DESCR("truncate _varchar()"); +DATA(insert OID = 1290 ( _bpchar PGUID 12 f t t t 2 f 1014 "1014 23" 100 0 0 100 _bpchar - )); +DESCR("adjust char()[] to typmod length"); +DATA(insert OID = 1291 ( _varchar PGUID 12 f t t t 2 f 1015 "1015 23" 100 0 0 100 _varchar - )); +DESCR("adjust varchar()[] to typmod length"); DATA(insert OID = 1292 ( tideq PGUID 11 f t f t 2 f 16 "27 27" 100 0 0 100 tideq - )); DESCR("equal"); @@ -1731,13 +1723,13 @@ DATA(insert OID = 1391 ( factorial PGUID 12 f t t t 1 f 23 "21" 100 0 0 100 DESCR("factorial"); DATA(insert OID = 1392 ( factorial PGUID 12 f t t t 1 f 23 "23" 100 0 0 100 int4fac - )); DESCR("factorial"); -DATA(insert OID = 1393 ( factorial PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8fac - )); +DATA(insert OID = 1393 ( factorial PGUID 12 f t t t 1 f 20 "20" 100 0 0 100 int8fac - )); DESCR("factorial"); DATA(insert OID = 1394 ( abs PGUID 11 f t t t 1 f 700 "700" 100 0 0 100 float4abs - )); DESCR("absolute value"); DATA(insert OID = 1395 ( abs PGUID 11 f t t t 1 f 701 "701" 100 0 0 100 float8abs - )); DESCR("absolute value"); -DATA(insert OID = 1396 ( abs PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8abs - )); +DATA(insert OID = 1396 ( abs PGUID 12 f t t t 1 f 20 "20" 100 0 0 100 int8abs - )); DESCR("absolute value"); DATA(insert OID = 1397 ( abs PGUID 12 f t t t 1 f 23 "23" 100 0 0 100 int4abs - )); DESCR("absolute value"); @@ -1903,7 +1895,7 @@ DATA(insert OID = 1473 ( circle PGUID 11 f t t t 2 f 718 "600 701" 100 0 1 0 DESCR("convert point and radius to circle"); DATA(insert OID = 1474 ( circle PGUID 11 f t t t 1 f 718 "604" 100 0 1 0 poly_circle - )); DESCR("convert polygon to circle"); -DATA(insert OID = 1475 ( polygon PGUID 11 f t t t 2 f 604 "23 718" 100 0 1 0 circle_poly - )); +DATA(insert OID = 1475 ( polygon PGUID 12 f t t t 2 f 604 "23 718" 100 0 1 0 circle_poly - )); DESCR("convert vertex count and circle to polygon"); DATA(insert OID = 1476 ( dist_pc PGUID 11 f t t t 2 f 701 "600 718" 100 0 1 0 dist_pc - )); DESCR("distance between point and circle"); @@ -2067,12 +2059,12 @@ DESCR("convert int4 to varchar"); DATA(insert OID = 1620 ( ascii PGUID 11 f t t t 1 f 23 "25" 100 0 0 100 ascii - )); DESCR("convert first char to int4"); -DATA(insert OID = 1621 ( ichar PGUID 11 f t t t 1 f 25 "23" 100 0 0 100 ichar - )); +DATA(insert OID = 1621 ( ichar PGUID 12 f t t t 1 f 25 "23" 100 0 0 100 ichar - )); DESCR("convert int4 to char"); -DATA(insert OID = 1622 ( repeat PGUID 11 f t t t 2 f 25 "25 23" 100 0 0 100 repeat - )); +DATA(insert OID = 1622 ( repeat PGUID 12 f t t t 2 f 25 "25 23" 100 0 0 100 repeat - )); DESCR("replicate string int4 times"); -DATA(insert OID = 1623 ( varchar PGUID 11 f t t t 1 f 1043 "20" 100 0 0 100 int8_text - )); +DATA(insert OID = 1623 ( varchar PGUID 12 f t t t 1 f 1043 "20" 100 0 0 100 int8_text - )); DESCR("convert int8 to varchar"); DATA(insert OID = 1624 ( mul_d_interval PGUID 12 f t t t 2 f 1186 "701 1186" 100 0 0 100 mul_d_interval - )); @@ -2120,15 +2112,15 @@ DATA(insert OID = 871 ( upper PGUID 11 f t t t 1 f 25 "25" 100 0 0 100 up DESCR("uppercase"); DATA(insert OID = 872 ( initcap PGUID 11 f t t t 1 f 25 "25" 100 0 0 100 initcap - )); DESCR("capitalize each word"); -DATA(insert OID = 873 ( lpad PGUID 11 f t t t 3 f 25 "25 23 25" 100 0 0 100 lpad - )); +DATA(insert OID = 873 ( lpad PGUID 12 f t t t 3 f 25 "25 23 25" 100 0 0 100 lpad - )); DESCR("left-pad string to length"); -DATA(insert OID = 874 ( rpad PGUID 11 f t t t 3 f 25 "25 23 25" 100 0 0 100 rpad - )); +DATA(insert OID = 874 ( rpad PGUID 12 f t t t 3 f 25 "25 23 25" 100 0 0 100 rpad - )); DESCR("right-pad string to length"); DATA(insert OID = 875 ( ltrim PGUID 11 f t t t 2 f 25 "25 25" 100 0 0 100 ltrim - )); DESCR("left-pad string to length"); DATA(insert OID = 876 ( rtrim PGUID 11 f t t t 2 f 25 "25 25" 100 0 0 100 rtrim - )); DESCR("right-pad string to length"); -DATA(insert OID = 877 ( substr PGUID 11 f t t t 3 f 25 "25 23 23" 100 0 0 100 text_substr - )); +DATA(insert OID = 877 ( substr PGUID 12 f t t t 3 f 25 "25 23 23" 100 0 0 100 text_substr - )); DESCR("return portion of string"); DATA(insert OID = 878 ( translate PGUID 11 f t t t 3 f 25 "25 25 25" 100 0 0 100 translate - )); DESCR("modify string by substring replacement"); @@ -2148,13 +2140,13 @@ DATA(insert OID = 885 ( btrim PGUID 14 f t t t 1 f 25 "25" 100 0 0 100 "s DESCR("trim both ends of string"); /* for multi-byte support */ -DATA(insert OID = 1039 ( getdatabaseencoding PGUID 11 f t f t 0 f 19 "0" 100 0 0 100 getdatabaseencoding - )); +DATA(insert OID = 1039 ( getdatabaseencoding PGUID 12 f t f t 0 f 19 "0" 100 0 0 100 getdatabaseencoding - )); DESCR("encoding name of current database"); -DATA(insert OID = 1295 ( pg_char_to_encoding PGUID 11 f t f t 1 f 23 "19" 100 0 0 100 pg_char_to_encoding - )); +DATA(insert OID = 1295 ( pg_char_to_encoding PGUID 12 f t f t 1 f 23 "19" 100 0 0 100 PG_char_to_encoding - )); DESCR("convert encoding name to encoding id"); -DATA(insert OID = 1597 ( pg_encoding_to_char PGUID 11 f t f t 1 f 19 "23" 100 0 0 100 pg_encoding_to_char - )); +DATA(insert OID = 1597 ( pg_encoding_to_char PGUID 12 f t f t 1 f 19 "23" 100 0 0 100 PG_encoding_to_char - )); DESCR("convert encoding id to encoding name"); /* System-view support functions */ @@ -2162,7 +2154,7 @@ DATA(insert OID = 1640 ( pg_get_ruledef PGUID 11 f t f t 1 f 25 "19" 100 0 0 DESCR("source text of a rule"); DATA(insert OID = 1641 ( pg_get_viewdef PGUID 11 f t f t 1 f 25 "19" 100 0 0 100 pg_get_viewdef - )); DESCR("select statement of a view"); -DATA(insert OID = 1642 ( pg_get_userbyid PGUID 11 f t f t 1 f 19 "23" 100 0 0 100 pg_get_userbyid - )); +DATA(insert OID = 1642 ( pg_get_userbyid PGUID 12 f t f t 1 f 19 "23" 100 0 0 100 pg_get_userbyid - )); DESCR("user name by UID (with fallback)"); DATA(insert OID = 1643 ( pg_get_indexdef PGUID 12 f t f t 1 f 25 "26" 100 0 0 100 pg_get_indexdef - )); DESCR("index description"); @@ -2321,23 +2313,23 @@ DATA(insert OID = 1693 ( btboolcmp PGUID 12 f t t t 2 f 23 "16 16" 100 0 0 DESCR("btree less-equal-greater"); /* OID's 1700 - 1799 NUMERIC data type */ -DATA(insert OID = 1701 ( numeric_in PGUID 11 f t t t 3 f 1700 "0 0 23" 100 0 0 100 numeric_in - )); +DATA(insert OID = 1701 ( numeric_in PGUID 12 f t t t 3 f 1700 "0 26 23" 100 0 0 100 numeric_in - )); DESCR("(internal)"); -DATA(insert OID = 1702 ( numeric_out PGUID 11 f t t t 1 f 23 "0" 100 0 0 100 numeric_out - )); -DESCR("(internal)"); -DATA(insert OID = 1703 ( numeric PGUID 11 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric - )); +DATA(insert OID = 1702 ( numeric_out PGUID 12 f t t t 1 f 23 "0" 100 0 0 100 numeric_out - )); DESCR("(internal)"); +DATA(insert OID = 1703 ( numeric PGUID 12 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric - )); +DESCR("adjust numeric to typmod precision/scale"); DATA(insert OID = 1704 ( numeric_abs PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_abs - )); DESCR("absolute value"); DATA(insert OID = 1705 ( abs PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_abs - )); DESCR("absolute value"); DATA(insert OID = 1706 ( sign PGUID 11 f t t t 1 f 1700 "1700" 100 0 0 100 numeric_sign - )); DESCR("sign of value"); -DATA(insert OID = 1707 ( round PGUID 11 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric_round - )); +DATA(insert OID = 1707 ( round PGUID 12 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric_round - )); DESCR("value rounded to 'scale'"); DATA(insert OID = 1708 ( round PGUID 14 f t t t 1 f 1700 "1700" 100 0 0 100 "select numeric_round($1,0)" - )); DESCR("value rounded to 'scale' of zero"); -DATA(insert OID = 1709 ( trunc PGUID 11 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric_trunc - )); +DATA(insert OID = 1709 ( trunc PGUID 12 f t t t 2 f 1700 "1700 23" 100 0 0 100 numeric_trunc - )); DESCR("value truncated to 'scale'"); DATA(insert OID = 1710 ( trunc PGUID 14 f t t t 1 f 1700 "1700" 100 0 0 100 "select trunc($1,0)" - )); DESCR("value truncated to 'scale' of zero"); @@ -2389,7 +2381,7 @@ DATA(insert OID = 1738 ( pow PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 1 DESCR("m raised to the power of n"); DATA(insert OID = 1739 ( numeric_power PGUID 11 f t t t 2 f 1700 "1700 1700" 100 0 0 100 numeric_power - )); DESCR("m raised to the power of n"); -DATA(insert OID = 1740 ( numeric PGUID 11 f t t t 1 f 1700 "23" 100 0 0 100 int4_numeric - )); +DATA(insert OID = 1740 ( numeric PGUID 12 f t t t 1 f 1700 "23" 100 0 0 100 int4_numeric - )); DESCR("(internal)"); DATA(insert OID = 1741 ( log PGUID 14 f t t t 1 f 1700 "1700" 100 0 0 100 "select log(10, $1)" - )); DESCR("logarithm base 10 of n"); @@ -2427,17 +2419,17 @@ DESCR("(internal)"); /* formatting */ DATA(insert OID = 1770 ( to_char PGUID 12 f t f t 2 f 25 "1184 25" 100 0 0 100 timestamp_to_char - )); DESCR("format timestamp to text"); -DATA(insert OID = 1772 ( to_char PGUID 11 f t f t 2 f 25 "1700 25" 100 0 0 100 numeric_to_char - )); +DATA(insert OID = 1772 ( to_char PGUID 12 f t f t 2 f 25 "1700 25" 100 0 0 100 numeric_to_char - )); DESCR("format numeric to text"); -DATA(insert OID = 1773 ( to_char PGUID 11 f t f t 2 f 25 "23 25" 100 0 0 100 int4_to_char - )); +DATA(insert OID = 1773 ( to_char PGUID 12 f t f t 2 f 25 "23 25" 100 0 0 100 int4_to_char - )); DESCR("format int4 to text"); -DATA(insert OID = 1774 ( to_char PGUID 11 f t f t 2 f 25 "20 25" 100 0 0 100 int8_to_char - )); +DATA(insert OID = 1774 ( to_char PGUID 12 f t f t 2 f 25 "20 25" 100 0 0 100 int8_to_char - )); DESCR("format int8 to text"); -DATA(insert OID = 1775 ( to_char PGUID 11 f t f t 2 f 25 "700 25" 100 0 0 100 float4_to_char - )); +DATA(insert OID = 1775 ( to_char PGUID 12 f t f t 2 f 25 "700 25" 100 0 0 100 float4_to_char - )); DESCR("format float4 to text"); -DATA(insert OID = 1776 ( to_char PGUID 11 f t f t 2 f 25 "701 25" 100 0 0 100 float8_to_char - )); +DATA(insert OID = 1776 ( to_char PGUID 12 f t f t 2 f 25 "701 25" 100 0 0 100 float8_to_char - )); DESCR("format float8 to text"); -DATA(insert OID = 1777 ( to_number PGUID 11 f t f t 2 f 1700 "25 25" 100 0 0 100 numeric_to_number - )); +DATA(insert OID = 1777 ( to_number PGUID 12 f t f t 2 f 1700 "25 25" 100 0 0 100 numeric_to_number - )); DESCR("convert text to numeric"); DATA(insert OID = 1778 ( to_timestamp PGUID 12 f t f t 2 f 1184 "25 25" 100 0 0 100 to_timestamp - )); DESCR("convert text to timestamp"); diff --git a/src/include/fmgr.h b/src/include/fmgr.h index 6bbab9676c..cf5a3eb0cb 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: fmgr.h,v 1.4 2000/06/05 07:29:02 tgl Exp $ + * $Id: fmgr.h,v 1.5 2000/06/13 07:35:23 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -99,37 +99,49 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo); */ #define PG_ARGISNULL(n) (fcinfo->argnull[n]) +#if 1 +/* VERY TEMPORARY until some TOAST support is committed ... */ +#define PG_DETOAST_DATUM(datum) \ + ((struct varlena *) DatumGetPointer(datum)) +#else +/* Eventually it will look more like this... */ +#define PG_DETOAST_DATUM(datum) \ + (VARATT_IS_EXTENDED(DatumGetPointer(datum)) ? \ + (struct varlena *) heap_tuple_untoast_attr((varattrib *) DatumGetPointer(datum)) : \ + (struct varlena *) DatumGetPointer(datum)) +#endif + /* Macros for fetching arguments of standard types */ #define PG_GETARG_DATUM(n) (fcinfo->arg[n]) -#define PG_GETARG_INT32(n) DatumGetInt32(fcinfo->arg[n]) -#define PG_GETARG_UINT32(n) DatumGetUInt32(fcinfo->arg[n]) -#define PG_GETARG_INT16(n) DatumGetInt16(fcinfo->arg[n]) -#define PG_GETARG_CHAR(n) DatumGetChar(fcinfo->arg[n]) -#define PG_GETARG_BOOL(n) DatumGetBool(fcinfo->arg[n]) -#define PG_GETARG_OID(n) DatumGetObjectId(fcinfo->arg[n]) -#define PG_GETARG_POINTER(n) DatumGetPointer(fcinfo->arg[n]) -#define PG_GETARG_CSTRING(n) DatumGetCString(fcinfo->arg[n]) -#define PG_GETARG_NAME(n) DatumGetName(fcinfo->arg[n]) +#define PG_GETARG_INT32(n) DatumGetInt32(PG_GETARG_DATUM(n)) +#define PG_GETARG_UINT32(n) DatumGetUInt32(PG_GETARG_DATUM(n)) +#define PG_GETARG_INT16(n) DatumGetInt16(PG_GETARG_DATUM(n)) +#define PG_GETARG_UINT16(n) DatumGetUInt16(PG_GETARG_DATUM(n)) +#define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n)) +#define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n)) +#define PG_GETARG_OID(n) DatumGetObjectId(PG_GETARG_DATUM(n)) +#define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n)) +#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n)) +#define PG_GETARG_NAME(n) DatumGetName(PG_GETARG_DATUM(n)) /* these macros hide the pass-by-reference-ness of the datatype: */ -#define PG_GETARG_FLOAT4(n) DatumGetFloat4(fcinfo->arg[n]) -#define PG_GETARG_FLOAT8(n) DatumGetFloat8(fcinfo->arg[n]) -#define PG_GETARG_INT64(n) DatumGetInt64(fcinfo->arg[n]) +#define PG_GETARG_FLOAT4(n) DatumGetFloat4(PG_GETARG_DATUM(n)) +#define PG_GETARG_FLOAT8(n) DatumGetFloat8(PG_GETARG_DATUM(n)) +#define PG_GETARG_INT64(n) DatumGetInt64(PG_GETARG_DATUM(n)) /* use this if you want the raw, possibly-toasted input datum: */ #define PG_GETARG_RAW_VARLENA_P(n) ((struct varlena *) PG_GETARG_POINTER(n)) /* use this if you want the input datum de-toasted: */ -#if 1 -/* VERY TEMPORARY until some TOAST support is committed ... */ -#define PG_GETARG_VARLENA_P(n) PG_GETARG_RAW_VARLENA_P(n) -#else -/* Eventually it will look more like this... */ -#define PG_GETARG_VARLENA_P(n) \ - (VARATT_IS_EXTENDED(PG_GETARG_RAW_VARLENA_P(n)) ? \ - (struct varlena *) heap_tuple_untoast_attr((varattrib *) PG_GETARG_RAW_VARLENA_P(n)) : \ - PG_GETARG_RAW_VARLENA_P(n)) -#endif +#define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n)) +/* DatumGetFoo macros for varlena types will typically look like this: */ +#define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X)) +#define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X)) +#define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X)) +#define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X)) /* GETARG macros for varlena types will typically look like this: */ -#define PG_GETARG_TEXT_P(n) ((text *) PG_GETARG_VARLENA_P(n)) +#define PG_GETARG_BYTEA_P(n) DatumGetByteaP(PG_GETARG_DATUM(n)) +#define PG_GETARG_TEXT_P(n) DatumGetTextP(PG_GETARG_DATUM(n)) +#define PG_GETARG_BPCHAR_P(n) DatumGetBpCharP(PG_GETARG_DATUM(n)) +#define PG_GETARG_VARCHAR_P(n) DatumGetVarCharP(PG_GETARG_DATUM(n)) /* To return a NULL do this: */ #define PG_RETURN_NULL() \ @@ -151,7 +163,10 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo); #define PG_RETURN_FLOAT8(x) return Float8GetDatum(x) #define PG_RETURN_INT64(x) return Int64GetDatum(x) /* RETURN macros for other pass-by-ref types will typically look like this: */ -#define PG_RETURN_TEXT_P(x) PG_RETURN_POINTER(x) +#define PG_RETURN_BYTEA_P(x) PG_RETURN_POINTER(x) +#define PG_RETURN_TEXT_P(x) PG_RETURN_POINTER(x) +#define PG_RETURN_BPCHAR_P(x) PG_RETURN_POINTER(x) +#define PG_RETURN_VARCHAR_P(x) PG_RETURN_POINTER(x) /*------------------------------------------------------------------------- diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index 97caffeb80..5a1acc190f 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -1,4 +1,4 @@ -/* $Id: pg_wchar.h,v 1.14 2000/04/20 22:40:18 tgl Exp $ */ +/* $Id: pg_wchar.h,v 1.15 2000/06/13 07:35:27 tgl Exp $ */ #ifndef PG_WCHAR_H #define PG_WCHAR_H @@ -122,11 +122,11 @@ extern unsigned char *pg_client_to_server(unsigned char *, int); extern unsigned char *pg_server_to_client(unsigned char *, int); extern int pg_valid_client_encoding(const char *); -/* moved to miscadmin.h - * pg_proc.h now have them. +/* internally-used versions of functions. The PG_xxx forms of these + * functions have fmgr-compatible interfaves. + */ extern const char *pg_encoding_to_char(int); extern int pg_char_to_encoding(const char *); -*/ extern int GetDatabaseEncoding(void); extern void SetDatabaseEncoding(int); diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index dd778e7e3e..b56ad152f2 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -12,7 +12,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: miscadmin.h,v 1.58 2000/06/08 22:37:35 momjian Exp $ + * $Id: miscadmin.h,v 1.59 2000/06/13 07:35:24 tgl Exp $ * * NOTES * some of the information in this file will be moved to @@ -131,13 +131,6 @@ extern char *ExpandDatabasePath(const char *path); extern void SetDatabaseName(const char *name); extern void SetDatabasePath(const char *path); -/* even if MULTIBYTE is not enabled, this function is neccesary - * since pg_proc.h does have. - */ -extern const char *getdatabaseencoding(void); -extern const char *pg_encoding_to_char(int); -extern int pg_char_to_encoding(const char *); - extern char *getpgusername(void); extern void SetPgUserName(void); extern int GetUserId(void); diff --git a/src/include/postgres.h b/src/include/postgres.h index c64eab2cc4..0f26b7978a 100644 --- a/src/include/postgres.h +++ b/src/include/postgres.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1995, Regents of the University of California * - * $Id: postgres.h,v 1.40 2000/06/02 15:57:40 momjian Exp $ + * $Id: postgres.h,v 1.41 2000/06/13 07:35:24 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -49,7 +49,7 @@ typedef int4 aclitem; -#define InvalidOid 0 +#define InvalidOid ((Oid) 0) #define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid)) /* unfortunately, both regproc and RegProcedure are used */ @@ -76,12 +76,15 @@ struct varlena #define VARDATA(PTR) (((struct varlena *)(PTR))->vl_dat) #define VARHDRSZ ((int32) sizeof(int32)) +/* + * These widely-used datatypes are just a varlena header and the data bytes. + * There is no terminating null or anything like that --- the data length is + * always VARSIZE(ptr) - VARHDRSZ. + */ typedef struct varlena bytea; typedef struct varlena text; - -typedef int2 int2vector[INDEX_MAX_KEYS]; -typedef Oid oidvector[INDEX_MAX_KEYS]; - +typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */ +typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */ /* * Proposed new layout for variable length attributes @@ -155,6 +158,11 @@ extern varattrib *heap_tuple_untoast_attr(varattrib * attr); #endif /* TUPLE_TOASTER_ACTIVE */ +/* fixed-length array types (these are not varlena's!) */ + +typedef int2 int2vector[INDEX_MAX_KEYS]; +typedef Oid oidvector[INDEX_MAX_KEYS]; + /* We want NameData to have length NAMEDATALEN and int alignment, * because that's how the data type 'name' is defined in pg_type. * Use a union to make sure the compiler agrees. @@ -176,6 +184,7 @@ typedef NameData *Name; typedef uint32 TransactionId; #define InvalidTransactionId 0 + typedef uint32 CommandId; #define FirstCommandId 0 @@ -228,7 +237,7 @@ typedef uint32 CommandId; * --------------- */ #ifdef CYR_RECODE -extern void SetCharSet(); +extern void SetCharSet(void); #endif /* CYR_RECODE */ #endif /* POSTGRES_H */ diff --git a/src/include/utils/array.h b/src/include/utils/array.h index c48baa974f..4fb296671d 100644 --- a/src/include/utils/array.h +++ b/src/include/utils/array.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: array.h,v 1.24 2000/05/29 21:02:32 tgl Exp $ + * $Id: array.h,v 1.25 2000/06/13 07:35:30 tgl Exp $ * * NOTES * XXX the data array should be MAXALIGN'd -- notice that the array @@ -99,7 +99,8 @@ typedef struct *------------------------------------------------------------------------ */ -#define RETURN_NULL do {*isNull = true; return(0); } while (0) +#define RETURN_NULL(type) do { *isNull = true; return (type) 0; } while (0) + #define NAME_LEN 30 #define MAX_BUFF_SIZE BLCKSZ @@ -112,23 +113,29 @@ typedef struct /* * prototypes for functions defined in arrayfuncs.c */ -extern char *array_in(char *string, Oid element_type, int32 typmod); -extern char *array_out(ArrayType *v, Oid element_type); -extern char *array_dims(ArrayType *v, bool *isNull); -extern Datum array_ref(ArrayType *array, int n, int *indx, int reftype, - int elmlen, int arraylen, bool *isNull); -extern Datum array_clip(ArrayType *array, int n, int *upperIndx, - int *lowerIndx, int reftype, int len, bool *isNull); -extern char *array_set(ArrayType *array, int n, int *indx, char *dataPtr, - int reftype, int elmlen, int arraylen, bool *isNull); -extern char *array_assgn(ArrayType *array, int n, int *upperIndx, - int *lowerIndx, ArrayType *newArr, int reftype, - int len, bool *isNull); +extern Datum array_in(PG_FUNCTION_ARGS); +extern Datum array_out(PG_FUNCTION_ARGS); +extern Datum array_eq(PG_FUNCTION_ARGS); +extern Datum array_dims(PG_FUNCTION_ARGS); + +extern Datum array_ref(ArrayType *array, int nSubscripts, int *indx, + bool elmbyval, int elmlen, + int arraylen, bool *isNull); +extern ArrayType *array_set(ArrayType *array, int nSubscripts, int *indx, + Datum dataValue, + bool elmbyval, int elmlen, + int arraylen, bool *isNull); +extern ArrayType *array_clip(ArrayType *array, int nSubscripts, + int *upperIndx, int *lowerIndx, + bool elmbyval, int elmlen, bool *isNull); +extern ArrayType *array_assgn(ArrayType *array, int nSubscripts, + int *upperIndx, int *lowerIndx, + ArrayType *newArr, + bool elmbyval, int elmlen, bool *isNull); extern Datum array_map(FunctionCallInfo fcinfo, Oid inpType, Oid retType); -extern int array_eq(ArrayType *array1, ArrayType *array2); + extern int _LOtransfer(char **destfd, int size, int nitems, char **srcfd, int isSrcLO, int isDestLO); - extern char *_array_newLO(int *fd, int flag); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 7000ad3a90..6c4071fd5d 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: builtins.h,v 1.115 2000/06/09 01:11:14 tgl Exp $ + * $Id: builtins.h,v 1.116 2000/06/13 07:35:30 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -190,7 +190,7 @@ extern BOX *rt_box_union(BOX *a, BOX *b); extern BOX *rt_box_inter(BOX *a, BOX *b); extern void rt_box_size(BOX *a, float *size); extern void rt_bigbox_size(BOX *a, float *size); -extern void rt_poly_size(POLYGON *a, float *size); +extern Datum rt_poly_size(PG_FUNCTION_ARGS); extern POLYGON *rt_poly_union(POLYGON *a, POLYGON *b); extern POLYGON *rt_poly_inter(POLYGON *a, POLYGON *b); @@ -244,12 +244,12 @@ extern bool float8le(float64 arg1, float64 arg2); extern bool float8gt(float64 arg1, float64 arg2); extern bool float8ge(float64 arg1, float64 arg2); extern float64 ftod(float32 num); -extern float64 i4tod(int32 num); +extern Datum i4tod(PG_FUNCTION_ARGS); extern Datum i2tod(PG_FUNCTION_ARGS); extern float32 dtof(float64 num); extern int32 dtoi4(float64 num); extern Datum dtoi2(PG_FUNCTION_ARGS); -extern float32 i4tof(int32 num); +extern Datum i4tof(PG_FUNCTION_ARGS); extern Datum i2tof(PG_FUNCTION_ARGS); extern int32 ftoi4(float32 num); extern Datum ftoi2(PG_FUNCTION_ARGS); @@ -354,7 +354,7 @@ extern Datum regproctooid(PG_FUNCTION_ARGS); extern text *pg_get_ruledef(NameData *rname); extern text *pg_get_viewdef(NameData *rname); extern Datum pg_get_indexdef(PG_FUNCTION_ARGS); -extern NameData *pg_get_userbyid(int32 uid); +extern Datum pg_get_userbyid(PG_FUNCTION_ARGS); extern char *deparse_expression(Node *expr, List *rangetables, bool forceprefix); @@ -412,16 +412,10 @@ extern Datum currtid_byrelname(PG_FUNCTION_ARGS); /* varchar.c */ -/* bpchar and varchar are just a varlena header and some characters */ -#define PG_GETARG_BPCHAR_P(n) ((struct varlena *) PG_GETARG_VARLENA_P(n)) -#define PG_RETURN_BPCHAR_P(x) PG_RETURN_POINTER(x) -#define PG_GETARG_VARCHAR_P(n) ((struct varlena *) PG_GETARG_VARLENA_P(n)) -#define PG_RETURN_VARCHAR_P(x) PG_RETURN_POINTER(x) - -extern char *bpcharin(char *s, int dummy, int32 atttypmod); -extern char *bpcharout(char *s); -extern char *bpchar(char *s, int32 slen); -extern ArrayType *_bpchar(ArrayType *v, int32 slen); +extern Datum bpcharin(PG_FUNCTION_ARGS); +extern Datum bpcharout(PG_FUNCTION_ARGS); +extern Datum bpchar(PG_FUNCTION_ARGS); +extern Datum _bpchar(PG_FUNCTION_ARGS); extern Datum char_bpchar(PG_FUNCTION_ARGS); extern Datum bpchar_char(PG_FUNCTION_ARGS); extern char *name_bpchar(NameData *s); @@ -437,10 +431,10 @@ extern int32 bpcharlen(char *arg); extern int32 bpcharoctetlen(char *arg); extern uint32 hashbpchar(struct varlena * key); -extern char *varcharin(char *s, int dummy, int32 atttypmod); -extern char *varcharout(char *s); -extern char *varchar(char *s, int32 slen); -extern ArrayType *_varchar(ArrayType *v, int32 slen); +extern Datum varcharin(PG_FUNCTION_ARGS); +extern Datum varcharout(PG_FUNCTION_ARGS); +extern Datum varchar(PG_FUNCTION_ARGS); +extern Datum _varchar(PG_FUNCTION_ARGS); extern bool varchareq(char *arg1, char *arg2); extern bool varcharne(char *arg1, char *arg2); extern bool varcharlt(char *arg1, char *arg2); @@ -468,17 +462,17 @@ extern text *text_smaller(text *arg1, text *arg2); extern int32 textlen(text *arg); extern int32 textoctetlen(text *arg); extern int32 textpos(text *arg1, text *arg2); -extern text *text_substr(text *string, int32 m, int32 n); +extern Datum text_substr(PG_FUNCTION_ARGS); extern text *name_text(NameData *s); extern NameData *text_name(text *s); extern bytea *byteain(char *inputText); extern char *byteaout(bytea *vlena); extern int32 byteaoctetlen(bytea *v); -extern int32 byteaGetByte(bytea *v, int32 n); -extern int32 byteaGetBit(bytea *v, int32 n); -extern bytea *byteaSetByte(bytea *v, int32 n, int32 newByte); -extern bytea *byteaSetBit(bytea *v, int32 n, int32 newBit); +extern Datum byteaGetByte(PG_FUNCTION_ARGS); +extern Datum byteaGetBit(PG_FUNCTION_ARGS); +extern Datum byteaSetByte(PG_FUNCTION_ARGS); +extern Datum byteaSetBit(PG_FUNCTION_ARGS); /* like.c */ extern bool namelike(NameData *n, struct varlena * p); @@ -491,15 +485,14 @@ extern bool textnlike(struct varlena * s, struct varlena * p); extern text *lower(text *string); extern text *upper(text *string); extern text *initcap(text *string); -extern text *lpad(text *string1, int4 len, text *string2); -extern text *rpad(text *string1, int4 len, text *string2); +extern Datum lpad(PG_FUNCTION_ARGS); +extern Datum rpad(PG_FUNCTION_ARGS); extern text *btrim(text *string, text *set); extern text *ltrim(text *string, text *set); extern text *rtrim(text *string, text *set); -extern text *substr(text *string, int4 m, int4 n); extern text *translate(text *string, text *from, text *to); -extern text *ichar(int4 arg1); -extern text *repeat(text *string, int4 count); +extern Datum ichar(PG_FUNCTION_ARGS); +extern Datum repeat(PG_FUNCTION_ARGS); extern int4 ascii(text *string); /* acl.c */ @@ -547,14 +540,14 @@ extern int4 macaddr_cmp(macaddr *a1, macaddr *a2); extern text *macaddr_manuf(macaddr *addr); /* numeric.c */ -extern Numeric numeric_in(char *str, int dummy, int32 typmod); -extern char *numeric_out(Numeric num); -extern Numeric numeric(Numeric num, int32 typmod); +extern Datum numeric_in(PG_FUNCTION_ARGS); +extern Datum numeric_out(PG_FUNCTION_ARGS); +extern Datum numeric(PG_FUNCTION_ARGS); extern Numeric numeric_abs(Numeric num); extern Numeric numeric_uminus(Numeric num); extern Numeric numeric_sign(Numeric num); -extern Numeric numeric_round(Numeric num, int32 scale); -extern Numeric numeric_trunc(Numeric num, int32 scale); +extern Datum numeric_round(PG_FUNCTION_ARGS); +extern Datum numeric_trunc(PG_FUNCTION_ARGS); extern Numeric numeric_ceil(Numeric num); extern Numeric numeric_floor(Numeric num); extern int32 numeric_cmp(Numeric num1, Numeric num2); @@ -578,7 +571,7 @@ extern Numeric numeric_exp(Numeric num); extern Numeric numeric_ln(Numeric num); extern Numeric numeric_log(Numeric num1, Numeric num2); extern Numeric numeric_power(Numeric num1, Numeric num2); -extern Numeric int4_numeric(int32 val); +extern Datum int4_numeric(PG_FUNCTION_ARGS); extern int32 numeric_int4(Numeric num); extern Numeric int8_numeric(int64 *val); extern int64 *numeric_int8(Numeric num); @@ -618,4 +611,11 @@ extern Datum RI_FKey_setnull_upd(PG_FUNCTION_ARGS); extern Datum RI_FKey_setdefault_del(PG_FUNCTION_ARGS); extern Datum RI_FKey_setdefault_upd(PG_FUNCTION_ARGS); +/* even if MULTIBYTE is not enabled, these functions are necessary + * since pg_proc.h has references to them. + */ +extern Datum getdatabaseencoding(PG_FUNCTION_ARGS); +extern Datum PG_encoding_to_char(PG_FUNCTION_ARGS); +extern Datum PG_char_to_encoding(PG_FUNCTION_ARGS); + #endif /* BUILTINS_H */ diff --git a/src/include/utils/cash.h b/src/include/utils/cash.h index ab688c46f8..7eca3f9147 100644 --- a/src/include/utils/cash.h +++ b/src/include/utils/cash.h @@ -33,9 +33,9 @@ extern Cash *cash_mul_flt4(Cash *c, float4 *f); extern Cash *cash_div_flt4(Cash *c, float4 *f); extern Cash *flt4_mul_cash(float4 *f, Cash *c); -extern Cash *cash_mul_int4(Cash *c, int4 i); -extern Cash *cash_div_int4(Cash *c, int4 i); -extern Cash *int4_mul_cash(int4 i, Cash *c); +extern Datum cash_mul_int4(PG_FUNCTION_ARGS); +extern Datum cash_div_int4(PG_FUNCTION_ARGS); +extern Datum int4_mul_cash(PG_FUNCTION_ARGS); extern Datum cash_mul_int2(PG_FUNCTION_ARGS); extern Datum int2_mul_cash(PG_FUNCTION_ARGS); diff --git a/src/include/utils/formatting.h b/src/include/utils/formatting.h index 327b83f6e8..e296484e1f 100644 --- a/src/include/utils/formatting.h +++ b/src/include/utils/formatting.h @@ -2,7 +2,7 @@ /* ----------------------------------------------------------------------- * formatting.h * - * $Id: formatting.h,v 1.5 2000/06/09 01:11:15 tgl Exp $ + * $Id: formatting.h,v 1.6 2000/06/13 07:35:30 tgl Exp $ * * * Portions Copyright (c) 1999-2000, PostgreSQL, Inc @@ -24,11 +24,11 @@ extern Datum timestamp_to_char(PG_FUNCTION_ARGS); extern Datum to_timestamp(PG_FUNCTION_ARGS); extern Datum to_date(PG_FUNCTION_ARGS); -extern Numeric numeric_to_number(text *value, text *fmt); -extern text *numeric_to_char(Numeric value, text *fmt); -extern text *int4_to_char(int32 value, text *fmt); -extern text *int8_to_char(int64 *value, text *fmt); -extern text *float4_to_char(float32 value, text *fmt); -extern text *float8_to_char(float64 value, text *fmt); +extern Datum numeric_to_number(PG_FUNCTION_ARGS); +extern Datum numeric_to_char(PG_FUNCTION_ARGS); +extern Datum int4_to_char(PG_FUNCTION_ARGS); +extern Datum int8_to_char(PG_FUNCTION_ARGS); +extern Datum float4_to_char(PG_FUNCTION_ARGS); +extern Datum float8_to_char(PG_FUNCTION_ARGS); #endif diff --git a/src/include/utils/geo_decls.h b/src/include/utils/geo_decls.h index 0a722fe81e..a204d61757 100644 --- a/src/include/utils/geo_decls.h +++ b/src/include/utils/geo_decls.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: geo_decls.h,v 1.28 2000/06/05 07:29:07 tgl Exp $ + * $Id: geo_decls.h,v 1.29 2000/06/13 07:35:30 tgl Exp $ * * NOTE * These routines do *not* use the float types from adt/. @@ -135,6 +135,49 @@ typedef struct double radius; } CIRCLE; +/* + * fmgr interface macros + * + * Path and Polygon are toastable varlena types, the others are just + * fixed-size pass-by-reference types. + */ + +#define DatumGetPointP(X) ((Point *) DatumGetPointer(X)) +#define PointPGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_POINT_P(n) DatumGetPointP(PG_GETARG_DATUM(n)) +#define PG_RETURN_POINT_P(x) return PointPGetDatum(x) + +#define DatumGetLsegP(X) ((LSEG *) DatumGetPointer(X)) +#define LsegPGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_LSEG_P(n) DatumGetLsegP(PG_GETARG_DATUM(n)) +#define PG_RETURN_LSEG_P(x) return LsegPGetDatum(x) + +#define DatumGetPathP(X) ((PATH *) PG_DETOAST_DATUM(X)) +#define PathPGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_PATH_P(n) DatumGetPathP(PG_GETARG_DATUM(n)) +#define PG_RETURN_PATH_P(x) return PathPGetDatum(x) + +#define DatumGetLineP(X) ((LINE *) DatumGetPointer(X)) +#define LinePGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_LINE_P(n) DatumGetLineP(PG_GETARG_DATUM(n)) +#define PG_RETURN_LINE_P(x) return LinePGetDatum(x) + +#define DatumGetBoxP(X) ((BOX *) DatumGetPointer(X)) +#define BoxPGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_BOX_P(n) DatumGetBoxP(PG_GETARG_DATUM(n)) +#define PG_RETURN_BOX_P(x) return BoxPGetDatum(x) + +#define DatumGetPolygonP(X) ((POLYGON *) PG_DETOAST_DATUM(X)) +#define PolygonPGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_POLYGON_P(n) DatumGetPolygonP(PG_GETARG_DATUM(n)) +#define PG_RETURN_POLYGON_P(x) return PolygonPGetDatum(x) + +#define DatumGetCircleP(X) ((CIRCLE *) DatumGetPointer(X)) +#define CirclePGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_CIRCLE_P(n) DatumGetCircleP(PG_GETARG_DATUM(n)) +#define PG_RETURN_CIRCLE_P(x) return CirclePGetDatum(x) + + /* * in geo_ops.h */ @@ -354,7 +397,7 @@ extern CIRCLE *circle(Point *center, float8 *radius); extern CIRCLE *box_circle(BOX *box); extern BOX *circle_box(CIRCLE *circle); extern CIRCLE *poly_circle(POLYGON *poly); -extern POLYGON *circle_poly(int npts, CIRCLE *circle); +extern Datum circle_poly(PG_FUNCTION_ARGS); /* private routines */ extern double *circle_area(CIRCLE *circle); diff --git a/src/include/utils/int8.h b/src/include/utils/int8.h index b8ad531ab2..77dc6d7212 100644 --- a/src/include/utils/int8.h +++ b/src/include/utils/int8.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: int8.h,v 1.21 2000/05/28 17:56:20 tgl Exp $ + * $Id: int8.h,v 1.22 2000/06/13 07:35:30 tgl Exp $ * * NOTES * These data types are supported on all 64-bit architectures, and may @@ -24,64 +24,61 @@ #ifndef INT8_H #define INT8_H +#include "fmgr.h" -extern int64 *int8in(char *str); -extern char *int8out(int64 *val); -extern bool int8eq(int64 *val1, int64 *val2); -extern bool int8ne(int64 *val1, int64 *val2); -extern bool int8lt(int64 *val1, int64 *val2); -extern bool int8gt(int64 *val1, int64 *val2); -extern bool int8le(int64 *val1, int64 *val2); -extern bool int8ge(int64 *val1, int64 *val2); +extern Datum int8in(PG_FUNCTION_ARGS); +extern Datum int8out(PG_FUNCTION_ARGS); -extern bool int84eq(int64 *val1, int32 val2); -extern bool int84ne(int64 *val1, int32 val2); -extern bool int84lt(int64 *val1, int32 val2); -extern bool int84gt(int64 *val1, int32 val2); -extern bool int84le(int64 *val1, int32 val2); -extern bool int84ge(int64 *val1, int32 val2); +extern Datum int8eq(PG_FUNCTION_ARGS); +extern Datum int8ne(PG_FUNCTION_ARGS); +extern Datum int8lt(PG_FUNCTION_ARGS); +extern Datum int8gt(PG_FUNCTION_ARGS); +extern Datum int8le(PG_FUNCTION_ARGS); +extern Datum int8ge(PG_FUNCTION_ARGS); -extern bool int48eq(int32 val1, int64 *val2); -extern bool int48ne(int32 val1, int64 *val2); -extern bool int48lt(int32 val1, int64 *val2); -extern bool int48gt(int32 val1, int64 *val2); -extern bool int48le(int32 val1, int64 *val2); -extern bool int48ge(int32 val1, int64 *val2); +extern Datum int84eq(PG_FUNCTION_ARGS); +extern Datum int84ne(PG_FUNCTION_ARGS); +extern Datum int84lt(PG_FUNCTION_ARGS); +extern Datum int84gt(PG_FUNCTION_ARGS); +extern Datum int84le(PG_FUNCTION_ARGS); +extern Datum int84ge(PG_FUNCTION_ARGS); -extern int64 *int8um(int64 *val); -extern int64 *int8pl(int64 *val1, int64 *val2); -extern int64 *int8mi(int64 *val1, int64 *val2); -extern int64 *int8mul(int64 *val1, int64 *val2); -extern int64 *int8div(int64 *val1, int64 *val2); -extern int64 *int8abs(int64 *val1); -extern int64 *int8fac(int64 *val1); -extern int64 *int8mod(int64 *val1, int64 *val2); -extern int64 *int8larger(int64 *val1, int64 *val2); -extern int64 *int8smaller(int64 *val1, int64 *val2); +extern Datum int48eq(PG_FUNCTION_ARGS); +extern Datum int48ne(PG_FUNCTION_ARGS); +extern Datum int48lt(PG_FUNCTION_ARGS); +extern Datum int48gt(PG_FUNCTION_ARGS); +extern Datum int48le(PG_FUNCTION_ARGS); +extern Datum int48ge(PG_FUNCTION_ARGS); -extern int64 *int84pl(int64 *val1, int32 val2); -extern int64 *int84mi(int64 *val1, int32 val2); -extern int64 *int84mul(int64 *val1, int32 val2); -extern int64 *int84div(int64 *val1, int32 val2); +extern Datum int8um(PG_FUNCTION_ARGS); +extern Datum int8pl(PG_FUNCTION_ARGS); +extern Datum int8mi(PG_FUNCTION_ARGS); +extern Datum int8mul(PG_FUNCTION_ARGS); +extern Datum int8div(PG_FUNCTION_ARGS); +extern Datum int8abs(PG_FUNCTION_ARGS); +extern Datum int8fac(PG_FUNCTION_ARGS); +extern Datum int8mod(PG_FUNCTION_ARGS); +extern Datum int8larger(PG_FUNCTION_ARGS); +extern Datum int8smaller(PG_FUNCTION_ARGS); -extern int64 *int48pl(int32 val1, int64 *val2); -extern int64 *int48mi(int32 val1, int64 *val2); -extern int64 *int48mul(int32 val1, int64 *val2); -extern int64 *int48div(int32 val1, int64 *val2); +extern Datum int84pl(PG_FUNCTION_ARGS); +extern Datum int84mi(PG_FUNCTION_ARGS); +extern Datum int84mul(PG_FUNCTION_ARGS); +extern Datum int84div(PG_FUNCTION_ARGS); -extern int64 *int48(int32 val); -extern int32 int84(int64 *val); +extern Datum int48pl(PG_FUNCTION_ARGS); +extern Datum int48mi(PG_FUNCTION_ARGS); +extern Datum int48mul(PG_FUNCTION_ARGS); +extern Datum int48div(PG_FUNCTION_ARGS); -#ifdef NOT_USED -extern int16 int82(int64 *val); +extern Datum int48(PG_FUNCTION_ARGS); +extern Datum int84(PG_FUNCTION_ARGS); -#endif +extern Datum i8tod(PG_FUNCTION_ARGS); +extern Datum dtoi8(PG_FUNCTION_ARGS); -extern float64 i8tod(int64 *val); -extern int64 *dtoi8(float64 val); - -extern text *int8_text(int64 *val); -extern int64 *text_int8(text *str); +extern Datum int8_text(PG_FUNCTION_ARGS); +extern Datum text_int8(PG_FUNCTION_ARGS); #endif /* INT8_H */ diff --git a/src/include/utils/numeric.h b/src/include/utils/numeric.h index 1b3864dc0d..1a0dd692db 100644 --- a/src/include/utils/numeric.h +++ b/src/include/utils/numeric.h @@ -5,7 +5,7 @@ * * 1998 Jan Wieck * - * $Header: /cvsroot/pgsql/src/include/utils/numeric.h,v 1.9 2000/04/12 17:16:55 momjian Exp $ + * $Header: /cvsroot/pgsql/src/include/utils/numeric.h,v 1.10 2000/06/13 07:35:31 tgl Exp $ * * ---------- */ @@ -71,4 +71,13 @@ typedef NumericData *Numeric; #define NUMERIC_HDRSZ (sizeof(int32) + sizeof(uint16) * 3) +/* + * fmgr interface macros + */ + +#define DatumGetNumeric(X) ((Numeric) PG_DETOAST_DATUM(X)) +#define NumericGetDatum(X) PointerGetDatum(X) +#define PG_GETARG_NUMERIC(n) DatumGetNumeric(PG_GETARG_DATUM(n)) +#define PG_RETURN_NUMERIC(x) return NumericGetDatum(x) + #endif /* _PG_NUMERIC_H_ */ diff --git a/src/test/regress/input/create_function_1.source b/src/test/regress/input/create_function_1.source index e3c1d22c1d..0466249be8 100644 --- a/src/test/regress/input/create_function_1.source +++ b/src/test/regress/input/create_function_1.source @@ -40,5 +40,5 @@ CREATE FUNCTION ttdummy () CREATE FUNCTION set_ttdummy (int4) RETURNS int4 AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; diff --git a/src/test/regress/input/create_function_2.source b/src/test/regress/input/create_function_2.source index a135a8fa9c..a8742b7d20 100644 --- a/src/test/regress/input/create_function_2.source +++ b/src/test/regress/input/create_function_2.source @@ -28,9 +28,9 @@ CREATE FUNCTION user_relns() LANGUAGE 'sql'; CREATE FUNCTION pt_in_widget(point, widget) - RETURNS int4 + RETURNS bool AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION overpaid(emp) RETURNS bool @@ -38,9 +38,9 @@ CREATE FUNCTION overpaid(emp) LANGUAGE 'newC'; CREATE FUNCTION boxarea(box) - RETURNS int4 + RETURNS float8 AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION interpt_pp(path, path) RETURNS point diff --git a/src/test/regress/output/create_function_1.source b/src/test/regress/output/create_function_1.source index 9eb0ce6e61..ec7e82ba32 100644 --- a/src/test/regress/output/create_function_1.source +++ b/src/test/regress/output/create_function_1.source @@ -33,4 +33,4 @@ CREATE FUNCTION ttdummy () CREATE FUNCTION set_ttdummy (int4) RETURNS int4 AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; diff --git a/src/test/regress/output/create_function_2.source b/src/test/regress/output/create_function_2.source index f04cf7356c..105b35858a 100644 --- a/src/test/regress/output/create_function_2.source +++ b/src/test/regress/output/create_function_2.source @@ -21,17 +21,17 @@ CREATE FUNCTION user_relns() relkind <> ''i'' ' LANGUAGE 'sql'; CREATE FUNCTION pt_in_widget(point, widget) - RETURNS int4 + RETURNS bool AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION overpaid(emp) RETURNS bool AS '_OBJWD_/regress_DLSUFFIX_' LANGUAGE 'newC'; CREATE FUNCTION boxarea(box) - RETURNS int4 + RETURNS float8 AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION interpt_pp(path, path) RETURNS point AS '_OBJWD_/regress_DLSUFFIX_' diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index c2ffb81ba2..67c62c8ab6 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -1,5 +1,5 @@ /* - * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.39 2000/06/11 20:07:44 tgl Exp $ + * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.40 2000/06/13 07:35:34 tgl Exp $ */ #include /* faked on sunos */ @@ -23,7 +23,7 @@ extern PATH *poly2path(POLYGON *poly); extern Point *interpt_pp(PATH *p1, PATH *p2); extern void regress_lseg_construct(LSEG *lseg, Point *pt1, Point *pt2); extern Datum overpaid(PG_FUNCTION_ARGS); -extern int boxarea(BOX *box); +extern Datum boxarea(PG_FUNCTION_ARGS); extern char *reverse_name(char *string); /* @@ -203,7 +203,7 @@ typedef struct WIDGET *widget_in(char *str); char *widget_out(WIDGET * widget); -int pt_in_widget(Point *point, WIDGET * widget); +extern Datum pt_in_widget(PG_FUNCTION_ARGS); #define NARGS 3 @@ -249,30 +249,27 @@ WIDGET *widget; return result; } -int -pt_in_widget(point, widget) -Point *point; -WIDGET *widget; +Datum +pt_in_widget(PG_FUNCTION_ARGS) { - extern double point_dt(); + Point *point = PG_GETARG_POINT_P(0); + WIDGET *widget = (WIDGET *) PG_GETARG_POINTER(1); - return point_dt(point, &widget->center) < widget->radius; + PG_RETURN_BOOL(point_dt(point, &widget->center) < widget->radius); } -#define ABS(X) ((X) > 0 ? (X) : -(X)) - -int -boxarea(box) - -BOX *box; +#define ABS(X) ((X) >= 0 ? (X) : -(X)) +Datum +boxarea(PG_FUNCTION_ARGS) { - int width, + BOX *box = PG_GETARG_BOX_P(0); + double width, height; width = ABS(box->high.x - box->low.x); height = ABS(box->high.y - box->low.y); - return width * height; + PG_RETURN_FLOAT8(width * height); } char * @@ -419,7 +416,7 @@ funny_dup17(PG_FUNCTION_ARGS) } extern Datum ttdummy(PG_FUNCTION_ARGS); -int32 set_ttdummy(int32 on); +extern Datum set_ttdummy(PG_FUNCTION_ARGS); #define TTDUMMY_INFINITY 999999 @@ -622,27 +619,27 @@ ttdummy(PG_FUNCTION_ARGS) return PointerGetDatum(rettuple); } -int32 -set_ttdummy(int32 on) +Datum +set_ttdummy(PG_FUNCTION_ARGS) { + int32 on = PG_GETARG_INT32(0); if (ttoff) /* OFF currently */ { if (on == 0) - return 0; + PG_RETURN_INT32(0); /* turn ON */ ttoff = false; - return 0; + PG_RETURN_INT32(0); } /* ON currently */ if (on != 0) - return 1; + PG_RETURN_INT32(1); /* turn OFF */ ttoff = true; - return 1; - + PG_RETURN_INT32(1); }