Commit f2d12053 authored by Tom Lane's avatar Tom Lane

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 ...
parent 8f057d97
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -47,7 +47,6 @@ static BlockNumber gistChooseSubtree(Relation r, IndexTuple itup, int level,
static OffsetNumber gistchoose(Relation r, Page p, IndexTuple it, static OffsetNumber gistchoose(Relation r, Page p, IndexTuple it,
GISTSTATE *giststate); GISTSTATE *giststate);
static int gistnospace(Page p, IndexTuple it); 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 IndexTuple gist_tuple_replacekey(Relation r, GISTENTRY entry, IndexTuple t);
static void gistcentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, static void gistcentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr,
Relation r, Page pg, OffsetNumber o, int b, bool l); Relation r, Page pg, OffsetNumber o, int b, bool l);
...@@ -60,17 +59,20 @@ static char *int_range_out(INTRANGE *r); ...@@ -60,17 +59,20 @@ static char *int_range_out(INTRANGE *r);
/* /*
** routine to build an index. Basically calls insert over and over ** routine to build an index. Basically calls insert over and over
*/ */
void Datum
gistbuild(Relation heap, gistbuild(PG_FUNCTION_ARGS)
Relation index,
int natts,
AttrNumber *attnum,
IndexStrategy istrat,
uint16 pint,
Datum *params,
FuncIndexInfo *finfo,
PredInfo *predInfo)
{ {
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; HeapScanDesc scan;
AttrNumber i; AttrNumber i;
HeapTuple htup; HeapTuple htup;
...@@ -83,12 +85,10 @@ gistbuild(Relation heap, ...@@ -83,12 +85,10 @@ gistbuild(Relation heap,
int nb, int nb,
nh, nh,
ni; ni;
#ifndef OMIT_PARTIAL_INDEX #ifndef OMIT_PARTIAL_INDEX
ExprContext *econtext; ExprContext *econtext;
TupleTable tupleTable; TupleTable tupleTable;
TupleTableSlot *slot; TupleTableSlot *slot;
#endif #endif
Node *pred, Node *pred,
*oldPred; *oldPred;
...@@ -302,6 +302,8 @@ gistbuild(Relation heap, ...@@ -302,6 +302,8 @@ gistbuild(Relation heap,
/* be tidy */ /* be tidy */
pfree(nulls); pfree(nulls);
pfree(d); pfree(d);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
...@@ -310,9 +312,16 @@ gistbuild(Relation heap, ...@@ -310,9 +312,16 @@ gistbuild(Relation heap,
* This is the public interface routine for tuple insertion in GiSTs. * 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. * It doesn't do any work; just locks the relation and passes the buck.
*/ */
InsertIndexResult Datum
gistinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) 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; InsertIndexResult res;
IndexTuple itup; IndexTuple itup;
GISTSTATE giststate; GISTSTATE giststate;
...@@ -351,7 +360,7 @@ gistinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation ...@@ -351,7 +360,7 @@ gistinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation
pfree(itup); pfree(itup);
pfree(compvec); pfree(compvec);
return res; PG_RETURN_POINTER(res);
} }
/* /*
...@@ -596,7 +605,9 @@ gistAdjustKeys(Relation r, ...@@ -596,7 +605,9 @@ gistAdjustKeys(Relation r,
/* delete old tuple */ /* delete old tuple */
ItemPointerSet(&oldtid, stk->gs_blk, stk->gs_child); ItemPointerSet(&oldtid, stk->gs_blk, stk->gs_child);
gistdelete(r, (ItemPointer) &oldtid); DirectFunctionCall2(gistdelete,
PointerGetDatum(r),
PointerGetDatum(&oldtid));
/* generate and insert new tuple */ /* generate and insert new tuple */
tupDesc = r->rd_att; tupDesc = r->rd_att;
...@@ -890,7 +901,9 @@ gistintinsert(Relation r, ...@@ -890,7 +901,9 @@ gistintinsert(Relation r,
/* remove old left pointer, insert the 2 new entries */ /* remove old left pointer, insert the 2 new entries */
ItemPointerSet(&ltid, stk->gs_blk, stk->gs_child); ItemPointerSet(&ltid, stk->gs_blk, stk->gs_child);
gistdelete(r, (ItemPointer) &ltid); DirectFunctionCall2(gistdelete,
PointerGetDatum(r),
PointerGetDatum(&ltid));
gistentryinserttwo(r, stk, ltup, rtup, giststate); gistentryinserttwo(r, stk, ltup, rtup, giststate);
} }
...@@ -1105,9 +1118,11 @@ gistfreestack(GISTSTACK *s) ...@@ -1105,9 +1118,11 @@ gistfreestack(GISTSTACK *s)
/* /*
** remove an entry from a page ** remove an entry from a page
*/ */
void Datum
gistdelete(Relation r, ItemPointer tid) gistdelete(PG_FUNCTION_ARGS)
{ {
Relation r = (Relation) PG_GETARG_POINTER(0);
ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
BlockNumber blkno; BlockNumber blkno;
OffsetNumber offnum; OffsetNumber offnum;
Buffer buf; Buffer buf;
...@@ -1134,6 +1149,7 @@ gistdelete(Relation r, ItemPointer tid) ...@@ -1134,6 +1149,7 @@ gistdelete(Relation r, ItemPointer tid)
WriteBuffer(buf); WriteBuffer(buf);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void void
......
...@@ -29,21 +29,23 @@ static bool gistindex_keytest(IndexTuple tuple, TupleDesc tupdesc, ...@@ -29,21 +29,23 @@ static bool gistindex_keytest(IndexTuple tuple, TupleDesc tupdesc,
Relation r, Page p, OffsetNumber offset); Relation r, Page p, OffsetNumber offset);
RetrieveIndexResult Datum
gistgettuple(IndexScanDesc s, ScanDirection dir) gistgettuple(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1);
RetrieveIndexResult res; RetrieveIndexResult res;
/* if we have it cached in the scan desc, just return the value */ /* if we have it cached in the scan desc, just return the value */
if ((res = gistscancache(s, dir)) != (RetrieveIndexResult) NULL) if ((res = gistscancache(s, dir)) != (RetrieveIndexResult) NULL)
return res; PG_RETURN_POINTER(res);
/* not cached, so we'll have to do some work */ /* not cached, so we'll have to do some work */
if (ItemPointerIsValid(&(s->currentItemData))) if (ItemPointerIsValid(&(s->currentItemData)))
res = gistnext(s, dir); res = gistnext(s, dir);
else else
res = gistfirst(s, dir); res = gistfirst(s, dir);
return res; PG_RETURN_POINTER(res);
} }
static RetrieveIndexResult static RetrieveIndexResult
......
...@@ -48,12 +48,13 @@ typedef GISTScanListData *GISTScanList; ...@@ -48,12 +48,13 @@ typedef GISTScanListData *GISTScanList;
/* pointer to list of local scans on GiSTs */ /* pointer to list of local scans on GiSTs */
static GISTScanList GISTScans = (GISTScanList) NULL; static GISTScanList GISTScans = (GISTScanList) NULL;
IndexScanDesc Datum
gistbeginscan(Relation r, gistbeginscan(PG_FUNCTION_ARGS)
bool fromEnd,
uint16 nkeys,
ScanKey key)
{ {
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; IndexScanDesc s;
/* /*
...@@ -65,21 +66,18 @@ gistbeginscan(Relation r, ...@@ -65,21 +66,18 @@ gistbeginscan(Relation r,
s = RelationGetIndexScan(r, fromEnd, nkeys, key); s = RelationGetIndexScan(r, fromEnd, nkeys, key);
gistregscan(s); gistregscan(s);
return s; PG_RETURN_POINTER(s);
} }
void Datum
gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key) 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; GISTScanOpaque p;
int i; int i;
if (!IndexScanIsValid(s))
{
elog(ERROR, "gistrescan: invalid scan.");
return;
}
/* /*
* Clear all the pointers. * Clear all the pointers.
*/ */
...@@ -155,11 +153,14 @@ gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key) ...@@ -155,11 +153,14 @@ gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key)
s->keyData[i].sk_func = p->giststate->consistentFn; s->keyData[i].sk_func = p->giststate->consistentFn;
} }
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void Datum
gistmarkpos(IndexScanDesc s) gistmarkpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
GISTScanOpaque p; GISTScanOpaque p;
GISTSTACK *o, GISTSTACK *o,
*n, *n,
...@@ -188,11 +189,14 @@ gistmarkpos(IndexScanDesc s) ...@@ -188,11 +189,14 @@ gistmarkpos(IndexScanDesc s)
gistfreestack(p->s_markstk); gistfreestack(p->s_markstk);
p->s_markstk = o; p->s_markstk = o;
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void Datum
gistrestrpos(IndexScanDesc s) gistrestrpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
GISTScanOpaque p; GISTScanOpaque p;
GISTSTACK *o, GISTSTACK *o,
*n, *n,
...@@ -221,12 +225,15 @@ gistrestrpos(IndexScanDesc s) ...@@ -221,12 +225,15 @@ gistrestrpos(IndexScanDesc s)
gistfreestack(p->s_stack); gistfreestack(p->s_stack);
p->s_stack = o; p->s_stack = o;
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void Datum
gistendscan(IndexScanDesc s) gistendscan(PG_FUNCTION_ARGS)
{ {
GISTScanOpaque p; IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
GISTScanOpaque p;
p = (GISTScanOpaque) s->opaque; p = (GISTScanOpaque) s->opaque;
...@@ -239,6 +246,8 @@ gistendscan(IndexScanDesc s) ...@@ -239,6 +246,8 @@ gistendscan(IndexScanDesc s)
gistdropscan(s); gistdropscan(s);
/* XXX don't unset read lock -- two-phase locking */ /* XXX don't unset read lock -- two-phase locking */
PG_RETURN_POINTER(NULL); /* no real return value */
} }
static void static void
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* This file contains only the public interface routines. * This file contains only the public interface routines.
...@@ -36,17 +36,20 @@ bool BuildingHash = false; ...@@ -36,17 +36,20 @@ bool BuildingHash = false;
* since the index won't be visible until this transaction commits * since the index won't be visible until this transaction commits
* and since building is guaranteed to be single-threaded. * and since building is guaranteed to be single-threaded.
*/ */
void Datum
hashbuild(Relation heap, hashbuild(PG_FUNCTION_ARGS)
Relation index,
int natts,
AttrNumber *attnum,
IndexStrategy istrat,
uint16 pcount,
Datum *params,
FuncIndexInfo *finfo,
PredInfo *predInfo)
{ {
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; HeapScanDesc hscan;
HeapTuple htup; HeapTuple htup;
IndexTuple itup; IndexTuple itup;
...@@ -262,6 +265,8 @@ hashbuild(Relation heap, ...@@ -262,6 +265,8 @@ hashbuild(Relation heap,
/* all done */ /* all done */
BuildingHash = false; BuildingHash = false;
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
...@@ -271,20 +276,26 @@ hashbuild(Relation heap, ...@@ -271,20 +276,26 @@ hashbuild(Relation heap,
* for the new tuple, put it there, and return an InsertIndexResult * for the new tuple, put it there, and return an InsertIndexResult
* to the caller. * to the caller.
*/ */
InsertIndexResult Datum
hashinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) 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; HashItem hitem;
IndexTuple itup; IndexTuple itup;
InsertIndexResult res;
/* generate an index tuple */ /* generate an index tuple */
itup = index_formtuple(RelationGetDescr(rel), datum, nulls); itup = index_formtuple(RelationGetDescr(rel), datum, nulls);
itup->t_tid = *ht_ctid; itup->t_tid = *ht_ctid;
if (itup->t_info & INDEX_NULL_MASK) if (itup->t_info & INDEX_NULL_MASK)
return (InsertIndexResult) NULL; PG_RETURN_POINTER((InsertIndexResult) NULL);
hitem = _hash_formitem(itup); hitem = _hash_formitem(itup);
...@@ -293,16 +304,18 @@ hashinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relatio ...@@ -293,16 +304,18 @@ hashinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relatio
pfree(hitem); pfree(hitem);
pfree(itup); pfree(itup);
return res; PG_RETURN_POINTER(res);
} }
/* /*
* hashgettuple() -- Get the next tuple in the scan. * hashgettuple() -- Get the next tuple in the scan.
*/ */
char * Datum
hashgettuple(IndexScanDesc scan, ScanDirection dir) hashgettuple(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1);
RetrieveIndexResult res; RetrieveIndexResult res;
/* /*
...@@ -316,19 +329,20 @@ hashgettuple(IndexScanDesc scan, ScanDirection dir) ...@@ -316,19 +329,20 @@ hashgettuple(IndexScanDesc scan, ScanDirection dir)
else else
res = _hash_first(scan, dir); res = _hash_first(scan, dir);
return (char *) res; PG_RETURN_POINTER(res);
} }
/* /*
* hashbeginscan() -- start a scan on a hash index * hashbeginscan() -- start a scan on a hash index
*/ */
char * Datum
hashbeginscan(Relation rel, hashbeginscan(PG_FUNCTION_ARGS)
bool fromEnd,
uint16 keysz,
ScanKey scankey)
{ {
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; IndexScanDesc scan;
HashScanOpaque so; HashScanOpaque so;
...@@ -341,15 +355,20 @@ hashbeginscan(Relation rel, ...@@ -341,15 +355,20 @@ hashbeginscan(Relation rel,
/* register scan in case we change pages it's using */ /* register scan in case we change pages it's using */
_hash_regscan(scan); _hash_regscan(scan);
return (char *) scan; PG_RETURN_POINTER(scan);
} }
/* /*
* hashrescan() -- rescan an index relation * hashrescan() -- rescan an index relation
*/ */
void Datum
hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) 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; ItemPointer iptr;
HashScanOpaque so; HashScanOpaque so;
...@@ -376,15 +395,17 @@ hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) ...@@ -376,15 +395,17 @@ hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey)
scankey, scankey,
scan->numberOfKeys * sizeof(ScanKeyData)); scan->numberOfKeys * sizeof(ScanKeyData));
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
* hashendscan() -- close down a scan * hashendscan() -- close down a scan
*/ */
void Datum
hashendscan(IndexScanDesc scan) hashendscan(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ItemPointer iptr; ItemPointer iptr;
HashScanOpaque so; HashScanOpaque so;
...@@ -411,26 +432,21 @@ hashendscan(IndexScanDesc scan) ...@@ -411,26 +432,21 @@ hashendscan(IndexScanDesc scan)
/* be tidy */ /* be tidy */
pfree(scan->opaque); pfree(scan->opaque);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
* hashmarkpos() -- save current scan position * hashmarkpos() -- save current scan position
* *
*/ */
void Datum
hashmarkpos(IndexScanDesc scan) hashmarkpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ItemPointer iptr; ItemPointer iptr;
HashScanOpaque so; 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; so = (HashScanOpaque) scan->opaque;
/* release lock on old marked data, if any */ /* release lock on old marked data, if any */
...@@ -449,25 +465,20 @@ hashmarkpos(IndexScanDesc scan) ...@@ -449,25 +465,20 @@ hashmarkpos(IndexScanDesc scan)
HASH_READ); HASH_READ);
scan->currentMarkData = scan->currentItemData; scan->currentMarkData = scan->currentItemData;
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
* hashrestrpos() -- restore scan to last saved position * hashrestrpos() -- restore scan to last saved position
*/ */
void Datum
hashrestrpos(IndexScanDesc scan) hashrestrpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ItemPointer iptr; ItemPointer iptr;
HashScanOpaque so; 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; so = (HashScanOpaque) scan->opaque;
/* release lock on current data, if any */ /* release lock on current data, if any */
...@@ -487,15 +498,22 @@ hashrestrpos(IndexScanDesc scan) ...@@ -487,15 +498,22 @@ hashrestrpos(IndexScanDesc scan)
scan->currentItemData = scan->currentMarkData; scan->currentItemData = scan->currentMarkData;
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* stubs */ /* stubs */
void Datum
hashdelete(Relation rel, ItemPointer tid) 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 */ /* adjust any active scans that will be affected by this deletion */
_hash_adjscans(rel, tid); _hash_adjscans(rel, tid);
/* delete the data from the page */ /* delete the data from the page */
_hash_pagedel(rel, tid); _hash_pagedel(rel, tid);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
* index_open - open an index relation by relationId * index_open - open an index relation by relationId
...@@ -195,13 +195,12 @@ index_insert(Relation relation, ...@@ -195,13 +195,12 @@ index_insert(Relation relation,
* ---------------- * ----------------
*/ */
specificResult = (InsertIndexResult) specificResult = (InsertIndexResult)
DatumGetPointer(OidFunctionCall6(procedure, DatumGetPointer(OidFunctionCall5(procedure,
PointerGetDatum(relation), PointerGetDatum(relation),
PointerGetDatum(datum), PointerGetDatum(datum),
PointerGetDatum(nulls), PointerGetDatum(nulls),
PointerGetDatum(heap_t_ctid), PointerGetDatum(heap_t_ctid),
PointerGetDatum(heapRel), PointerGetDatum(heapRel)));
PointerGetDatum(NULL)));
/* must be pfree'ed */ /* must be pfree'ed */
return specificResult; return specificResult;
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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); ...@@ -42,17 +42,20 @@ static void _bt_restscan(IndexScanDesc scan);
* since the index won't be visible until this transaction commits * since the index won't be visible until this transaction commits
* and since building is guaranteed to be single-threaded. * and since building is guaranteed to be single-threaded.
*/ */
void Datum
btbuild(Relation heap, btbuild(PG_FUNCTION_ARGS)
Relation index,
int natts,
AttrNumber *attnum,
IndexStrategy istrat,
uint16 pcount,
Datum *params,
FuncIndexInfo *finfo,
PredInfo *predInfo)
{ {
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; HeapScanDesc hscan;
HeapTuple htup; HeapTuple htup;
IndexTuple itup; IndexTuple itup;
...@@ -332,6 +335,8 @@ btbuild(Relation heap, ...@@ -332,6 +335,8 @@ btbuild(Relation heap,
/* all done */ /* all done */
BuildingBtree = false; BuildingBtree = false;
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
...@@ -341,12 +346,17 @@ btbuild(Relation heap, ...@@ -341,12 +346,17 @@ btbuild(Relation heap,
* new tuple, put it there, set its unique OID as appropriate, and * new tuple, put it there, set its unique OID as appropriate, and
* return an InsertIndexResult to the caller. * return an InsertIndexResult to the caller.
*/ */
InsertIndexResult Datum
btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) 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; BTItem btitem;
IndexTuple itup; IndexTuple itup;
InsertIndexResult res;
/* generate an index tuple */ /* generate an index tuple */
itup = index_formtuple(RelationGetDescr(rel), datum, nulls); itup = index_formtuple(RelationGetDescr(rel), datum, nulls);
...@@ -355,7 +365,8 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation ...@@ -355,7 +365,8 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation
/* /*
* See comments in btbuild. * 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); btitem = _bt_formitem(itup);
...@@ -366,15 +377,17 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation ...@@ -366,15 +377,17 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation
pfree(btitem); pfree(btitem);
pfree(itup); pfree(itup);
return res; PG_RETURN_POINTER(res);
} }
/* /*
* btgettuple() -- Get the next tuple in the scan. * btgettuple() -- Get the next tuple in the scan.
*/ */
char * Datum
btgettuple(IndexScanDesc scan, ScanDirection dir) btgettuple(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1);
RetrieveIndexResult res; RetrieveIndexResult res;
/* /*
...@@ -403,18 +416,23 @@ btgettuple(IndexScanDesc scan, ScanDirection dir) ...@@ -403,18 +416,23 @@ btgettuple(IndexScanDesc scan, ScanDirection dir)
if (res) if (res)
{ {
((BTScanOpaque) scan->opaque)->curHeapIptr = res->heap_iptr; ((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 * btbeginscan() -- start a scan on a btree index
*/ */
char * Datum
btbeginscan(Relation rel, bool fromEnd, uint16 keysz, ScanKey scankey) 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; IndexScanDesc scan;
/* get the scan */ /* get the scan */
...@@ -423,15 +441,20 @@ btbeginscan(Relation rel, bool fromEnd, uint16 keysz, ScanKey scankey) ...@@ -423,15 +441,20 @@ btbeginscan(Relation rel, bool fromEnd, uint16 keysz, ScanKey scankey)
/* register scan in case we change pages it's using */ /* register scan in case we change pages it's using */
_bt_regscan(scan); _bt_regscan(scan);
return (char *) scan; PG_RETURN_POINTER(scan);
} }
/* /*
* btrescan() -- rescan an index relation * btrescan() -- rescan an index relation
*/ */
void Datum
btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) 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; ItemPointer iptr;
BTScanOpaque so; BTScanOpaque so;
...@@ -479,6 +502,7 @@ btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey) ...@@ -479,6 +502,7 @@ btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey)
so->numberOfKeys * sizeof(ScanKeyData)); so->numberOfKeys * sizeof(ScanKeyData));
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void void
...@@ -504,9 +528,10 @@ btmovescan(IndexScanDesc scan, Datum v) ...@@ -504,9 +528,10 @@ btmovescan(IndexScanDesc scan, Datum v)
/* /*
* btendscan() -- close down a scan * btendscan() -- close down a scan
*/ */
void Datum
btendscan(IndexScanDesc scan) btendscan(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ItemPointer iptr; ItemPointer iptr;
BTScanOpaque so; BTScanOpaque so;
...@@ -534,14 +559,17 @@ btendscan(IndexScanDesc scan) ...@@ -534,14 +559,17 @@ btendscan(IndexScanDesc scan)
pfree(so); pfree(so);
_bt_dropscan(scan); _bt_dropscan(scan);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
* btmarkpos() -- save current scan position * btmarkpos() -- save current scan position
*/ */
void Datum
btmarkpos(IndexScanDesc scan) btmarkpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ItemPointer iptr; ItemPointer iptr;
BTScanOpaque so; BTScanOpaque so;
...@@ -563,14 +591,17 @@ btmarkpos(IndexScanDesc scan) ...@@ -563,14 +591,17 @@ btmarkpos(IndexScanDesc scan)
scan->currentMarkData = scan->currentItemData; scan->currentMarkData = scan->currentItemData;
so->mrkHeapIptr = so->curHeapIptr; so->mrkHeapIptr = so->curHeapIptr;
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
* btrestrpos() -- restore scan to last saved position * btrestrpos() -- restore scan to last saved position
*/ */
void Datum
btrestrpos(IndexScanDesc scan) btrestrpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0);
ItemPointer iptr; ItemPointer iptr;
BTScanOpaque so; BTScanOpaque so;
...@@ -593,17 +624,24 @@ btrestrpos(IndexScanDesc scan) ...@@ -593,17 +624,24 @@ btrestrpos(IndexScanDesc scan)
scan->currentItemData = scan->currentMarkData; scan->currentItemData = scan->currentMarkData;
so->curHeapIptr = so->mrkHeapIptr; so->curHeapIptr = so->mrkHeapIptr;
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* stubs */ /* stubs */
void Datum
btdelete(Relation rel, ItemPointer tid) 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 */ /* adjust any active scans that will be affected by this deletion */
_bt_adjscans(rel, tid); _bt_adjscans(rel, tid);
/* delete the data from the page */ /* delete the data from the page */
_bt_pagedel(rel, tid); _bt_pagedel(rel, tid);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
static void static void
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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); ...@@ -28,21 +28,23 @@ static RetrieveIndexResult rtnext(IndexScanDesc s, ScanDirection dir);
static ItemPointer rtheapptr(Relation r, ItemPointer itemp); static ItemPointer rtheapptr(Relation r, ItemPointer itemp);
RetrieveIndexResult Datum
rtgettuple(IndexScanDesc s, ScanDirection dir) rtgettuple(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
ScanDirection dir = (ScanDirection) PG_GETARG_INT32(1);
RetrieveIndexResult res; RetrieveIndexResult res;
/* if we have it cached in the scan desc, just return the value */ /* if we have it cached in the scan desc, just return the value */
if ((res = rtscancache(s, dir)) != (RetrieveIndexResult) NULL) if ((res = rtscancache(s, dir)) != (RetrieveIndexResult) NULL)
return res; PG_RETURN_POINTER(res);
/* not cached, so we'll have to do some work */ /* not cached, so we'll have to do some work */
if (ItemPointerIsValid(&(s->currentItemData))) if (ItemPointerIsValid(&(s->currentItemData)))
res = rtnext(s, dir); res = rtnext(s, dir);
else else
res = rtfirst(s, dir); res = rtfirst(s, dir);
return res; PG_RETURN_POINTER(res);
} }
static RetrieveIndexResult static RetrieveIndexResult
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -102,13 +102,15 @@ rt_poly_union(POLYGON *a, POLYGON *b)
return p; return p;
} }
void Datum
rt_poly_size(POLYGON *a, float *size) 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, double xdim,
ydim; ydim;
size = (float *) palloc(sizeof(float));
if (a == (POLYGON *) NULL || if (a == (POLYGON *) NULL ||
a->boundbox.high.x <= a->boundbox.low.x || a->boundbox.high.x <= a->boundbox.low.x ||
a->boundbox.high.y <= a->boundbox.low.y) a->boundbox.high.y <= a->boundbox.low.y)
...@@ -121,7 +123,7 @@ rt_poly_size(POLYGON *a, float *size) ...@@ -121,7 +123,7 @@ rt_poly_size(POLYGON *a, float *size)
*size = (float) (xdim * ydim); *size = (float) (xdim * ydim);
} }
return; PG_RETURN_POINTER(NULL); /* no real return value */
} }
POLYGON * POLYGON *
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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); ...@@ -59,17 +59,20 @@ static int nospace(Page p, IndexTuple it);
static void initRtstate(RTSTATE *rtstate, Relation index); static void initRtstate(RTSTATE *rtstate, Relation index);
void Datum
rtbuild(Relation heap, rtbuild(PG_FUNCTION_ARGS)
Relation index,
int natts,
AttrNumber *attnum,
IndexStrategy istrat,
uint16 pcount,
Datum *params,
FuncIndexInfo *finfo,
PredInfo *predInfo)
{ {
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; HeapScanDesc scan;
AttrNumber i; AttrNumber i;
HeapTuple htup; HeapTuple htup;
...@@ -277,6 +280,8 @@ rtbuild(Relation heap, ...@@ -277,6 +280,8 @@ rtbuild(Relation heap,
/* be tidy */ /* be tidy */
pfree(nulls); pfree(nulls);
pfree(d); pfree(d);
PG_RETURN_POINTER(NULL); /* no real return value */
} }
/* /*
...@@ -285,9 +290,16 @@ rtbuild(Relation heap, ...@@ -285,9 +290,16 @@ rtbuild(Relation heap,
* This is the public interface routine for tuple insertion in rtrees. * 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. * It doesn't do any work; just locks the relation and passes the buck.
*/ */
InsertIndexResult Datum
rtinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel) 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; InsertIndexResult res;
IndexTuple itup; IndexTuple itup;
RTSTATE rtState; RTSTATE rtState;
...@@ -305,7 +317,7 @@ rtinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation he ...@@ -305,7 +317,7 @@ rtinsert(Relation r, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation he
res = rtdoinsert(r, itup, &rtState); res = rtdoinsert(r, itup, &rtState);
return res; PG_RETURN_POINTER(res);
} }
static InsertIndexResult static InsertIndexResult
...@@ -982,9 +994,11 @@ freestack(RTSTACK *s) ...@@ -982,9 +994,11 @@ freestack(RTSTACK *s)
} }
} }
char * Datum
rtdelete(Relation r, ItemPointer tid) rtdelete(PG_FUNCTION_ARGS)
{ {
Relation r = (Relation) PG_GETARG_POINTER(0);
ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
BlockNumber blkno; BlockNumber blkno;
OffsetNumber offnum; OffsetNumber offnum;
Buffer buf; Buffer buf;
...@@ -1011,7 +1025,7 @@ rtdelete(Relation r, ItemPointer tid) ...@@ -1011,7 +1025,7 @@ rtdelete(Relation r, ItemPointer tid)
WriteBuffer(buf); WriteBuffer(buf);
return (char *) NULL; PG_RETURN_POINTER(NULL); /* no real return value */
} }
static void static void
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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; ...@@ -51,12 +51,13 @@ typedef RTScanListData *RTScanList;
/* pointer to list of local scans on rtrees */ /* pointer to list of local scans on rtrees */
static RTScanList RTScans = (RTScanList) NULL; static RTScanList RTScans = (RTScanList) NULL;
IndexScanDesc Datum
rtbeginscan(Relation r, rtbeginscan(PG_FUNCTION_ARGS)
bool fromEnd,
uint16 nkeys,
ScanKey key)
{ {
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; IndexScanDesc s;
/* /*
...@@ -68,22 +69,19 @@ rtbeginscan(Relation r, ...@@ -68,22 +69,19 @@ rtbeginscan(Relation r,
s = RelationGetIndexScan(r, fromEnd, nkeys, key); s = RelationGetIndexScan(r, fromEnd, nkeys, key);
rtregscan(s); rtregscan(s);
return s; PG_RETURN_POINTER(s);
} }
void Datum
rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key) 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; RTreeScanOpaque p;
RegProcedure internal_proc; RegProcedure internal_proc;
int i; int i;
if (!IndexScanIsValid(s))
{
elog(ERROR, "rtrescan: invalid scan.");
return;
}
/* /*
* Clear all the pointers. * Clear all the pointers.
*/ */
...@@ -157,11 +155,14 @@ rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key) ...@@ -157,11 +155,14 @@ rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key)
} }
} }
} }
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void Datum
rtmarkpos(IndexScanDesc s) rtmarkpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
RTreeScanOpaque p; RTreeScanOpaque p;
RTSTACK *o, RTSTACK *o,
*n, *n,
...@@ -190,11 +191,14 @@ rtmarkpos(IndexScanDesc s) ...@@ -190,11 +191,14 @@ rtmarkpos(IndexScanDesc s)
freestack(p->s_markstk); freestack(p->s_markstk);
p->s_markstk = o; p->s_markstk = o;
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void Datum
rtrestrpos(IndexScanDesc s) rtrestrpos(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
RTreeScanOpaque p; RTreeScanOpaque p;
RTSTACK *o, RTSTACK *o,
*n, *n,
...@@ -223,11 +227,14 @@ rtrestrpos(IndexScanDesc s) ...@@ -223,11 +227,14 @@ rtrestrpos(IndexScanDesc s)
freestack(p->s_stack); freestack(p->s_stack);
p->s_stack = o; p->s_stack = o;
PG_RETURN_POINTER(NULL); /* no real return value */
} }
void Datum
rtendscan(IndexScanDesc s) rtendscan(PG_FUNCTION_ARGS)
{ {
IndexScanDesc s = (IndexScanDesc) PG_GETARG_POINTER(0);
RTreeScanOpaque p; RTreeScanOpaque p;
p = (RTreeScanOpaque) s->opaque; p = (RTreeScanOpaque) s->opaque;
...@@ -241,6 +248,8 @@ rtendscan(IndexScanDesc s) ...@@ -241,6 +248,8 @@ rtendscan(IndexScanDesc s)
rtdropscan(s); rtdropscan(s);
/* XXX don't unset read lock -- two-phase locking */ /* XXX don't unset read lock -- two-phase locking */
PG_RETURN_POINTER(NULL); /* no real return value */
} }
static void static void
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -409,8 +409,8 @@ TypeCreate(char *typeName,
/* /*
* For array types, the input procedures may take 3 args (data * For array types, the input procedures may take 3 args (data
* value, element OID, atttypmod); the pg_proc argtype * value, element OID, atttypmod); the pg_proc argtype
* signature is 0,0,INT4OID. The output procedures may take 2 * signature is 0,OIDOID,INT4OID. The output procedures may
* args (data value, element OID). * take 2 args (data value, element OID).
*/ */
if (OidIsValid(elementObjectId)) if (OidIsValid(elementObjectId))
{ {
...@@ -420,11 +420,13 @@ TypeCreate(char *typeName, ...@@ -420,11 +420,13 @@ TypeCreate(char *typeName,
{ {
/* output proc */ /* output proc */
nargs = 2; nargs = 2;
argList[1] = OIDOID;
} }
else else
{ {
/* input proc */ /* input proc */
nargs = 3; nargs = 3;
argList[1] = OIDOID;
argList[2] = INT4OID; argList[2] = INT4OID;
} }
tup = SearchSysCacheTuple(PROCNAME, tup = SearchSysCacheTuple(PROCNAME,
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -105,6 +105,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
econtext, econtext,
isNull, isNull,
isDone); isDone);
/* If refexpr yields NULL, result is always NULL, for now anyway */
if (*isNull) if (*isNull)
return (Datum) NULL; return (Datum) NULL;
} }
...@@ -132,6 +133,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, ...@@ -132,6 +133,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
econtext, econtext,
isNull, isNull,
&dummy); &dummy);
/* If any index expr yields NULL, result is NULL */
if (*isNull) if (*isNull)
return (Datum) NULL; return (Datum) NULL;
} }
...@@ -148,6 +150,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, ...@@ -148,6 +150,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
econtext, econtext,
isNull, isNull,
&dummy); &dummy);
/* If any index expr yields NULL, result is NULL */
if (*isNull) if (*isNull)
return (Datum) NULL; return (Datum) NULL;
} }
...@@ -165,7 +168,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef, ...@@ -165,7 +168,7 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
econtext, econtext,
isNull, isNull,
&dummy); &dummy);
/* For now, can't cope with inserting NULL into an array */
if (*isNull) if (*isNull)
return (Datum) NULL; return (Datum) NULL;
...@@ -175,30 +178,43 @@ ExecEvalArrayRef(ArrayRef *arrayRef, ...@@ -175,30 +178,43 @@ ExecEvalArrayRef(ArrayRef *arrayRef,
if (array_scanner == NULL) if (array_scanner == NULL)
return sourceData; /* XXX do something else? */ 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) if (lIndex == NULL)
return (Datum) array_set(array_scanner, i, upper.indx, return PointerGetDatum(array_set(array_scanner, i,
(char *) sourceData, upper.indx,
arrayRef->refelembyval, sourceData,
arrayRef->refelemlength, arrayRef->refelembyval,
arrayRef->refattrlength, isNull); arrayRef->refelemlength,
return (Datum) array_assgn(array_scanner, i, upper.indx, arrayRef->refattrlength,
lower.indx, isNull));
(ArrayType *) sourceData, return PointerGetDatum(array_assgn(array_scanner, i,
arrayRef->refelembyval, upper.indx, lower.indx,
arrayRef->refelemlength, isNull); (ArrayType *) DatumGetPointer(sourceData),
arrayRef->refelembyval,
arrayRef->refelemlength,
isNull));
} }
execConstByVal = arrayRef->refelembyval; execConstByVal = arrayRef->refelembyval;
execConstLen = arrayRef->refelemlength; execConstLen = arrayRef->refelemlength;
if (lIndex == NULL) if (lIndex == NULL)
return (Datum) array_ref(array_scanner, i, upper.indx, return array_ref(array_scanner, i,
arrayRef->refelembyval, upper.indx,
arrayRef->refelemlength, arrayRef->refelembyval,
arrayRef->refattrlength, isNull); arrayRef->refelemlength,
return (Datum) array_clip(array_scanner, i, upper.indx, lower.indx, arrayRef->refattrlength,
arrayRef->refelembyval, isNull);
arrayRef->refelemlength, isNull); return PointerGetDatum(array_clip(array_scanner, i,
upper.indx, lower.indx,
arrayRef->refelembyval,
arrayRef->refelemlength,
isNull));
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -450,7 +450,10 @@ make_const(Value *value)
} }
else else
{ {
val = PointerGetDatum(numeric_in(strVal(value), 0, -1)); val = DirectFunctionCall3(numeric_in,
CStringGetDatum(strVal(value)),
ObjectIdGetDatum(InvalidOid),
Int32GetDatum(-1));
typeid = NUMERICOID; typeid = NUMERICOID;
typelen = -1; /* variable len */ typelen = -1; /* variable len */
......
This diff is collapsed.
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* workings can be found in the book "Software Solutions in C" by * workings can be found in the book "Software Solutions in C" by
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7. * 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 <limits.h> #include <limits.h>
...@@ -535,31 +535,31 @@ cash_div_flt4(Cash *c, float4 *f) ...@@ -535,31 +535,31 @@ cash_div_flt4(Cash *c, float4 *f)
/* cash_mul_int4() /* cash_mul_int4()
* Multiply cash by int4. * Multiply cash by int4.
*/ */
Cash * Datum
cash_mul_int4(Cash *c, int4 i) cash_mul_int4(PG_FUNCTION_ARGS)
{ {
Cash *result; Cash c = PG_GETARG_CASH(0);
int32 i = PG_GETARG_INT32(1);
if (!PointerIsValid(c)) Cash result;
return NULL;
if (!PointerIsValid(result = palloc(sizeof(Cash))))
elog(ERROR, "Memory allocation failed, can't multiply cash");
*result = ((i) * (*c));
return result; result = c * i;
} /* cash_mul_int4() */ PG_RETURN_CASH(result);
}
/* int4_mul_cash() /* int4_mul_cash()
* Multiply int4 by cash. * Multiply int4 by cash.
*/ */
Cash * Datum
int4_mul_cash(int4 i, Cash *c) int4_mul_cash(PG_FUNCTION_ARGS)
{ {
return cash_mul_int4(c, i); int32 i = PG_GETARG_INT32(0);
} /* int4_mul_cash() */ Cash c = PG_GETARG_CASH(1);
Cash result;
result = i * c;
PG_RETURN_CASH(result);
}
/* cash_div_int4() /* cash_div_int4()
...@@ -568,24 +568,20 @@ int4_mul_cash(int4 i, Cash *c) ...@@ -568,24 +568,20 @@ int4_mul_cash(int4 i, Cash *c)
* XXX Don't know if rounding or truncating is correct behavior. * XXX Don't know if rounding or truncating is correct behavior.
* Round for now. - tgl 97/04/15 * Round for now. - tgl 97/04/15
*/ */
Cash * Datum
cash_div_int4(Cash *c, int4 i) cash_div_int4(PG_FUNCTION_ARGS)
{ {
Cash *result; Cash c = PG_GETARG_CASH(0);
int32 i = PG_GETARG_INT32(1);
if (!PointerIsValid(c)) Cash result;
return NULL;
if (!PointerIsValid(result = palloc(sizeof(Cash))))
elog(ERROR, "Memory allocation failed, can't divide cash");
if (i == 0) 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; PG_RETURN_CASH(result);
} /* cash_div_int4() */ }
/* cash_mul_int2() /* cash_mul_int2()
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -517,7 +517,7 @@ _ReadChunkArray(int *st,
Int32GetDatum(fp), Int32GetDatum(fp),
Int32GetDatum(srcOff), Int32GetDatum(srcOff),
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL(int);
jj = n - 1; jj = n - 1;
for (i = 0; i < n; chunk_off[i++] = 0) for (i = 0; i < n; chunk_off[i++] = 0)
...@@ -541,7 +541,7 @@ _ReadChunkArray(int *st, ...@@ -541,7 +541,7 @@ _ReadChunkArray(int *st,
Int32GetDatum((int32) destfp), Int32GetDatum((int32) destfp),
Int32GetDatum(bptr), Int32GetDatum(bptr),
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL(int);
} }
else else
destfp = baseDestFp + bptr; destfp = baseDestFp + bptr;
...@@ -556,7 +556,7 @@ _ReadChunkArray(int *st, ...@@ -556,7 +556,7 @@ _ReadChunkArray(int *st,
Int32GetDatum(fp), Int32GetDatum(fp),
Int32GetDatum(srcOff), Int32GetDatum(srcOff),
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL(int);
} }
for (i = n - 1, to_read = bsize; i >= 0; for (i = n - 1, to_read = bsize; i >= 0;
to_read *= min(C[i], array_span[i]), i--) to_read *= min(C[i], array_span[i]), i--)
...@@ -571,7 +571,7 @@ _ReadChunkArray(int *st, ...@@ -571,7 +571,7 @@ _ReadChunkArray(int *st,
Int32GetDatum(fp), Int32GetDatum(fp),
Int32GetDatum(srcOff), Int32GetDatum(srcOff),
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL(int);
} }
block_seek += cdist[j]; block_seek += cdist[j];
bptr += adist[j] * bsize; bptr += adist[j] * bsize;
...@@ -581,13 +581,13 @@ _ReadChunkArray(int *st, ...@@ -581,13 +581,13 @@ _ReadChunkArray(int *st,
Int32GetDatum((int32) destfp), Int32GetDatum((int32) destfp),
Int32GetDatum(bptr), Int32GetDatum(bptr),
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL(int);
} }
else else
destfp = baseDestFp + bptr; destfp = baseDestFp + bptr;
temp = _LOtransfer((char **) &destfp, to_read, 1, (char **) &fp, 1, isDestLO); temp = _LOtransfer((char **) &destfp, to_read, 1, (char **) &fp, 1, isDestLO);
if (temp < to_read) if (temp < to_read)
RETURN_NULL; RETURN_NULL(int);
srcOff += to_read; srcOff += to_read;
words_read += to_read; words_read += to_read;
bptr += to_read; bptr += to_read;
...@@ -702,7 +702,7 @@ _ReadChunkArray1El(int *st, ...@@ -702,7 +702,7 @@ _ReadChunkArray1El(int *st,
Int32GetDatum(fp), Int32GetDatum(fp),
Int32GetDatum(srcOff), Int32GetDatum(srcOff),
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL(struct varlena *);
#ifdef LOARRAY #ifdef LOARRAY
return (struct varlena *) return (struct varlena *)
DatumGetPointer(DirectFunctionCall2(loread, DatumGetPointer(DirectFunctionCall2(loread,
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 @@ ...@@ -48,12 +48,11 @@
*/ */
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <float.h> /* faked on sunos4 */ #include <float.h> /* faked on sunos4 */
#include <math.h> #include <math.h>
#include "postgres.h" #include "postgres.h"
#ifdef HAVE_LIMITS_H #ifdef HAVE_LIMITS_H
#include <limits.h> #include <limits.h>
#ifndef MAXINT #ifndef MAXINT
...@@ -64,6 +63,7 @@ ...@@ -64,6 +63,7 @@
#include <values.h> #include <values.h>
#endif #endif
#endif #endif
#include "fmgr.h" #include "fmgr.h"
#include "utils/builtins.h" #include "utils/builtins.h"
...@@ -844,15 +844,14 @@ dtoi2(PG_FUNCTION_ARGS) ...@@ -844,15 +844,14 @@ dtoi2(PG_FUNCTION_ARGS)
/* /*
* i4tod - converts an int4 number to a float8 number * i4tod - converts an int4 number to a float8 number
*/ */
float64 Datum
i4tod(int32 num) i4tod(PG_FUNCTION_ARGS)
{ {
float64 result; int32 num = PG_GETARG_INT32(0);
float8 result;
result = (float64) palloc(sizeof(float64data));
*result = num; result = num;
return result; PG_RETURN_FLOAT8(result);
} }
...@@ -909,15 +908,14 @@ ftoi2(PG_FUNCTION_ARGS) ...@@ -909,15 +908,14 @@ ftoi2(PG_FUNCTION_ARGS)
/* /*
* i4tof - converts an int4 number to a float8 number * i4tof - converts an int4 number to a float8 number
*/ */
float32 Datum
i4tof(int32 num) i4tof(PG_FUNCTION_ARGS)
{ {
float32 result; int32 num = PG_GETARG_INT32(0);
float4 result;
result = (float32) palloc(sizeof(float32data));
*result = num; result = num;
return result; PG_RETURN_FLOAT4(result);
} }
......
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.c * 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 * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
...@@ -3848,13 +3848,11 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, ...@@ -3848,13 +3848,11 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
* ---------- * ----------
*/ */
#define NUM_TOCHAR_prepare { \ #define NUM_TOCHAR_prepare { \
if (!PointerIsValid(fmt)) \
return NULL; \
\ \
len = VARSIZE(fmt) - VARHDRSZ; \ len = VARSIZE(fmt) - VARHDRSZ; \
\ \
if (!len) \ if (len <= 0) \
return textin(""); \ return PointerGetDatum(textin("")); \
\ \
result = (text *) palloc( (len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \ result = (text *) palloc( (len * NUM_MAX_ITEM_SIZ) + 1 + VARHDRSZ); \
format = NUM_cache(len, &Num, VARDATA(fmt), &flag); \ format = NUM_cache(len, &Num, VARDATA(fmt), &flag); \
...@@ -3891,26 +3889,24 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, ...@@ -3891,26 +3889,24 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number,
* NUMERIC to_number() (convert string to numeric) * NUMERIC to_number() (convert string to numeric)
* ------------------- * -------------------
*/ */
Numeric Datum
numeric_to_number(text *value, text *fmt) numeric_to_number(PG_FUNCTION_ARGS)
{ {
text *value = PG_GETARG_TEXT_P(0);
text *fmt = PG_GETARG_TEXT_P(1);
NUMDesc Num; NUMDesc Num;
Numeric result; Datum result;
FormatNode *format; FormatNode *format;
char *numstr; char *numstr;
int flag = 0; int flag = 0;
int len = 0; int len = 0;
int scale, int scale,
precision; precision;
if ((!PointerIsValid(value)) || (!PointerIsValid(fmt)))
return NULL;
len = VARSIZE(fmt) - VARHDRSZ; len = VARSIZE(fmt) - VARHDRSZ;
if (!len) if (len <= 0)
return numeric_in(NULL, 0, 0); PG_RETURN_NULL();
format = NUM_cache(len, &Num, VARDATA(fmt), &flag); format = NUM_cache(len, &Num, VARDATA(fmt), &flag);
...@@ -3925,7 +3921,10 @@ numeric_to_number(text *value, text *fmt) ...@@ -3925,7 +3921,10 @@ numeric_to_number(text *value, text *fmt)
if (flag) if (flag)
pfree(format); 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); pfree(numstr);
return result; return result;
} }
...@@ -3934,9 +3933,11 @@ numeric_to_number(text *value, text *fmt) ...@@ -3934,9 +3933,11 @@ numeric_to_number(text *value, text *fmt)
* NUMERIC to_char() * NUMERIC to_char()
* ------------------ * ------------------
*/ */
text * Datum
numeric_to_char(Numeric value, text *fmt) numeric_to_char(PG_FUNCTION_ARGS)
{ {
Numeric value = PG_GETARG_NUMERIC(0);
text *fmt = PG_GETARG_TEXT_P(1);
NUMDesc Num; NUMDesc Num;
FormatNode *format; FormatNode *format;
text *result, text *result,
...@@ -3948,7 +3949,7 @@ numeric_to_char(Numeric value, text *fmt) ...@@ -3948,7 +3949,7 @@ numeric_to_char(Numeric value, text *fmt)
char *numstr, char *numstr,
*orgnum, *orgnum,
*p; *p;
Numeric x = NULL; Numeric x;
NUM_TOCHAR_prepare; NUM_TOCHAR_prepare;
...@@ -3958,10 +3959,11 @@ numeric_to_char(Numeric value, text *fmt) ...@@ -3958,10 +3959,11 @@ numeric_to_char(Numeric value, text *fmt)
*/ */
if (IS_ROMAN(&Num)) 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)); numstr = orgnum = int_to_roman(numeric_int4(x));
pfree(x); pfree(x);
} }
else else
{ {
...@@ -3969,8 +3971,10 @@ numeric_to_char(Numeric value, text *fmt) ...@@ -3969,8 +3971,10 @@ numeric_to_char(Numeric value, text *fmt)
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
Numeric a = int4_numeric(10); Numeric a = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
Numeric b = int4_numeric(Num.multi); Int32GetDatum(10)));
Numeric b = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
Int32GetDatum(Num.multi)));
x = numeric_power(a, b); x = numeric_power(a, b);
val = numeric_mul(value, x); val = numeric_mul(value, x);
...@@ -3980,8 +3984,11 @@ numeric_to_char(Numeric value, text *fmt) ...@@ -3980,8 +3984,11 @@ numeric_to_char(Numeric value, text *fmt)
Num.pre += Num.multi; Num.pre += Num.multi;
} }
x = numeric_round(val, Num.post); x = DatumGetNumeric(DirectFunctionCall2(numeric_round,
orgnum = numeric_out(x); NumericGetDatum(val),
Int32GetDatum(Num.post)));
orgnum = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(x)));
pfree(x); pfree(x);
if (*orgnum == '-') if (*orgnum == '-')
...@@ -4014,16 +4021,18 @@ numeric_to_char(Numeric value, text *fmt) ...@@ -4014,16 +4021,18 @@ numeric_to_char(Numeric value, text *fmt)
} }
NUM_TOCHAR_finish; NUM_TOCHAR_finish;
return result; PG_RETURN_TEXT_P(result);
} }
/* --------------- /* ---------------
* INT4 to_char() * INT4 to_char()
* --------------- * ---------------
*/ */
text * Datum
int4_to_char(int32 value, text *fmt) int4_to_char(PG_FUNCTION_ARGS)
{ {
int32 value = PG_GETARG_INT32(0);
text *fmt = PG_GETARG_TEXT_P(1);
NUMDesc Num; NUMDesc Num;
FormatNode *format; FormatNode *format;
text *result, text *result,
...@@ -4044,7 +4053,6 @@ int4_to_char(int32 value, text *fmt) ...@@ -4044,7 +4053,6 @@ int4_to_char(int32 value, text *fmt)
if (IS_ROMAN(&Num)) if (IS_ROMAN(&Num))
{ {
numstr = orgnum = int_to_roman(value); numstr = orgnum = int_to_roman(value);
} }
else else
{ {
...@@ -4097,16 +4105,18 @@ int4_to_char(int32 value, text *fmt) ...@@ -4097,16 +4105,18 @@ int4_to_char(int32 value, text *fmt)
} }
NUM_TOCHAR_finish; NUM_TOCHAR_finish;
return result; PG_RETURN_TEXT_P(result);
} }
/* --------------- /* ---------------
* INT8 to_char() * INT8 to_char()
* --------------- * ---------------
*/ */
text * Datum
int8_to_char(int64 *value, text *fmt) int8_to_char(PG_FUNCTION_ARGS)
{ {
int64 value = PG_GETARG_INT64(0);
text *fmt = PG_GETARG_TEXT_P(1);
NUMDesc Num; NUMDesc Num;
FormatNode *format; FormatNode *format;
text *result, text *result,
...@@ -4126,8 +4136,9 @@ int8_to_char(int64 *value, text *fmt) ...@@ -4126,8 +4136,9 @@ int8_to_char(int64 *value, text *fmt)
*/ */
if (IS_ROMAN(&Num)) 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 else
{ {
...@@ -4135,11 +4146,15 @@ int8_to_char(int64 *value, text *fmt) ...@@ -4135,11 +4146,15 @@ int8_to_char(int64 *value, text *fmt)
{ {
double multi = pow((double) 10, (double) Num.multi); 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; Num.pre += Num.multi;
} }
else
orgnum = int8out(value); orgnum = DatumGetCString(DirectFunctionCall1(int8out,
Int64GetDatum(value)));
len = strlen(orgnum); len = strlen(orgnum);
if (*orgnum == '-') if (*orgnum == '-')
...@@ -4178,16 +4193,18 @@ int8_to_char(int64 *value, text *fmt) ...@@ -4178,16 +4193,18 @@ int8_to_char(int64 *value, text *fmt)
} }
NUM_TOCHAR_finish; NUM_TOCHAR_finish;
return result; PG_RETURN_TEXT_P(result);
} }
/* ----------------- /* -----------------
* FLOAT4 to_char() * FLOAT4 to_char()
* ----------------- * -----------------
*/ */
text * Datum
float4_to_char(float32 value, text *fmt) float4_to_char(PG_FUNCTION_ARGS)
{ {
float4 value = PG_GETARG_FLOAT4(0);
text *fmt = PG_GETARG_TEXT_P(1);
NUMDesc Num; NUMDesc Num;
FormatNode *format; FormatNode *format;
text *result, text *result,
...@@ -4204,30 +4221,30 @@ float4_to_char(float32 value, text *fmt) ...@@ -4204,30 +4221,30 @@ float4_to_char(float32 value, text *fmt)
if (IS_ROMAN(&Num)) if (IS_ROMAN(&Num))
{ {
numstr = orgnum = int_to_roman((int) rint(*value)); numstr = orgnum = int_to_roman((int) rint(value));
} }
else else
{ {
float32 val = value; float4 val = value;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
float multi = pow((double) 10, (double) Num.multi); float multi = pow((double) 10, (double) Num.multi);
val = float4mul(value, (float32) &multi); val = value * multi;
Num.pre += Num.multi; Num.pre += Num.multi;
} }
orgnum = (char *) palloc(MAXFLOATWIDTH + 1); orgnum = (char *) palloc(MAXFLOATWIDTH + 1);
len = sprintf(orgnum, "%.0f", fabs(*val)); len = sprintf(orgnum, "%.0f", fabs(val));
if (Num.pre > len) if (Num.pre > len)
plen = Num.pre - len; plen = Num.pre - len;
if (len >= FLT_DIG) if (len >= FLT_DIG)
Num.post = 0; Num.post = 0;
else if (Num.post + len > FLT_DIG) else if (Num.post + len > FLT_DIG)
Num.post = FLT_DIG - len; Num.post = FLT_DIG - len;
sprintf(orgnum, "%.*f", Num.post, *val); sprintf(orgnum, "%.*f", Num.post, val);
if (*orgnum == '-') if (*orgnum == '-')
{ /* < 0 */ { /* < 0 */
...@@ -4256,16 +4273,18 @@ float4_to_char(float32 value, text *fmt) ...@@ -4256,16 +4273,18 @@ float4_to_char(float32 value, text *fmt)
} }
NUM_TOCHAR_finish; NUM_TOCHAR_finish;
return result; PG_RETURN_TEXT_P(result);
} }
/* ----------------- /* -----------------
* FLOAT8 to_char() * FLOAT8 to_char()
* ----------------- * -----------------
*/ */
text * Datum
float8_to_char(float64 value, text *fmt) float8_to_char(PG_FUNCTION_ARGS)
{ {
float8 value = PG_GETARG_FLOAT8(0);
text *fmt = PG_GETARG_TEXT_P(1);
NUMDesc Num; NUMDesc Num;
FormatNode *format; FormatNode *format;
text *result, text *result,
...@@ -4282,29 +4301,29 @@ float8_to_char(float64 value, text *fmt) ...@@ -4282,29 +4301,29 @@ float8_to_char(float64 value, text *fmt)
if (IS_ROMAN(&Num)) if (IS_ROMAN(&Num))
{ {
numstr = orgnum = int_to_roman((int) rint(*value)); numstr = orgnum = int_to_roman((int) rint(value));
} }
else else
{ {
float64 val = value; float8 val = value;
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
double multi = pow((double) 10, (double) Num.multi); double multi = pow((double) 10, (double) Num.multi);
val = float8mul(value, (float64) &multi); val = value * multi;
Num.pre += Num.multi; Num.pre += Num.multi;
} }
orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1); orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
len = sprintf(orgnum, "%.0f", fabs(*val)); len = sprintf(orgnum, "%.0f", fabs(val));
if (Num.pre > len) if (Num.pre > len)
plen = Num.pre - len; plen = Num.pre - len;
if (len >= DBL_DIG) if (len >= DBL_DIG)
Num.post = 0; Num.post = 0;
else if (Num.post + len > DBL_DIG) else if (Num.post + len > DBL_DIG)
Num.post = DBL_DIG - len; Num.post = DBL_DIG - len;
sprintf(orgnum, "%.*f", Num.post, *val); sprintf(orgnum, "%.*f", Num.post, val);
if (*orgnum == '-') if (*orgnum == '-')
{ /* < 0 */ { /* < 0 */
...@@ -4333,5 +4352,5 @@ float8_to_char(float64 value, text *fmt) ...@@ -4333,5 +4352,5 @@ float8_to_char(float64 value, text *fmt)
} }
NUM_TOCHAR_finish; NUM_TOCHAR_finish;
return result; PG_RETURN_TEXT_P(result);
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -4361,22 +4361,21 @@ box_circle(BOX *box)
} /* box_circle() */ } /* box_circle() */
POLYGON * Datum
circle_poly(int npts, CIRCLE *circle) circle_poly(PG_FUNCTION_ARGS)
{ {
int32 npts = PG_GETARG_INT32(0);
CIRCLE *circle = PG_GETARG_CIRCLE_P(1);
POLYGON *poly; POLYGON *poly;
int size; int size;
int i; int i;
double angle; double angle;
if (!PointerIsValid(circle))
return NULL;
if (FPzero(circle->radius) || (npts < 2)) if (FPzero(circle->radius) || (npts < 2))
elog(ERROR, "Unable to convert circle to polygon"); elog(ERROR, "Unable to convert circle to polygon");
size = offsetof(POLYGON, p[0]) +(sizeof(poly->p[0]) * npts); 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 */ MemSet((char *) poly, 0, size); /* zero any holes */
poly->size = size; poly->size = size;
...@@ -4391,7 +4390,7 @@ circle_poly(int npts, CIRCLE *circle) ...@@ -4391,7 +4390,7 @@ circle_poly(int npts, CIRCLE *circle)
make_bound_box(poly); make_bound_box(poly);
return poly; PG_RETURN_POLYGON_P(poly);
} }
/* poly_circle - convert polygon to circle /* poly_circle - convert polygon to circle
......
This diff is collapsed.
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* 1998 Jan Wieck * 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 @@ ...@@ -33,9 +33,6 @@
* Local definitions * Local definitions
* ---------- * ----------
*/ */
#define PG_GETARG_NUMERIC(n) ((Numeric) DatumGetPointer(fcinfo->arg[n]))
#define PG_RETURN_NUMERIC(x) return PointerGetDatum(x)
#ifndef MIN #ifndef MIN
#define MIN(a,b) (((a)<(b)) ? (a) : (b)) #define MIN(a,b) (((a)<(b)) ? (a) : (b))
#endif #endif
...@@ -189,28 +186,23 @@ static void sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result); ...@@ -189,28 +186,23 @@ static void sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result);
* Input function for numeric data type * Input function for numeric data type
* ---------- * ----------
*/ */
Numeric Datum
numeric_in(char *str, int dummy, int32 typmod) 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; NumericVar value;
Numeric res; Numeric res;
/* ----------
* Check for NULL
* ----------
*/
if (str == NULL)
return NULL;
if (strcmp(str, "NULL") == 0)
return NULL;
/* ---------- /* ----------
* Check for NaN * Check for NaN
* ---------- * ----------
*/ */
if (strcmp(str, "NaN") == 0) 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 * Use set_var_from_str() to parse the input string
...@@ -225,7 +217,7 @@ numeric_in(char *str, int dummy, int32 typmod) ...@@ -225,7 +217,7 @@ numeric_in(char *str, int dummy, int32 typmod)
res = make_result(&value); res = make_result(&value);
free_var(&value); free_var(&value);
return res; PG_RETURN_NUMERIC(res);
} }
...@@ -235,25 +227,19 @@ numeric_in(char *str, int dummy, int32 typmod) ...@@ -235,25 +227,19 @@ numeric_in(char *str, int dummy, int32 typmod)
* Output function for numeric data type * Output function for numeric data type
* ---------- * ----------
*/ */
char * Datum
numeric_out(Numeric num) numeric_out(PG_FUNCTION_ARGS)
{ {
Numeric num = PG_GETARG_NUMERIC(0);
NumericVar x; NumericVar x;
char *str; char *str;
/* ----------
* Handle NULL
* ----------
*/
if (num == NULL)
return pstrdup("NULL");
/* ---------- /* ----------
* Handle NaN * Handle NaN
* ---------- * ----------
*/ */
if (NUMERIC_IS_NAN(num)) if (NUMERIC_IS_NAN(num))
return pstrdup("NaN"); PG_RETURN_CSTRING(pstrdup("NaN"));
/* ---------- /* ----------
* Get the number in the variable format. * Get the number in the variable format.
...@@ -271,7 +257,7 @@ numeric_out(Numeric num) ...@@ -271,7 +257,7 @@ numeric_out(Numeric num)
free_var(&x); free_var(&x);
return str; PG_RETURN_CSTRING(str);
} }
...@@ -283,9 +269,11 @@ numeric_out(Numeric num) ...@@ -283,9 +269,11 @@ numeric_out(Numeric num)
* scale of the attribute have to be applied on the value. * scale of the attribute have to be applied on the value.
* ---------- * ----------
*/ */
Numeric Datum
numeric(Numeric num, int32 typmod) numeric(PG_FUNCTION_ARGS)
{ {
Numeric num = PG_GETARG_NUMERIC(0);
int32 typmod = PG_GETARG_INT32(1);
Numeric new; Numeric new;
int32 tmp_typmod; int32 tmp_typmod;
int precision; int precision;
...@@ -293,19 +281,12 @@ numeric(Numeric num, int32 typmod) ...@@ -293,19 +281,12 @@ numeric(Numeric num, int32 typmod)
int maxweight; int maxweight;
NumericVar var; NumericVar var;
/* ----------
* Handle NULL
* ----------
*/
if (num == NULL)
return NULL;
/* ---------- /* ----------
* Handle NaN * Handle NaN
* ---------- * ----------
*/ */
if (NUMERIC_IS_NAN(num)) 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 * If the value isn't a valid type modifier, simply return a
...@@ -316,7 +297,7 @@ numeric(Numeric num, int32 typmod) ...@@ -316,7 +297,7 @@ numeric(Numeric num, int32 typmod)
{ {
new = (Numeric) palloc(num->varlen); new = (Numeric) palloc(num->varlen);
memcpy(new, num, num->varlen); memcpy(new, num, num->varlen);
return new; PG_RETURN_NUMERIC(new);
} }
/* ---------- /* ----------
...@@ -341,7 +322,7 @@ numeric(Numeric num, int32 typmod) ...@@ -341,7 +322,7 @@ numeric(Numeric num, int32 typmod)
new->n_rscale = scale; new->n_rscale = scale;
new->n_sign_dscale = NUMERIC_SIGN(new) | new->n_sign_dscale = NUMERIC_SIGN(new) |
((uint16) scale & NUMERIC_DSCALE_MASK); ((uint16) scale & NUMERIC_DSCALE_MASK);
return new; PG_RETURN_NUMERIC(new);
} }
/* ---------- /* ----------
...@@ -357,7 +338,7 @@ numeric(Numeric num, int32 typmod) ...@@ -357,7 +338,7 @@ numeric(Numeric num, int32 typmod)
free_var(&var); free_var(&var);
return new; PG_RETURN_NUMERIC(new);
} }
...@@ -502,26 +483,21 @@ numeric_sign(Numeric num) ...@@ -502,26 +483,21 @@ numeric_sign(Numeric num)
* point --- Oracle interprets rounding that way. * point --- Oracle interprets rounding that way.
* ---------- * ----------
*/ */
Numeric Datum
numeric_round(Numeric num, int32 scale) numeric_round(PG_FUNCTION_ARGS)
{ {
Numeric num = PG_GETARG_NUMERIC(0);
int32 scale = PG_GETARG_INT32(1);
Numeric res; Numeric res;
NumericVar arg; NumericVar arg;
int i; int i;
/* ----------
* Handle NULL
* ----------
*/
if (num == NULL)
return NULL;
/* ---------- /* ----------
* Handle NaN * Handle NaN
* ---------- * ----------
*/ */
if (NUMERIC_IS_NAN(num)) 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. * Limit the scale value to avoid possible overflow in calculations below.
...@@ -587,7 +563,7 @@ numeric_round(Numeric num, int32 scale) ...@@ -587,7 +563,7 @@ numeric_round(Numeric num, int32 scale)
res = make_result(&arg); res = make_result(&arg);
free_var(&arg); free_var(&arg);
return res; PG_RETURN_NUMERIC(res);
} }
...@@ -599,25 +575,20 @@ numeric_round(Numeric num, int32 scale) ...@@ -599,25 +575,20 @@ numeric_round(Numeric num, int32 scale)
* point --- Oracle interprets truncation that way. * point --- Oracle interprets truncation that way.
* ---------- * ----------
*/ */
Numeric Datum
numeric_trunc(Numeric num, int32 scale) numeric_trunc(PG_FUNCTION_ARGS)
{ {
Numeric num = PG_GETARG_NUMERIC(0);
int32 scale = PG_GETARG_INT32(1);
Numeric res; Numeric res;
NumericVar arg; NumericVar arg;
/* ----------
* Handle NULL
* ----------
*/
if (num == NULL)
return NULL;
/* ---------- /* ----------
* Handle NaN * Handle NaN
* ---------- * ----------
*/ */
if (NUMERIC_IS_NAN(num)) 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. * Limit the scale value to avoid possible overflow in calculations below.
...@@ -650,7 +621,7 @@ numeric_trunc(Numeric num, int32 scale) ...@@ -650,7 +621,7 @@ numeric_trunc(Numeric num, int32 scale)
res = make_result(&arg); res = make_result(&arg);
free_var(&arg); free_var(&arg);
return res; PG_RETURN_NUMERIC(res);
} }
...@@ -1708,9 +1679,10 @@ numeric_power(Numeric num1, Numeric num2) ...@@ -1708,9 +1679,10 @@ numeric_power(Numeric num1, Numeric num2)
*/ */
Numeric Datum
int4_numeric(int32 val) int4_numeric(PG_FUNCTION_ARGS)
{ {
int32 val = PG_GETARG_INT32(0);
Numeric res; Numeric res;
NumericVar result; NumericVar result;
char *tmp; char *tmp;
...@@ -1725,7 +1697,7 @@ int4_numeric(int32 val) ...@@ -1725,7 +1697,7 @@ int4_numeric(int32 val)
free_var(&result); free_var(&result);
pfree(tmp); pfree(tmp);
return res; PG_RETURN_NUMERIC(res);
} }
...@@ -1769,7 +1741,8 @@ int8_numeric(int64 *val) ...@@ -1769,7 +1741,8 @@ int8_numeric(int64 *val)
init_var(&result); init_var(&result);
tmp = int8out(val); tmp = DatumGetCString(DirectFunctionCall1(int8out,
PointerGetDatum(val)));
set_var_from_str(tmp, &result); set_var_from_str(tmp, &result);
res = make_result(&result); res = make_result(&result);
...@@ -1785,7 +1758,7 @@ numeric_int8(Numeric num) ...@@ -1785,7 +1758,7 @@ numeric_int8(Numeric num)
{ {
NumericVar x; NumericVar x;
char *str; char *str;
int64 *result; Datum result;
if (num == NULL) if (num == NULL)
return NULL; return NULL;
...@@ -1804,10 +1777,11 @@ numeric_int8(Numeric num) ...@@ -1804,10 +1777,11 @@ numeric_int8(Numeric num)
free_var(&x); free_var(&x);
result = int8in(str); result = DirectFunctionCall1(int8in, CStringGetDatum(str));
pfree(str); pfree(str);
return result; return (int64 *) (result);
} }
...@@ -1904,7 +1878,8 @@ numeric_float8(Numeric num) ...@@ -1904,7 +1878,8 @@ numeric_float8(Numeric num)
return result; return result;
} }
tmp = numeric_out(num); tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(num)));
result = float8in(tmp); result = float8in(tmp);
pfree(tmp); pfree(tmp);
...@@ -1954,7 +1929,8 @@ numeric_float4(Numeric num) ...@@ -1954,7 +1929,8 @@ numeric_float4(Numeric num)
return result; return result;
} }
tmp = numeric_out(num); tmp = DatumGetCString(DirectFunctionCall1(numeric_out,
NumericGetDatum(num)));
result = float4in(tmp); result = float4in(tmp);
pfree(tmp); pfree(tmp);
......
/* /*
* Edmund Mergl <E.Mergl@bawue.de> * Edmund Mergl <E.Mergl@bawue.de>
* *
* $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) ...@@ -150,9 +150,12 @@ initcap(text *string)
* *
********************************************************************/ ********************************************************************/
text * Datum
lpad(text *string1, int4 len, text *string2) 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; text *ret;
char *ptr1, char *ptr1,
*ptr2, *ptr2,
...@@ -160,12 +163,10 @@ lpad(text *string1, int4 len, text *string2) ...@@ -160,12 +163,10 @@ lpad(text *string1, int4 len, text *string2)
int m, int m,
n; n;
if ((string1 == (text *) NULL) || if (((VARSIZE(string1) - VARHDRSZ) < 0) ||
(len <= (VARSIZE(string1) - VARHDRSZ)) || ((m = len - (VARSIZE(string1) - VARHDRSZ)) <= 0) ||
((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
(string2 == (text *) NULL) ||
((VARSIZE(string2) - VARHDRSZ) <= 0)) ((VARSIZE(string2) - VARHDRSZ) <= 0))
return string1; PG_RETURN_TEXT_P(string1);
ret = (text *) palloc(VARHDRSZ + len); ret = (text *) palloc(VARHDRSZ + len);
VARSIZE(ret) = VARHDRSZ + len; VARSIZE(ret) = VARHDRSZ + len;
...@@ -176,7 +177,7 @@ lpad(text *string1, int4 len, text *string2) ...@@ -176,7 +177,7 @@ lpad(text *string1, int4 len, text *string2)
while (m--) while (m--)
{ {
*ptr_ret++ = *ptr2; *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; n = VARSIZE(string1) - VARHDRSZ;
...@@ -185,7 +186,7 @@ lpad(text *string1, int4 len, text *string2) ...@@ -185,7 +186,7 @@ lpad(text *string1, int4 len, text *string2)
while (n--) while (n--)
*ptr_ret++ = *ptr1++; *ptr_ret++ = *ptr1++;
return ret; PG_RETURN_TEXT_P(ret);
} }
...@@ -204,9 +205,12 @@ lpad(text *string1, int4 len, text *string2) ...@@ -204,9 +205,12 @@ lpad(text *string1, int4 len, text *string2)
* *
********************************************************************/ ********************************************************************/
text * Datum
rpad(text *string1, int4 len, text *string2) 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; text *ret;
char *ptr1, char *ptr1,
*ptr2, *ptr2,
...@@ -214,12 +218,10 @@ rpad(text *string1, int4 len, text *string2) ...@@ -214,12 +218,10 @@ rpad(text *string1, int4 len, text *string2)
int m, int m,
n; n;
if ((string1 == (text *) NULL) || if (((VARSIZE(string1) - VARHDRSZ) < 0) ||
(len <= (VARSIZE(string1) - VARHDRSZ)) || ((m = len - (VARSIZE(string1) - VARHDRSZ)) <= 0) ||
((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
(string2 == (text *) NULL) ||
((VARSIZE(string2) - VARHDRSZ) <= 0)) ((VARSIZE(string2) - VARHDRSZ) <= 0))
return string1; PG_RETURN_TEXT_P(string1);
ret = (text *) palloc(VARHDRSZ + len); ret = (text *) palloc(VARHDRSZ + len);
VARSIZE(ret) = VARHDRSZ + len; VARSIZE(ret) = VARHDRSZ + len;
...@@ -236,10 +238,10 @@ rpad(text *string1, int4 len, text *string2) ...@@ -236,10 +238,10 @@ rpad(text *string1, int4 len, text *string2)
while (m--) while (m--)
{ {
*ptr_ret++ = *ptr2; *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) ...@@ -551,22 +553,25 @@ ascii(text *string)
} /* ascii() */ } /* ascii() */
text * Datum
ichar(int4 cvalue) ichar(PG_FUNCTION_ARGS)
{ {
int32 cvalue = PG_GETARG_INT32(0);
text *result; text *result;
result = (text *) palloc(VARHDRSZ + 1); result = (text *) palloc(VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1; VARSIZE(result) = VARHDRSZ + 1;
*VARDATA(result) = (char) cvalue; *VARDATA(result) = (char) cvalue;
return result; PG_RETURN_TEXT_P(result);
} /* ichar() */ }
text * Datum
repeat(text *string, int4 count) repeat(PG_FUNCTION_ARGS)
{ {
text *string = PG_GETARG_TEXT_P(0);
int32 count = PG_GETARG_INT32(1);
text *result; text *result;
int slen, int slen,
tlen; tlen;
...@@ -589,5 +594,5 @@ repeat(text *string, int4 count) ...@@ -589,5 +594,5 @@ repeat(text *string, int4 count)
cp += slen; cp += slen;
} }
return result; PG_RETURN_TEXT_P(result);
} /* repeat() */ }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* out of its tuple * out of its tuple
* *
* IDENTIFICATION * 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. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -551,18 +551,19 @@ pg_get_indexdef(PG_FUNCTION_ARGS) ...@@ -551,18 +551,19 @@ pg_get_indexdef(PG_FUNCTION_ARGS)
* fallback to 'unknown (UID=n)' * fallback to 'unknown (UID=n)'
* ---------- * ----------
*/ */
NameData * Datum
pg_get_userbyid(int32 uid) pg_get_userbyid(PG_FUNCTION_ARGS)
{ {
int32 uid = PG_GETARG_INT32(0);
Name result;
HeapTuple usertup; HeapTuple usertup;
Form_pg_shadow user_rec; Form_pg_shadow user_rec;
NameData *result;
/* ---------- /* ----------
* Allocate space for the result * Allocate space for the result
* ---------- * ----------
*/ */
result = (NameData *) palloc(NAMEDATALEN); result = (Name) palloc(NAMEDATALEN);
memset(NameStr(*result), 0, NAMEDATALEN); memset(NameStr(*result), 0, NAMEDATALEN);
/* ---------- /* ----------
...@@ -570,16 +571,17 @@ pg_get_userbyid(int32 uid) ...@@ -570,16 +571,17 @@ pg_get_userbyid(int32 uid)
* ---------- * ----------
*/ */
usertup = SearchSysCacheTuple(SHADOWSYSID, usertup = SearchSysCacheTuple(SHADOWSYSID,
ObjectIdGetDatum(uid), 0, 0, 0); ObjectIdGetDatum(uid),
0, 0, 0);
if (HeapTupleIsValid(usertup)) if (HeapTupleIsValid(usertup))
{ {
user_rec = (Form_pg_shadow) GETSTRUCT(usertup); user_rec = (Form_pg_shadow) GETSTRUCT(usertup);
StrNCpy(NameStr(*result), NameStr(user_rec->usename), NAMEDATALEN); StrNCpy(NameStr(*result), NameStr(user_rec->usename), NAMEDATALEN);
} }
else else
sprintf((char *) result, "unknown (UID=%d)", uid); sprintf(NameStr(*result), "unknown (UID=%d)", uid);
return result; PG_RETURN_NAME(result);
} }
/* ---------- /* ----------
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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); ...@@ -61,20 +61,21 @@ extern char *convertstr(char *, int, int);
/* /*
* bpcharin - * bpcharin -
* converts a string of char() type to the internal representation. * converts a string of char() type to the internal representation.
* len is the length specified in () plus VARHDRSZ bytes. (XXX dummy is here * len is the length specified in () plus VARHDRSZ bytes.
* because we pass typelem as the second argument for array_in.)
*/ */
char * Datum
bpcharin(char *s, int dummy, int32 atttypmod) bpcharin(PG_FUNCTION_ARGS)
{ {
char *result, char *s = PG_GETARG_CSTRING(0);
*r; #ifdef NOT_USED
Oid typelem = PG_GETARG_OID(1);
#endif
int32 atttypmod = PG_GETARG_INT32(2);
BpChar *result;
char *r;
int len; int len;
int i; int i;
if (s == NULL)
return (char *) NULL;
if (atttypmod < (int32) VARHDRSZ) if (atttypmod < (int32) VARHDRSZ)
{ {
/* If typmod is -1 (or invalid), use the actual string length */ /* If typmod is -1 (or invalid), use the actual string length */
...@@ -84,7 +85,7 @@ bpcharin(char *s, int dummy, int32 atttypmod) ...@@ -84,7 +85,7 @@ bpcharin(char *s, int dummy, int32 atttypmod)
else else
len = atttypmod - VARHDRSZ; len = atttypmod - VARHDRSZ;
result = (char *) palloc(atttypmod); result = (BpChar *) palloc(atttypmod);
VARSIZE(result) = atttypmod; VARSIZE(result) = atttypmod;
r = VARDATA(result); r = VARDATA(result);
for (i = 0; i < len; i++, r++, s++) for (i = 0; i < len; i++, r++, s++)
...@@ -95,85 +96,78 @@ bpcharin(char *s, int dummy, int32 atttypmod) ...@@ -95,85 +96,78 @@ bpcharin(char *s, int dummy, int32 atttypmod)
} }
#ifdef CYR_RECODE #ifdef CYR_RECODE
convertstr(result + VARHDRSZ, len, 0); convertstr(VARDATA(result), len, 0);
#endif #endif
/* blank pad the string if necessary */ /* blank pad the string if necessary */
for (; i < len; i++) for (; i < len; i++)
*r++ = ' '; *r++ = ' ';
return result;
PG_RETURN_BPCHAR_P(result);
} }
char * Datum
bpcharout(char *s) bpcharout(PG_FUNCTION_ARGS)
{ {
BpChar *s = PG_GETARG_BPCHAR_P(0);
char *result; char *result;
int len; int len;
if (s == NULL) len = VARSIZE(s) - VARHDRSZ;
{ result = (char *) palloc(len + 1);
result = (char *) palloc(2); StrNCpy(result, VARDATA(s), len + 1); /* copy and add null term */
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 */
}
#ifdef CYR_RECODE #ifdef CYR_RECODE
convertstr(result, len, 1); convertstr(result, len, 1);
#endif #endif
return result; PG_RETURN_CSTRING(result);
} }
/* bpchar() /* bpchar()
* Converts a char() type to a specific internal length. * Converts a char() type to a specific internal length.
* len is the length specified in () plus VARHDRSZ bytes. * len is the length specified in () plus VARHDRSZ bytes.
*/ */
char * Datum
bpchar(char *s, int32 len) bpchar(PG_FUNCTION_ARGS)
{ {
char *result, BpChar *str = PG_GETARG_BPCHAR_P(0);
*r; int32 len = PG_GETARG_INT32(1);
BpChar *result;
char *r,
*s;
int rlen, int rlen,
slen; slen;
int i; int i;
if (s == NULL)
return (char *) NULL;
/* No work if typmod is invalid or supplied data matches it already */ /* No work if typmod is invalid or supplied data matches it already */
if (len < (int32) VARHDRSZ || len == VARSIZE(s)) if (len < (int32) VARHDRSZ || len == VARSIZE(str))
return s; PG_RETURN_BPCHAR_P(str);
rlen = len - VARHDRSZ; rlen = len - VARHDRSZ;
#ifdef STRINGDEBUG #ifdef STRINGDEBUG
printf("bpchar- convert string length %d (%d) ->%d (%d)\n", 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 #endif
result = (char *) palloc(len); result = (BpChar *) palloc(len);
VARSIZE(result) = len; VARSIZE(result) = len;
r = VARDATA(result); r = VARDATA(result);
#ifdef MULTIBYTE
#ifdef MULTIBYTE
/* /*
* truncate multi-byte string in a way not to break multi-byte * truncate multi-byte string in a way not to break multi-byte
* boundary * boundary
*/ */
if (VARSIZE(s) > len) if (VARSIZE(str) > len)
slen = pg_mbcliplen(VARDATA(s), VARSIZE(s) - VARHDRSZ, rlen); slen = pg_mbcliplen(VARDATA(str), VARSIZE(str) - VARHDRSZ, rlen);
else else
slen = VARSIZE(s) - VARHDRSZ; slen = VARSIZE(str) - VARHDRSZ;
#else #else
slen = VARSIZE(s) - VARHDRSZ; slen = VARSIZE(str) - VARHDRSZ;
#endif #endif
s = VARDATA(s); s = VARDATA(str);
#ifdef STRINGDEBUG #ifdef STRINGDEBUG
printf("bpchar- string is '"); printf("bpchar- string is '");
...@@ -181,13 +175,9 @@ bpchar(char *s, int32 len) ...@@ -181,13 +175,9 @@ bpchar(char *s, int32 len)
for (i = 0; (i < rlen) && (i < slen); i++) for (i = 0; (i < rlen) && (i < slen); i++)
{ {
if (*s == '\0')
break;
#ifdef STRINGDEBUG #ifdef STRINGDEBUG
printf("%c", *s); printf("%c", *s);
#endif #endif
*r++ = *s++; *r++ = *s++;
} }
...@@ -199,19 +189,21 @@ bpchar(char *s, int32 len) ...@@ -199,19 +189,21 @@ bpchar(char *s, int32 len)
for (; i < rlen; i++) for (; i < rlen; i++)
*r++ = ' '; *r++ = ' ';
return result; PG_RETURN_BPCHAR_P(result);
} /* bpchar() */ }
/* _bpchar() /* _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. * len is the length specified in () plus VARHDRSZ bytes.
*/ */
ArrayType * Datum
_bpchar(ArrayType *v, int32 len) _bpchar(PG_FUNCTION_ARGS)
{ {
ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0);
int32 len = PG_GETARG_INT32(1);
FunctionCallInfoData locfcinfo; 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. * look it up once per run.
*/ */
static FmgrInfo bpchar_finfo; static FmgrInfo bpchar_finfo;
...@@ -226,9 +218,7 @@ _bpchar(ArrayType *v, int32 len) ...@@ -226,9 +218,7 @@ _bpchar(ArrayType *v, int32 len)
locfcinfo.arg[0] = PointerGetDatum(v); locfcinfo.arg[0] = PointerGetDatum(v);
locfcinfo.arg[1] = Int32GetDatum(len); locfcinfo.arg[1] = Int32GetDatum(len);
result = array_map(&locfcinfo, BPCHAROID, BPCHAROID); return array_map(&locfcinfo, BPCHAROID, BPCHAROID);
return (ArrayType *) DatumGetPointer(result);
} }
...@@ -240,7 +230,7 @@ _bpchar(ArrayType *v, int32 len) ...@@ -240,7 +230,7 @@ _bpchar(ArrayType *v, int32 len)
Datum Datum
bpchar_char(PG_FUNCTION_ARGS) 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)); PG_RETURN_CHAR(*VARDATA(s));
} }
...@@ -252,9 +242,9 @@ Datum ...@@ -252,9 +242,9 @@ Datum
char_bpchar(PG_FUNCTION_ARGS) char_bpchar(PG_FUNCTION_ARGS)
{ {
char c = PG_GETARG_CHAR(0); 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; VARSIZE(result) = VARHDRSZ + 1;
*(VARDATA(result)) = c; *(VARDATA(result)) = c;
...@@ -338,75 +328,67 @@ name_bpchar(NameData *s) ...@@ -338,75 +328,67 @@ name_bpchar(NameData *s)
/* /*
* varcharin - * varcharin -
* converts a string of varchar() type to the internal representation. * converts a string of varchar() type to the internal representation.
* len is the length specified in () plus VARHDRSZ bytes. (XXX dummy is here * len is the length specified in () plus VARHDRSZ bytes.
* because we pass typelem as the second argument for array_in.)
*/ */
char * Datum
varcharin(char *s, int dummy, int32 atttypmod) 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; int len;
if (s == NULL)
return (char *) NULL;
len = strlen(s) + VARHDRSZ; len = strlen(s) + VARHDRSZ;
if (atttypmod >= (int32) VARHDRSZ && len > atttypmod) if (atttypmod >= (int32) VARHDRSZ && len > atttypmod)
len = atttypmod; /* clip the string at max length */ len = atttypmod; /* clip the string at max length */
result = (char *) palloc(len); result = (VarChar *) palloc(len);
VARSIZE(result) = len; VARSIZE(result) = len;
strncpy(VARDATA(result), s, len - VARHDRSZ); memcpy(VARDATA(result), s, len - VARHDRSZ);
#ifdef CYR_RECODE #ifdef CYR_RECODE
convertstr(result + VARHDRSZ, len, 0); convertstr(VARDATA(result), len, 0);
#endif #endif
return result; PG_RETURN_VARCHAR_P(result);
} }
char * Datum
varcharout(char *s) varcharout(PG_FUNCTION_ARGS)
{ {
VarChar *s = PG_GETARG_VARCHAR_P(0);
char *result; char *result;
int len; int len;
if (s == NULL) len = VARSIZE(s) - VARHDRSZ;
{ result = (char *) palloc(len + 1);
result = (char *) palloc(2); StrNCpy(result, VARDATA(s), len + 1); /* copy and add null term */
result[0] = '-';
result[1] = '\0';
}
else
{
len = VARSIZE(s) - VARHDRSZ;
result = (char *) palloc(len + 1);
StrNCpy(result, VARDATA(s), len + 1);
}
#ifdef CYR_RECODE #ifdef CYR_RECODE
convertstr(result, len, 1); convertstr(result, len, 1);
#endif #endif
return result; PG_RETURN_CSTRING(result);
} }
/* varchar() /* varchar()
* Converts a varchar() type to the specified size. * Converts a varchar() type to the specified size.
* slen is the length specified in () plus VARHDRSZ bytes. * slen is the length specified in () plus VARHDRSZ bytes.
*/ */
char * Datum
varchar(char *s, int32 slen) varchar(PG_FUNCTION_ARGS)
{ {
char *result; VarChar *s = PG_GETARG_VARCHAR_P(0);
int32 slen = PG_GETARG_INT32(1);
VarChar *result;
int len; int len;
if (s == NULL)
return (char *) NULL;
len = VARSIZE(s); len = VARSIZE(s);
if (slen < (int32) VARHDRSZ || len <= slen) if (slen < (int32) VARHDRSZ || len <= slen)
return (char *) s; PG_RETURN_VARCHAR_P(s);
/* only reach here if we need to truncate string... */ /* only reach here if we need to truncate string... */
...@@ -422,23 +404,25 @@ varchar(char *s, int32 slen) ...@@ -422,23 +404,25 @@ varchar(char *s, int32 slen)
len = slen - VARHDRSZ; len = slen - VARHDRSZ;
#endif #endif
result = (char *) palloc(slen); result = (VarChar *) palloc(slen);
VARSIZE(result) = slen; VARSIZE(result) = slen;
strncpy(VARDATA(result), VARDATA(s), len); memcpy(VARDATA(result), VARDATA(s), len);
return result; PG_RETURN_VARCHAR_P(result);
} /* varchar() */ }
/* _varchar() /* _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. * len is the length specified in () plus VARHDRSZ bytes.
*/ */
ArrayType * Datum
_varchar(ArrayType *v, int32 len) _varchar(PG_FUNCTION_ARGS)
{ {
ArrayType *v = (ArrayType *) PG_GETARG_VARLENA_P(0);
int32 len = PG_GETARG_INT32(1);
FunctionCallInfoData locfcinfo; 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. * look it up once per run.
*/ */
static FmgrInfo varchar_finfo; static FmgrInfo varchar_finfo;
...@@ -453,9 +437,7 @@ _varchar(ArrayType *v, int32 len) ...@@ -453,9 +437,7 @@ _varchar(ArrayType *v, int32 len)
locfcinfo.arg[0] = PointerGetDatum(v); locfcinfo.arg[0] = PointerGetDatum(v);
locfcinfo.arg[1] = Int32GetDatum(len); locfcinfo.arg[1] = Int32GetDatum(len);
result = array_map(&locfcinfo, VARCHAROID, VARCHAROID); return array_map(&locfcinfo, VARCHAROID, VARCHAROID);
return (ArrayType *) DatumGetPointer(result);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -323,21 +323,19 @@ textcat(text *t1, text *t2)
* Formerly returned the entire string; now returns a portion. * Formerly returned the entire string; now returns a portion.
* - Thomas Lockhart 1998-12-10 * - Thomas Lockhart 1998-12-10
*/ */
text * Datum
text_substr(text *string, int32 m, int32 n) 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; text *ret;
int len; int len;
#ifdef MULTIBYTE #ifdef MULTIBYTE
int i; int i;
char *p; char *p;
#endif #endif
if (string == (text *) NULL)
return string;
len = VARSIZE(string) - VARHDRSZ; len = VARSIZE(string) - VARHDRSZ;
#ifdef MULTIBYTE #ifdef MULTIBYTE
len = pg_mbstrlen_with_len(VARDATA(string), len); len = pg_mbstrlen_with_len(VARDATA(string), len);
...@@ -374,13 +372,14 @@ text_substr(text *string, int32 m, int32 n) ...@@ -374,13 +372,14 @@ text_substr(text *string, int32 m, int32 n)
p += pg_mblen(p); p += pg_mblen(p);
n = p - (VARDATA(string) + m); n = p - (VARDATA(string) + m);
#endif #endif
ret = (text *) palloc(VARHDRSZ + n); ret = (text *) palloc(VARHDRSZ + n);
VARSIZE(ret) = VARHDRSZ + n; VARSIZE(ret) = VARHDRSZ + n;
memcpy(VARDATA(ret), VARDATA(string) + m, n); memcpy(VARDATA(ret), VARDATA(string) + m, n);
return ret; PG_RETURN_TEXT_P(ret);
} /* text_substr() */ }
/* /*
* textpos - * textpos -
...@@ -636,19 +635,17 @@ byteaoctetlen(bytea *v) ...@@ -636,19 +635,17 @@ byteaoctetlen(bytea *v)
* byteaGetByte * byteaGetByte
* *
* this routine treats "bytea" as an array of bytes. * this routine treats "bytea" as an array of bytes.
* It returns the Nth byte (a number between 0 and 255) or * It returns the Nth byte (a number between 0 and 255).
* it dies if the length of this array is less than n.
*------------------------------------------------------------- *-------------------------------------------------------------
*/ */
int32 Datum
byteaGetByte(bytea *v, int32 n) byteaGetByte(PG_FUNCTION_ARGS)
{ {
bytea *v = PG_GETARG_BYTEA_P(0);
int32 n = PG_GETARG_INT32(1);
int len; int len;
int byte; int byte;
if (!PointerIsValid(v))
return 0;
len = VARSIZE(v) - VARHDRSZ; len = VARSIZE(v) - VARHDRSZ;
if (n < 0 || n >= len) if (n < 0 || n >= len)
...@@ -657,7 +654,7 @@ byteaGetByte(bytea *v, int32 n) ...@@ -657,7 +654,7 @@ byteaGetByte(bytea *v, int32 n)
byte = ((unsigned char *) VARDATA(v))[n]; byte = ((unsigned char *) VARDATA(v))[n];
return (int32) byte; PG_RETURN_INT32(byte);
} }
/*------------------------------------------------------------- /*-------------------------------------------------------------
...@@ -665,21 +662,19 @@ byteaGetByte(bytea *v, int32 n) ...@@ -665,21 +662,19 @@ byteaGetByte(bytea *v, int32 n)
* *
* This routine treats a "bytea" type like an array of bits. * This routine treats a "bytea" type like an array of bits.
* It returns the value of the Nth bit (0 or 1). * It returns the value of the Nth bit (0 or 1).
* If 'n' is out of range, it dies!
* *
*------------------------------------------------------------- *-------------------------------------------------------------
*/ */
int32 Datum
byteaGetBit(bytea *v, int32 n) byteaGetBit(PG_FUNCTION_ARGS)
{ {
bytea *v = PG_GETARG_BYTEA_P(0);
int32 n = PG_GETARG_INT32(1);
int byteNo, int byteNo,
bitNo; bitNo;
int len; int len;
int byte; int byte;
if (!PointerIsValid(v))
return 0;
len = VARSIZE(v) - VARHDRSZ; len = VARSIZE(v) - VARHDRSZ;
if (n < 0 || n >= len * 8) if (n < 0 || n >= len * 8)
...@@ -692,9 +687,9 @@ byteaGetBit(bytea *v, int32 n) ...@@ -692,9 +687,9 @@ byteaGetBit(bytea *v, int32 n)
byte = ((unsigned char *) VARDATA(v))[byteNo]; byte = ((unsigned char *) VARDATA(v))[byteNo];
if (byte & (1 << bitNo)) if (byte & (1 << bitNo))
return (int32) 1; PG_RETURN_INT32(1);
else else
return (int32) 0; PG_RETURN_INT32(0);
} }
/*------------------------------------------------------------- /*-------------------------------------------------------------
...@@ -705,15 +700,15 @@ byteaGetBit(bytea *v, int32 n) ...@@ -705,15 +700,15 @@ byteaGetBit(bytea *v, int32 n)
* *
*------------------------------------------------------------- *-------------------------------------------------------------
*/ */
bytea * Datum
byteaSetByte(bytea *v, int32 n, int32 newByte) 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; int len;
bytea *res; bytea *res;
if (!PointerIsValid(v))
return 0;
len = VARSIZE(v) - VARHDRSZ; len = VARSIZE(v) - VARHDRSZ;
if (n < 0 || n >= len) if (n < 0 || n >= len)
...@@ -731,7 +726,7 @@ byteaSetByte(bytea *v, int32 n, int32 newByte) ...@@ -731,7 +726,7 @@ byteaSetByte(bytea *v, int32 n, int32 newByte)
*/ */
((unsigned char *) VARDATA(res))[n] = 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) ...@@ -742,9 +737,12 @@ byteaSetByte(bytea *v, int32 n, int32 newByte)
* *
*------------------------------------------------------------- *-------------------------------------------------------------
*/ */
bytea * Datum
byteaSetBit(bytea *v, int32 n, int32 newBit) 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; bytea *res;
int len; int len;
int oldByte, int oldByte,
...@@ -752,9 +750,6 @@ byteaSetBit(bytea *v, int32 n, int32 newBit) ...@@ -752,9 +750,6 @@ byteaSetBit(bytea *v, int32 n, int32 newBit)
int byteNo, int byteNo,
bitNo; bitNo;
if (!PointerIsValid(v))
return NULL;
len = VARSIZE(v) - VARHDRSZ; len = VARSIZE(v) - VARHDRSZ;
if (n < 0 || n >= len * 8) if (n < 0 || n >= len * 8)
...@@ -771,24 +766,24 @@ byteaSetBit(bytea *v, int32 n, int32 newBit) ...@@ -771,24 +766,24 @@ byteaSetBit(bytea *v, int32 n, int32 newBit)
elog(ERROR, "byteaSetBit: new bit must be 0 or 1"); 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) if (newBit == 0)
newByte = oldByte & (~(1 << bitNo)); newByte = oldByte & (~(1 << bitNo));
else else
newByte = oldByte | (1 << bitNo); newByte = oldByte | (1 << bitNo);
/* ((unsigned char *) VARDATA(res))[byteNo] = newByte;
* NOTE: 'byteaSetByte' creates a copy of 'v' & sets the byte.
*/
res = byteaSetByte(v, byteNo, newByte);
return res; PG_RETURN_BYTEA_P(res);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 @@ ...@@ -28,6 +28,7 @@
#include "catalog/catname.h" #include "catalog/catname.h"
#include "catalog/pg_shadow.h" #include "catalog/pg_shadow.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "utils/builtins.h"
#include "utils/syscache.h" #include "utils/syscache.h"
static char *GetPidFname(void); static char *GetPidFname(void);
...@@ -98,25 +99,26 @@ SetDatabaseName(const char *name) ...@@ -98,25 +99,26 @@ SetDatabaseName(const char *name)
} }
#ifndef MULTIBYTE #ifndef MULTIBYTE
/* even if MULTIBYTE is not enabled, this function is neccesary /* even if MULTIBYTE is not enabled, these functions are necessary
* since pg_proc.h has entries for them. * 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 * Datum
pg_encoding_to_char(int encoding) PG_encoding_to_char(PG_FUNCTION_ARGS)
{ {
return ("SQL_ASCII"); PG_RETURN_NAME("SQL_ASCII");
} }
int Datum
pg_char_to_encoding(const char *encoding_string) PG_char_to_encoding(PG_FUNCTION_ARGS)
{ {
return (0); PG_RETURN_INT32(0);
} }
#endif #endif
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* This file contains some public functions * This file contains some public functions
* usable for both the backend and the frontend. * usable for both the backend and the frontend.
* Tatsuo Ishii * 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 <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -14,8 +14,10 @@ ...@@ -14,8 +14,10 @@
#endif #endif
#include "postgres.h" #include "postgres.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
#include "utils/builtins.h"
/* /*
* convert encoding char to encoding symbol value. * convert encoding char to encoding symbol value.
...@@ -38,6 +40,15 @@ pg_char_to_encoding(const char *s) ...@@ -38,6 +40,15 @@ pg_char_to_encoding(const char *s)
return (p->encoding); 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 * check to see if encoding name is valid
*/ */
...@@ -77,6 +88,15 @@ pg_encoding_to_char(int encoding) ...@@ -77,6 +88,15 @@ pg_encoding_to_char(int encoding)
return (p->name); 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 */ /* returns the byte length of a multi-byte word for an encoding */
int int
pg_encoding_mblen(int encoding, const unsigned char *mbstr) pg_encoding_mblen(int encoding, const unsigned char *mbstr)
......
...@@ -3,12 +3,14 @@ ...@@ -3,12 +3,14 @@
* client encoding and server internal encoding. * client encoding and server internal encoding.
* (currently mule internal code (mic) is used) * (currently mule internal code (mic) is used)
* Tatsuo Ishii * 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 "postgres.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
#include "utils/builtins.h"
static int client_encoding = -1; static int client_encoding = -1;
static void (*client_to_mic) ();/* something to MIC */ static void (*client_to_mic) ();/* something to MIC */
...@@ -266,10 +268,10 @@ GetDatabaseEncoding() ...@@ -266,10 +268,10 @@ GetDatabaseEncoding()
} }
/* for builtin-function */ /* for builtin-function */
const char * Datum
getdatabaseencoding() getdatabaseencoding(PG_FUNCTION_ARGS)
{ {
return (pg_encoding_to_char(DatabaseEncoding)); PG_RETURN_NAME(pg_encoding_to_char(DatabaseEncoding));
} }
/* set and get template1 database encoding */ /* set and get template1 database encoding */
......
...@@ -182,14 +182,9 @@ typedef struct intrange ...@@ -182,14 +182,9 @@ typedef struct intrange
int flag; int flag;
} INTRANGE; } INTRANGE;
extern void gistbuild(Relation heap, extern Datum gistbuild(PG_FUNCTION_ARGS);
Relation index, int natts, extern Datum gistinsert(PG_FUNCTION_ARGS);
AttrNumber *attnum, IndexStrategy istrat, extern Datum gistdelete(PG_FUNCTION_ARGS);
uint16 pint, Datum *params,
FuncIndexInfo *finfo,
PredInfo *predInfo);
extern InsertIndexResult gistinsert(Relation r, Datum *datum,
char *nulls, ItemPointer ht_ctid, Relation heapRel);
extern void _gistdump(Relation r); extern void _gistdump(Relation r);
extern void gistfreestack(GISTSTACK *s); extern void gistfreestack(GISTSTACK *s);
extern void initGISTstate(GISTSTATE *giststate, Relation index); extern void initGISTstate(GISTSTATE *giststate, Relation index);
...@@ -198,6 +193,6 @@ extern void gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr, ...@@ -198,6 +193,6 @@ extern void gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr,
extern StrategyNumber RelationGetGISTStrategy(Relation, AttrNumber, RegProcedure); extern StrategyNumber RelationGetGISTStrategy(Relation, AttrNumber, RegProcedure);
/* gistget.c */ /* gistget.c */
extern RetrieveIndexResult gistgettuple(IndexScanDesc s, ScanDirection dir); extern Datum gistgettuple(PG_FUNCTION_ARGS);
#endif /* GIST_H */ #endif /* GIST_H */
...@@ -10,15 +10,15 @@ ...@@ -10,15 +10,15 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#ifndef GISTSCAN_H #ifndef GISTSCAN_H
#define GISTSCAN_H
#include "access/relscan.h" #include "access/relscan.h"
extern IndexScanDesc gistbeginscan(Relation r, bool fromEnd, extern Datum gistbeginscan(PG_FUNCTION_ARGS);
uint16 nkeys, ScanKey key); extern Datum gistrescan(PG_FUNCTION_ARGS);
extern void gistrescan(IndexScanDesc s, bool fromEnd, ScanKey key); extern Datum gistmarkpos(PG_FUNCTION_ARGS);
extern void gistmarkpos(IndexScanDesc s); extern Datum gistrestrpos(PG_FUNCTION_ARGS);
extern void gistrestrpos(IndexScanDesc s); extern Datum gistendscan(PG_FUNCTION_ARGS);
extern void gistendscan(IndexScanDesc s);
extern void gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum); extern void gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum);
#endif /* GISTSCAN_H */ #endif /* GISTSCAN_H */
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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 * NOTES
* modeled after Margo Seltzer's hash implementation for unix. * modeled after Margo Seltzer's hash implementation for unix.
...@@ -248,19 +248,15 @@ typedef HashItemData *HashItem; ...@@ -248,19 +248,15 @@ typedef HashItemData *HashItem;
/* public routines */ /* public routines */
extern void hashbuild(Relation heap, Relation index, int natts, extern Datum hashbuild(PG_FUNCTION_ARGS);
AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, extern Datum hashinsert(PG_FUNCTION_ARGS);
Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); extern Datum hashgettuple(PG_FUNCTION_ARGS);
extern InsertIndexResult hashinsert(Relation rel, Datum *datum, char *nulls, extern Datum hashbeginscan(PG_FUNCTION_ARGS);
ItemPointer ht_ctid, Relation heapRel); extern Datum hashrescan(PG_FUNCTION_ARGS);
extern char *hashgettuple(IndexScanDesc scan, ScanDirection dir); extern Datum hashendscan(PG_FUNCTION_ARGS);
extern char *hashbeginscan(Relation rel, bool fromEnd, uint16 keysz, extern Datum hashmarkpos(PG_FUNCTION_ARGS);
ScanKey scankey); extern Datum hashrestrpos(PG_FUNCTION_ARGS);
extern void hashrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey); extern Datum hashdelete(PG_FUNCTION_ARGS);
extern void hashendscan(IndexScanDesc scan);
extern void hashmarkpos(IndexScanDesc scan);
extern void hashrestrpos(IndexScanDesc scan);
extern void hashdelete(Relation rel, ItemPointer tid);
/* /*
* Datatype-specific hash functions in hashfunc.c. * Datatype-specific hash functions in hashfunc.c.
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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); ...@@ -227,21 +227,16 @@ extern void _bt_pagedel(Relation rel, ItemPointer tid);
*/ */
extern bool BuildingBtree; /* in nbtree.c */ extern bool BuildingBtree; /* in nbtree.c */
extern void btbuild(Relation heap, Relation index, int natts, extern Datum btbuild(PG_FUNCTION_ARGS);
AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, extern Datum btinsert(PG_FUNCTION_ARGS);
Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo); extern Datum btgettuple(PG_FUNCTION_ARGS);
extern InsertIndexResult btinsert(Relation rel, Datum *datum, char *nulls, extern Datum btbeginscan(PG_FUNCTION_ARGS);
ItemPointer ht_ctid, Relation heapRel); extern Datum btrescan(PG_FUNCTION_ARGS);
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 void btmovescan(IndexScanDesc scan, Datum v); extern void btmovescan(IndexScanDesc scan, Datum v);
extern void btendscan(IndexScanDesc scan); extern Datum btendscan(PG_FUNCTION_ARGS);
extern void btmarkpos(IndexScanDesc scan); extern Datum btmarkpos(PG_FUNCTION_ARGS);
extern void btrestrpos(IndexScanDesc scan); extern Datum btrestrpos(PG_FUNCTION_ARGS);
extern void btdelete(Relation rel, ItemPointer tid); extern Datum btdelete(PG_FUNCTION_ARGS);
/* /*
* prototypes for functions in nbtscan.c * prototypes for functions in nbtscan.c
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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; ...@@ -104,28 +104,21 @@ typedef RTreeScanOpaqueData *RTreeScanOpaque;
/* defined in rtree.c */ /* defined in rtree.c */
extern void freestack(RTSTACK *s); extern void freestack(RTSTACK *s);
/* rget.c */
extern RetrieveIndexResult rtgettuple(IndexScanDesc s, ScanDirection dir);
/* /*
* RTree code. * RTree code.
* Defined in access/index-rtree/ * Defined in access/index-rtree/
*/ */
extern InsertIndexResult rtinsert(Relation r, Datum *datum, char *nulls, extern Datum rtinsert(PG_FUNCTION_ARGS);
ItemPointer ht_ctid, Relation heapRel); extern Datum rtdelete(PG_FUNCTION_ARGS);
extern char *rtdelete(Relation r, ItemPointer tid);
extern Datum rtgettuple(PG_FUNCTION_ARGS);
extern RetrieveIndexResult rtgettuple(IndexScanDesc s, ScanDirection dir); extern Datum rtbeginscan(PG_FUNCTION_ARGS);
extern IndexScanDesc rtbeginscan(Relation r, bool fromEnd, uint16 nkeys,
ScanKey key); extern Datum rtendscan(PG_FUNCTION_ARGS);
extern Datum rtmarkpos(PG_FUNCTION_ARGS);
extern void rtendscan(IndexScanDesc s); extern Datum rtrestrpos(PG_FUNCTION_ARGS);
extern void rtmarkpos(IndexScanDesc s); extern Datum rtrescan(PG_FUNCTION_ARGS);
extern void rtrestrpos(IndexScanDesc s); extern Datum rtbuild(PG_FUNCTION_ARGS);
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 void _rtdump(Relation r); extern void _rtdump(Relation r);
/* rtscan.c */ /* rtscan.c */
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200006121 #define CATALOG_VERSION_NO 200006131
#endif #endif
This diff is collapsed.
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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); ...@@ -99,37 +99,49 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo);
*/ */
#define PG_ARGISNULL(n) (fcinfo->argnull[n]) #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 */ /* Macros for fetching arguments of standard types */
#define PG_GETARG_DATUM(n) (fcinfo->arg[n]) #define PG_GETARG_DATUM(n) (fcinfo->arg[n])
#define PG_GETARG_INT32(n) DatumGetInt32(fcinfo->arg[n]) #define PG_GETARG_INT32(n) DatumGetInt32(PG_GETARG_DATUM(n))
#define PG_GETARG_UINT32(n) DatumGetUInt32(fcinfo->arg[n]) #define PG_GETARG_UINT32(n) DatumGetUInt32(PG_GETARG_DATUM(n))
#define PG_GETARG_INT16(n) DatumGetInt16(fcinfo->arg[n]) #define PG_GETARG_INT16(n) DatumGetInt16(PG_GETARG_DATUM(n))
#define PG_GETARG_CHAR(n) DatumGetChar(fcinfo->arg[n]) #define PG_GETARG_UINT16(n) DatumGetUInt16(PG_GETARG_DATUM(n))
#define PG_GETARG_BOOL(n) DatumGetBool(fcinfo->arg[n]) #define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n))
#define PG_GETARG_OID(n) DatumGetObjectId(fcinfo->arg[n]) #define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n))
#define PG_GETARG_POINTER(n) DatumGetPointer(fcinfo->arg[n]) #define PG_GETARG_OID(n) DatumGetObjectId(PG_GETARG_DATUM(n))
#define PG_GETARG_CSTRING(n) DatumGetCString(fcinfo->arg[n]) #define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n))
#define PG_GETARG_NAME(n) DatumGetName(fcinfo->arg[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: */ /* these macros hide the pass-by-reference-ness of the datatype: */
#define PG_GETARG_FLOAT4(n) DatumGetFloat4(fcinfo->arg[n]) #define PG_GETARG_FLOAT4(n) DatumGetFloat4(PG_GETARG_DATUM(n))
#define PG_GETARG_FLOAT8(n) DatumGetFloat8(fcinfo->arg[n]) #define PG_GETARG_FLOAT8(n) DatumGetFloat8(PG_GETARG_DATUM(n))
#define PG_GETARG_INT64(n) DatumGetInt64(fcinfo->arg[n]) #define PG_GETARG_INT64(n) DatumGetInt64(PG_GETARG_DATUM(n))
/* use this if you want the raw, possibly-toasted input datum: */ /* use this if you want the raw, possibly-toasted input datum: */
#define PG_GETARG_RAW_VARLENA_P(n) ((struct varlena *) PG_GETARG_POINTER(n)) #define PG_GETARG_RAW_VARLENA_P(n) ((struct varlena *) PG_GETARG_POINTER(n))
/* use this if you want the input datum de-toasted: */ /* use this if you want the input datum de-toasted: */
#if 1 #define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n))
/* VERY TEMPORARY until some TOAST support is committed ... */ /* DatumGetFoo macros for varlena types will typically look like this: */
#define PG_GETARG_VARLENA_P(n) PG_GETARG_RAW_VARLENA_P(n) #define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X))
#else #define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X))
/* Eventually it will look more like this... */ #define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X))
#define PG_GETARG_VARLENA_P(n) \ #define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X))
(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
/* GETARG macros for varlena types will typically look like this: */ /* 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: */ /* To return a NULL do this: */
#define PG_RETURN_NULL() \ #define PG_RETURN_NULL() \
...@@ -151,7 +163,10 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo); ...@@ -151,7 +163,10 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo);
#define PG_RETURN_FLOAT8(x) return Float8GetDatum(x) #define PG_RETURN_FLOAT8(x) return Float8GetDatum(x)
#define PG_RETURN_INT64(x) return Int64GetDatum(x) #define PG_RETURN_INT64(x) return Int64GetDatum(x)
/* RETURN macros for other pass-by-ref types will typically look like this: */ /* 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)
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
......
/* $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 #ifndef PG_WCHAR_H
#define PG_WCHAR_H #define PG_WCHAR_H
...@@ -122,11 +122,11 @@ extern unsigned char *pg_client_to_server(unsigned char *, int); ...@@ -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 unsigned char *pg_server_to_client(unsigned char *, int);
extern int pg_valid_client_encoding(const char *); extern int pg_valid_client_encoding(const char *);
/* moved to miscadmin.h /* internally-used versions of functions. The PG_xxx forms of these
* pg_proc.h now have them. * functions have fmgr-compatible interfaves.
*/
extern const char *pg_encoding_to_char(int); extern const char *pg_encoding_to_char(int);
extern int pg_char_to_encoding(const char *); extern int pg_char_to_encoding(const char *);
*/
extern int GetDatabaseEncoding(void); extern int GetDatabaseEncoding(void);
extern void SetDatabaseEncoding(int); extern void SetDatabaseEncoding(int);
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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 * NOTES
* some of the information in this file will be moved to * some of the information in this file will be moved to
...@@ -131,13 +131,6 @@ extern char *ExpandDatabasePath(const char *path); ...@@ -131,13 +131,6 @@ extern char *ExpandDatabasePath(const char *path);
extern void SetDatabaseName(const char *name); extern void SetDatabaseName(const char *name);
extern void SetDatabasePath(const char *path); 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 char *getpgusername(void);
extern void SetPgUserName(void); extern void SetPgUserName(void);
extern int GetUserId(void); extern int GetUserId(void);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -33,9 +33,9 @@ extern Cash *cash_mul_flt4(Cash *c, float4 *f); ...@@ -33,9 +33,9 @@ extern Cash *cash_mul_flt4(Cash *c, float4 *f);
extern Cash *cash_div_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 *flt4_mul_cash(float4 *f, Cash *c);
extern Cash *cash_mul_int4(Cash *c, int4 i); extern Datum cash_mul_int4(PG_FUNCTION_ARGS);
extern Cash *cash_div_int4(Cash *c, int4 i); extern Datum cash_div_int4(PG_FUNCTION_ARGS);
extern Cash *int4_mul_cash(int4 i, Cash *c); extern Datum int4_mul_cash(PG_FUNCTION_ARGS);
extern Datum cash_mul_int2(PG_FUNCTION_ARGS); extern Datum cash_mul_int2(PG_FUNCTION_ARGS);
extern Datum int2_mul_cash(PG_FUNCTION_ARGS); extern Datum int2_mul_cash(PG_FUNCTION_ARGS);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -40,5 +40,5 @@ CREATE FUNCTION ttdummy () ...@@ -40,5 +40,5 @@ CREATE FUNCTION ttdummy ()
CREATE FUNCTION set_ttdummy (int4) CREATE FUNCTION set_ttdummy (int4)
RETURNS int4 RETURNS int4
AS '_OBJWD_/regress_DLSUFFIX_' AS '_OBJWD_/regress_DLSUFFIX_'
LANGUAGE 'c'; LANGUAGE 'newC';
...@@ -33,4 +33,4 @@ CREATE FUNCTION ttdummy () ...@@ -33,4 +33,4 @@ CREATE FUNCTION ttdummy ()
CREATE FUNCTION set_ttdummy (int4) CREATE FUNCTION set_ttdummy (int4)
RETURNS int4 RETURNS int4
AS '_OBJWD_/regress_DLSUFFIX_' AS '_OBJWD_/regress_DLSUFFIX_'
LANGUAGE 'c'; LANGUAGE 'newC';
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment