mirror of
https://github.com/postgres/postgres.git
synced 2025-11-12 05:01:15 +03:00
Another round of updates for new fmgr, mostly in the datetime code.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.35 2000/06/05 07:28:36 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.36 2000/06/09 01:11:01 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@@ -170,9 +170,12 @@ btoidvectorcmp(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT32(0);
|
||||
}
|
||||
|
||||
int32
|
||||
btabstimecmp(AbsoluteTime a, AbsoluteTime b)
|
||||
Datum
|
||||
btabstimecmp(PG_FUNCTION_ARGS)
|
||||
{
|
||||
AbsoluteTime a = PG_GETARG_ABSOLUTETIME(0);
|
||||
AbsoluteTime b = PG_GETARG_ABSOLUTETIME(1);
|
||||
|
||||
if (AbsoluteTimeIsBefore(a, b))
|
||||
PG_RETURN_INT32(-1);
|
||||
else if (AbsoluteTimeIsBefore(b, a))
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.57 2000/06/02 03:58:33 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.58 2000/06/09 01:11:04 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -122,8 +122,8 @@ write_password_file(Relation rel)
|
||||
"%s\n",
|
||||
nameout(DatumGetName(datum_n)),
|
||||
null_p ? "" : textout((text *) datum_p),
|
||||
null_v ? "\\N" : nabstimeout((AbsoluteTime) datum_v) /* this is how the
|
||||
* parser wants it */
|
||||
null_v ? "\\N" :
|
||||
DatumGetCString(DirectFunctionCall1(nabstimeout, datum_v))
|
||||
);
|
||||
}
|
||||
heap_endscan(scan);
|
||||
@@ -268,7 +268,8 @@ CreateUser(CreateUserStmt *stmt)
|
||||
if (stmt->password)
|
||||
new_record[Anum_pg_shadow_passwd - 1] = PointerGetDatum(textin(stmt->password));
|
||||
if (stmt->validUntil)
|
||||
new_record[Anum_pg_shadow_valuntil - 1] = PointerGetDatum(nabstimein(stmt->validUntil));
|
||||
new_record[Anum_pg_shadow_valuntil - 1] =
|
||||
DirectFunctionCall1(nabstimein, CStringGetDatum(stmt->validUntil));
|
||||
|
||||
new_record_nulls[Anum_pg_shadow_usename - 1] = ' ';
|
||||
new_record_nulls[Anum_pg_shadow_usesysid - 1] = ' ';
|
||||
@@ -445,7 +446,8 @@ AlterUser(AlterUserStmt *stmt)
|
||||
/* valid until */
|
||||
if (stmt->validUntil)
|
||||
{
|
||||
new_record[Anum_pg_shadow_valuntil - 1] = PointerGetDatum(nabstimein(stmt->validUntil));
|
||||
new_record[Anum_pg_shadow_valuntil - 1] =
|
||||
DirectFunctionCall1(nabstimein, CStringGetDatum(stmt->validUntil));
|
||||
new_record_nulls[Anum_pg_shadow_valuntil - 1] = ' ';
|
||||
}
|
||||
else
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.45 2000/06/02 15:57:20 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.46 2000/06/09 01:11:06 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This should be moved to a more appropriate place. It is here
|
||||
@@ -49,6 +49,11 @@
|
||||
#define BUFSIZE 1024
|
||||
#define FNAME_BUFSIZE 8192
|
||||
|
||||
/*
|
||||
* LO "FD"s are indexes into this array.
|
||||
* A non-null entry is a pointer to a LargeObjectDesc allocated in the
|
||||
* LO private memory context.
|
||||
*/
|
||||
static LargeObjectDesc *cookies[MAX_LOBJ_FDS];
|
||||
|
||||
static GlobalMemory fscxt = NULL;
|
||||
@@ -61,15 +66,17 @@ static void deleteLOfd(int fd);
|
||||
* File Interfaces for Large Objects
|
||||
*****************************************************************************/
|
||||
|
||||
int
|
||||
lo_open(Oid lobjId, int mode)
|
||||
Datum
|
||||
lo_open(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid lobjId = PG_GETARG_OID(0);
|
||||
int32 mode = PG_GETARG_INT32(1);
|
||||
LargeObjectDesc *lobjDesc;
|
||||
int fd;
|
||||
MemoryContext currentContext;
|
||||
|
||||
#if FSDB
|
||||
elog(NOTICE, "LOopen(%u,%d)", lobjId, mode);
|
||||
elog(NOTICE, "lo_open(%u,%d)", lobjId, mode);
|
||||
#endif
|
||||
|
||||
if (fscxt == NULL)
|
||||
@@ -84,7 +91,7 @@ lo_open(Oid lobjId, int mode)
|
||||
#if FSDB
|
||||
elog(NOTICE, "cannot open large object %u", lobjId);
|
||||
#endif
|
||||
return -1;
|
||||
PG_RETURN_INT32(-1);
|
||||
}
|
||||
|
||||
fd = newLOfd(lobjDesc);
|
||||
@@ -97,26 +104,27 @@ lo_open(Oid lobjId, int mode)
|
||||
elog(NOTICE, "Out of space for large object FDs");
|
||||
#endif
|
||||
|
||||
return fd;
|
||||
PG_RETURN_INT32(fd);
|
||||
}
|
||||
|
||||
int
|
||||
lo_close(int fd)
|
||||
Datum
|
||||
lo_close(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 fd = PG_GETARG_INT32(0);
|
||||
MemoryContext currentContext;
|
||||
|
||||
if (fd < 0 || fd >= MAX_LOBJ_FDS)
|
||||
{
|
||||
elog(ERROR, "lo_close: large obj descriptor (%d) out of range", fd);
|
||||
return -2;
|
||||
PG_RETURN_INT32(-2);
|
||||
}
|
||||
if (cookies[fd] == NULL)
|
||||
{
|
||||
elog(ERROR, "lo_close: invalid large obj descriptor (%d)", fd);
|
||||
return -3;
|
||||
PG_RETURN_INT32(-3);
|
||||
}
|
||||
#if FSDB
|
||||
elog(NOTICE, "LOclose(%d)", fd);
|
||||
elog(NOTICE, "lo_close(%d)", fd);
|
||||
#endif
|
||||
|
||||
Assert(fscxt != NULL);
|
||||
@@ -127,13 +135,19 @@ lo_close(int fd)
|
||||
MemoryContextSwitchTo(currentContext);
|
||||
|
||||
deleteLOfd(fd);
|
||||
return 0;
|
||||
|
||||
PG_RETURN_INT32(0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
/*****************************************************************************
|
||||
* Bare Read/Write operations --- these are not fmgr-callable!
|
||||
*
|
||||
* We assume the large object supports byte oriented reads and seeks so
|
||||
* that our work is easier.
|
||||
*/
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
int
|
||||
lo_read(int fd, char *buf, int len)
|
||||
{
|
||||
@@ -157,7 +171,8 @@ lo_read(int fd, char *buf, int len)
|
||||
status = inv_read(cookies[fd], buf, len);
|
||||
|
||||
MemoryContextSwitchTo(currentContext);
|
||||
return (status);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -183,25 +198,29 @@ lo_write(int fd, char *buf, int len)
|
||||
status = inv_write(cookies[fd], buf, len);
|
||||
|
||||
MemoryContextSwitchTo(currentContext);
|
||||
return (status);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
lo_lseek(int fd, int offset, int whence)
|
||||
Datum
|
||||
lo_lseek(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 fd = PG_GETARG_INT32(0);
|
||||
int32 offset = PG_GETARG_INT32(1);
|
||||
int32 whence = PG_GETARG_INT32(2);
|
||||
MemoryContext currentContext;
|
||||
int status;
|
||||
|
||||
if (fd < 0 || fd >= MAX_LOBJ_FDS)
|
||||
{
|
||||
elog(ERROR, "lo_lseek: large obj descriptor (%d) out of range", fd);
|
||||
return -2;
|
||||
PG_RETURN_INT32(-2);
|
||||
}
|
||||
if (cookies[fd] == NULL)
|
||||
{
|
||||
elog(ERROR, "lo_lseek: invalid large obj descriptor (%d)", fd);
|
||||
return -3;
|
||||
PG_RETURN_INT32(-3);
|
||||
}
|
||||
|
||||
Assert(fscxt != NULL);
|
||||
@@ -211,12 +230,13 @@ lo_lseek(int fd, int offset, int whence)
|
||||
|
||||
MemoryContextSwitchTo(currentContext);
|
||||
|
||||
return status;
|
||||
PG_RETURN_INT32(status);
|
||||
}
|
||||
|
||||
Oid
|
||||
lo_creat(int mode)
|
||||
Datum
|
||||
lo_creat(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 mode = PG_GETARG_INT32(0);
|
||||
LargeObjectDesc *lobjDesc;
|
||||
MemoryContext currentContext;
|
||||
Oid lobjId;
|
||||
@@ -231,31 +251,32 @@ lo_creat(int mode)
|
||||
if (lobjDesc == NULL)
|
||||
{
|
||||
MemoryContextSwitchTo(currentContext);
|
||||
return InvalidOid;
|
||||
PG_RETURN_OID(InvalidOid);
|
||||
}
|
||||
|
||||
lobjId = RelationGetRelid(lobjDesc->heap_r);
|
||||
|
||||
inv_close(lobjDesc);
|
||||
|
||||
/* switch context back to original memory context */
|
||||
MemoryContextSwitchTo(currentContext);
|
||||
|
||||
return lobjId;
|
||||
PG_RETURN_OID(lobjId);
|
||||
}
|
||||
|
||||
int
|
||||
lo_tell(int fd)
|
||||
Datum
|
||||
lo_tell(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 fd = PG_GETARG_INT32(0);
|
||||
|
||||
if (fd < 0 || fd >= MAX_LOBJ_FDS)
|
||||
{
|
||||
elog(ERROR, "lo_tell: large object descriptor (%d) out of range", fd);
|
||||
return -2;
|
||||
PG_RETURN_INT32(-2);
|
||||
}
|
||||
if (cookies[fd] == NULL)
|
||||
{
|
||||
elog(ERROR, "lo_tell: invalid large object descriptor (%d)", fd);
|
||||
return -3;
|
||||
PG_RETURN_INT32(-3);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -263,12 +284,13 @@ lo_tell(int fd)
|
||||
* true for now, but is probably more than this module ought to
|
||||
* assume...
|
||||
*/
|
||||
return inv_tell(cookies[fd]);
|
||||
PG_RETURN_INT32(inv_tell(cookies[fd]));
|
||||
}
|
||||
|
||||
int
|
||||
lo_unlink(Oid lobjId)
|
||||
Datum
|
||||
lo_unlink(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid lobjId = PG_GETARG_OID(0);
|
||||
|
||||
/*
|
||||
* inv_drop does not need a context switch, indeed it doesn't touch
|
||||
@@ -278,35 +300,42 @@ lo_unlink(Oid lobjId)
|
||||
* XXX there ought to be some code to clean up any open LOs that
|
||||
* reference the specified relation... as is, they remain "open".
|
||||
*/
|
||||
return inv_drop(lobjId);
|
||||
PG_RETURN_INT32(inv_drop(lobjId));
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* Read/Write using varlena
|
||||
* Read/Write using bytea
|
||||
*****************************************************************************/
|
||||
|
||||
struct varlena *
|
||||
loread(int fd, int len)
|
||||
Datum
|
||||
loread(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 fd = PG_GETARG_INT32(0);
|
||||
int32 len = PG_GETARG_INT32(1);
|
||||
struct varlena *retval;
|
||||
int totalread = 0;
|
||||
int totalread;
|
||||
|
||||
if (len < 0)
|
||||
len = 0;
|
||||
|
||||
retval = (struct varlena *) palloc(VARHDRSZ + len);
|
||||
totalread = lo_read(fd, VARDATA(retval), len);
|
||||
VARSIZE(retval) = totalread + VARHDRSZ;
|
||||
|
||||
return retval;
|
||||
PG_RETURN_POINTER(retval);
|
||||
}
|
||||
|
||||
int
|
||||
lowrite(int fd, struct varlena * wbuf)
|
||||
Datum
|
||||
lowrite(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int totalwritten;
|
||||
int bytestowrite;
|
||||
int32 fd = PG_GETARG_INT32(0);
|
||||
struct varlena *wbuf = PG_GETARG_VARLENA_P(1);
|
||||
int bytestowrite;
|
||||
int totalwritten;
|
||||
|
||||
bytestowrite = VARSIZE(wbuf) - VARHDRSZ;
|
||||
totalwritten = lo_write(fd, VARDATA(wbuf), bytestowrite);
|
||||
return totalwritten;
|
||||
PG_RETURN_INT32(totalwritten);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
@@ -317,9 +346,10 @@ lowrite(int fd, struct varlena * wbuf)
|
||||
* lo_import -
|
||||
* imports a file as an (inversion) large object.
|
||||
*/
|
||||
Oid
|
||||
lo_import(text *filename)
|
||||
Datum
|
||||
lo_import(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *filename = PG_GETARG_TEXT_P(0);
|
||||
File fd;
|
||||
int nbytes,
|
||||
tmp;
|
||||
@@ -379,16 +409,18 @@ lo_import(text *filename)
|
||||
FileClose(fd);
|
||||
inv_close(lobj);
|
||||
|
||||
return lobjOid;
|
||||
PG_RETURN_OID(lobjOid);
|
||||
}
|
||||
|
||||
/*
|
||||
* lo_export -
|
||||
* exports an (inversion) large object.
|
||||
*/
|
||||
int4
|
||||
lo_export(Oid lobjId, text *filename)
|
||||
Datum
|
||||
lo_export(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid lobjId = PG_GETARG_OID(0);
|
||||
text *filename = PG_GETARG_TEXT_P(1);
|
||||
File fd;
|
||||
int nbytes,
|
||||
tmp;
|
||||
@@ -445,7 +477,7 @@ lo_export(Oid lobjId, text *filename)
|
||||
inv_close(lobj);
|
||||
FileClose(fd);
|
||||
|
||||
return 1;
|
||||
PG_RETURN_INT32(1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
* Dec 17, 1997 - Todd A. Brandys
|
||||
* Orignal Version Completed.
|
||||
*
|
||||
* $Id: crypt.c,v 1.24 2000/06/02 15:57:20 momjian Exp $
|
||||
* $Id: crypt.c,v 1.25 2000/06/09 01:11:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -288,7 +288,8 @@ crypt_verify(Port *port, const char *user, const char *pgpass)
|
||||
if (!valuntil || strcmp(valuntil, "\\N") == 0)
|
||||
vuntil = INVALID_ABSTIME;
|
||||
else
|
||||
vuntil = nabstimein(valuntil);
|
||||
vuntil = DatumGetAbsoluteTime(DirectFunctionCall1(nabstimein,
|
||||
CStringGetDatum(valuntil)));
|
||||
current = GetCurrentAbsoluteTime();
|
||||
if (vuntil != INVALID_ABSTIME && vuntil < current)
|
||||
retval = STATUS_ERROR;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.55 2000/06/02 15:57:28 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.56 2000/06/09 01:11:08 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -538,8 +538,11 @@ _ReadLOArray(char *str,
|
||||
|
||||
if (inputfile == NULL)
|
||||
elog(ERROR, "array_in: missing file name");
|
||||
lobjId = lo_creat(0);
|
||||
*fd = lo_open(lobjId, INV_READ);
|
||||
lobjId = DatumGetObjectId(DirectFunctionCall1(lo_creat,
|
||||
Int32GetDatum(0)));
|
||||
*fd = DatumGetInt32(DirectFunctionCall2(lo_open,
|
||||
ObjectIdGetDatum(lobjId),
|
||||
Int32GetDatum(INV_READ)));
|
||||
if (*fd < 0)
|
||||
elog(ERROR, "Large object create failed");
|
||||
retStr = inputfile;
|
||||
@@ -877,17 +880,23 @@ array_ref(ArrayType *array,
|
||||
v = _ReadChunkArray1El(indx, elmlen, fd, array, isNull);
|
||||
else
|
||||
{
|
||||
if (lo_lseek(fd, offset, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fd),
|
||||
Int32GetDatum(offset),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
#ifdef LOARRAY
|
||||
v = (struct varlena *) LOread(fd, elmlen);
|
||||
v = (struct varlena *)
|
||||
DatumGetPointer(DirectFunctionCall2(loread,
|
||||
Int32GetDatum(fd),
|
||||
Int32GetDatum(elmlen)));
|
||||
#endif
|
||||
}
|
||||
if (*isNull)
|
||||
RETURN_NULL;
|
||||
if (VARSIZE(v) - VARHDRSZ < elmlen)
|
||||
RETURN_NULL;
|
||||
lo_close(fd);
|
||||
DirectFunctionCall1(lo_close, Int32GetDatum(fd));
|
||||
retval = (char *) _ArrayCast((char *) VARDATA(v), reftype, elmlen);
|
||||
if (reftype == 0)
|
||||
{ /* not by value */
|
||||
@@ -1029,7 +1038,9 @@ array_clip(ArrayType *array,
|
||||
memmove(buff, &rsize, VARHDRSZ);
|
||||
#ifdef LOARRAY
|
||||
if (!*isNull)
|
||||
bytes = LOwrite(newfd, (struct varlena *) buff);
|
||||
bytes = DatumGetInt32(DirectFunctionCall2(lowrite,
|
||||
Int32GetDatum(newfd),
|
||||
PointerGetDatum(buff)));
|
||||
#endif
|
||||
pfree(buff);
|
||||
}
|
||||
@@ -1140,20 +1151,25 @@ array_set(ArrayType *array,
|
||||
if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_WRITE : O_WRONLY)) < 0)
|
||||
return (char *) array;
|
||||
#endif
|
||||
if (lo_lseek(fd, offset, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fd),
|
||||
Int32GetDatum(offset),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
return (char *) array;
|
||||
v = (struct varlena *) palloc(elmlen + VARHDRSZ);
|
||||
VARSIZE(v) = elmlen + VARHDRSZ;
|
||||
ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, VARDATA(v));
|
||||
#ifdef LOARRAY
|
||||
n = LOwrite(fd, v);
|
||||
n = DatumGetInt32(DirectFunctionCall2(lowrite,
|
||||
Int32GetDatum(fd),
|
||||
PointerGetDatum(v)));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* if (n < VARSIZE(v) - VARHDRSZ) RETURN_NULL;
|
||||
*/
|
||||
pfree(v);
|
||||
lo_close(fd);
|
||||
DirectFunctionCall1(lo_close, Int32GetDatum(fd));
|
||||
return (char *) array;
|
||||
}
|
||||
if (elmlen > 0)
|
||||
@@ -1270,14 +1286,14 @@ array_assgn(ArrayType *array,
|
||||
return (char *) array;
|
||||
#endif
|
||||
_LOArrayRange(lowerIndx, upperIndx, len, fd, newfd, array, 1, isNull);
|
||||
lo_close(newfd);
|
||||
DirectFunctionCall1(lo_close, Int32GetDatum(newfd));
|
||||
}
|
||||
else
|
||||
{
|
||||
_LOArrayRange(lowerIndx, upperIndx, len, fd, (int) ARR_DATA_PTR(newArr),
|
||||
array, 0, isNull);
|
||||
}
|
||||
lo_close(fd);
|
||||
DirectFunctionCall1(lo_close, Int32GetDatum(fd));
|
||||
return (char *) array;
|
||||
}
|
||||
_ArrayRange(lowerIndx, upperIndx, len, ARR_DATA_PTR(newArr), array, 0);
|
||||
@@ -1758,7 +1774,10 @@ _LOArrayRange(int *st,
|
||||
mda_get_prod(n, dim, prod);
|
||||
st_pos = tuple2linear(n, st, prod);
|
||||
offset = st_pos * bsize;
|
||||
if (lo_lseek(srcfd, offset, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(srcfd),
|
||||
Int32GetDatum(offset),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
return;
|
||||
mda_get_range(n, span, st, endp);
|
||||
mda_get_offset_values(n, dist, prod, span);
|
||||
@@ -1770,7 +1789,10 @@ _LOArrayRange(int *st,
|
||||
do
|
||||
{
|
||||
offset += (dist[j] * bsize);
|
||||
if (lo_lseek(srcfd, offset, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(srcfd),
|
||||
Int32GetDatum(offset),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
return;
|
||||
tmp = _LOtransfer((char **) &srcfd, inc, 1, (char **) &destfd, isSrcLO, 1);
|
||||
if (tmp < inc)
|
||||
@@ -1812,7 +1834,10 @@ _ReadArray(int *st,
|
||||
mda_get_prod(n, dim, prod);
|
||||
st_pos = tuple2linear(n, st, prod);
|
||||
offset = st_pos * bsize;
|
||||
if (lo_lseek(srcfd, offset, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(srcfd),
|
||||
Int32GetDatum(offset),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
return;
|
||||
mda_get_range(n, span, st, endp);
|
||||
mda_get_offset_values(n, dist, prod, span);
|
||||
@@ -1824,7 +1849,10 @@ _ReadArray(int *st,
|
||||
do
|
||||
{
|
||||
offset += (dist[j] * bsize);
|
||||
if (lo_lseek(srcfd, offset, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(srcfd),
|
||||
Int32GetDatum(offset),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
return;
|
||||
tmp = _LOtransfer((char **) &destfd, inc, 1, (char **) &srcfd, 1, isDestLO);
|
||||
if (tmp < inc)
|
||||
@@ -1857,13 +1885,18 @@ _LOtransfer(char **destfd,
|
||||
resid > 0 && (inc = min(resid, MAX_READ)) > 0; resid -= inc)
|
||||
{
|
||||
#ifdef LOARRAY
|
||||
v = (struct varlena *) LOread((int) *srcfd, inc);
|
||||
v = (struct varlena *)
|
||||
DatumGetPointer(DirectFunctionCall2(loread,
|
||||
Int32GetDatum((int32) *srcfd),
|
||||
Int32GetDatum(inc)));
|
||||
if (VARSIZE(v) - VARHDRSZ < inc)
|
||||
{
|
||||
pfree(v);
|
||||
return -1;
|
||||
}
|
||||
tmp += LOwrite((int) *destfd, v);
|
||||
tmp += DatumGetInt32(DirectFunctionCall2(lowrite,
|
||||
Int32GetDatum((int32) *destfd),
|
||||
PointerGetDatum(v)));
|
||||
#endif
|
||||
pfree(v);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/chunk.c,v 1.25 2000/01/26 05:57:13 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/chunk.c,v 1.26 2000/06/09 01:11:08 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -385,7 +385,9 @@ write_chunk(struct varlena * a_chunk, int ofile)
|
||||
int got_n = 0;
|
||||
|
||||
#ifdef LOARRAY
|
||||
got_n = LOwrite(ofile, a_chunk);
|
||||
got_n = DatumGetInt32(DirectFunctionCall2(lowrite,
|
||||
Int32GetDatum(ofile),
|
||||
PointerGetDatum(a_chunk)));
|
||||
#endif
|
||||
return got_n;
|
||||
}
|
||||
@@ -400,13 +402,19 @@ write_chunk(struct varlena * a_chunk, int ofile)
|
||||
static int
|
||||
seek_and_read(int pos, int size, char *buff, int fp, int from)
|
||||
{
|
||||
struct varlena *v = NULL;
|
||||
struct varlena *v;
|
||||
|
||||
/* Assuming only one file */
|
||||
if (lo_lseek(fp, pos, from) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(pos),
|
||||
Int32GetDatum(from))) < 0)
|
||||
elog(ERROR, "File seek error");
|
||||
#ifdef LOARRAY
|
||||
v = (struct varlena *) LOread(fp, size);
|
||||
v = (struct varlena *)
|
||||
DatumGetPointer(DirectFunctionCall2(loread,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(size)));
|
||||
#endif
|
||||
if (VARSIZE(v) - VARHDRSZ < size)
|
||||
elog(ERROR, "File read error");
|
||||
@@ -505,7 +513,10 @@ _ReadChunkArray(int *st,
|
||||
for (i = j = 0; i < n; i++)
|
||||
j += chunk_st[i] * PC[i];
|
||||
temp_seek = srcOff = j * csize * bsize;
|
||||
if (lo_lseek(fp, srcOff, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(srcOff),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
|
||||
jj = n - 1;
|
||||
@@ -526,7 +537,10 @@ _ReadChunkArray(int *st,
|
||||
bptr *= bsize;
|
||||
if (isDestLO)
|
||||
{
|
||||
if (lo_lseek((int) destfp, bptr, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum((int32) destfp),
|
||||
Int32GetDatum(bptr),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
}
|
||||
else
|
||||
@@ -538,7 +552,10 @@ _ReadChunkArray(int *st,
|
||||
{
|
||||
temp = (dist[jj] * csize + block_seek + temp_seek) * bsize;
|
||||
srcOff += temp;
|
||||
if (lo_lseek(fp, srcOff, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(srcOff),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
}
|
||||
for (i = n - 1, to_read = bsize; i >= 0;
|
||||
@@ -550,14 +567,20 @@ _ReadChunkArray(int *st,
|
||||
if (cdist[j])
|
||||
{
|
||||
srcOff += (cdist[j] * bsize);
|
||||
if (lo_lseek(fp, srcOff, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(srcOff),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
}
|
||||
block_seek += cdist[j];
|
||||
bptr += adist[j] * bsize;
|
||||
if (isDestLO)
|
||||
{
|
||||
if (lo_lseek((int) destfp, bptr, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum((int32) destfp),
|
||||
Int32GetDatum(bptr),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
}
|
||||
else
|
||||
@@ -675,10 +698,16 @@ _ReadChunkArray1El(int *st,
|
||||
srcOff += (st[i] - chunk_st[i] * C[i]) * PCHUNK[i];
|
||||
|
||||
srcOff *= bsize;
|
||||
if (lo_lseek(fp, srcOff, SEEK_SET) < 0)
|
||||
if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(srcOff),
|
||||
Int32GetDatum(SEEK_SET))) < 0)
|
||||
RETURN_NULL;
|
||||
#ifdef LOARRAY
|
||||
return (struct varlena *) LOread(fp, bsize);
|
||||
return (struct varlena *)
|
||||
DatumGetPointer(DirectFunctionCall2(loread,
|
||||
Int32GetDatum(fp),
|
||||
Int32GetDatum(bsize)));
|
||||
#endif
|
||||
return (struct varlena *) 0;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
/* -----------------------------------------------------------------------
|
||||
* formatting.c
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.9 2000/06/05 07:28:51 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.10 2000/06/09 01:11:08 tgl Exp $
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
|
||||
@@ -2372,9 +2372,11 @@ DCH_cache_search(char *str)
|
||||
* TIMESTAMP to_char()
|
||||
* -------------------
|
||||
*/
|
||||
text *
|
||||
timestamp_to_char(Timestamp *dt, text *fmt)
|
||||
Datum
|
||||
timestamp_to_char(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Timestamp dt = PG_GETARG_TIMESTAMP(0);
|
||||
text *fmt = PG_GETARG_TEXT_P(1);
|
||||
text *result,
|
||||
*result_tmp;
|
||||
FormatNode *format;
|
||||
@@ -2386,13 +2388,10 @@ timestamp_to_char(Timestamp *dt, text *fmt)
|
||||
flag = 0,
|
||||
x = 0;
|
||||
|
||||
if ((!PointerIsValid(dt)) || (!PointerIsValid(fmt)))
|
||||
return NULL;
|
||||
|
||||
len = VARSIZE(fmt) - VARHDRSZ;
|
||||
|
||||
if ((!len) || (TIMESTAMP_NOT_FINITE(*dt)))
|
||||
return textin("");
|
||||
if ((!len) || (TIMESTAMP_NOT_FINITE(dt)))
|
||||
return PointerGetDatum(textin(""));
|
||||
|
||||
tm->tm_sec = 0;
|
||||
tm->tm_year = 0;
|
||||
@@ -2404,18 +2403,18 @@ timestamp_to_char(Timestamp *dt, text *fmt)
|
||||
tm->tm_isdst = 0;
|
||||
tm->tm_mon = 1;
|
||||
|
||||
if (TIMESTAMP_IS_EPOCH(*dt))
|
||||
if (TIMESTAMP_IS_EPOCH(dt))
|
||||
{
|
||||
x = timestamp2tm(SetTimestamp(*dt), NULL, tm, &fsec, NULL);
|
||||
x = timestamp2tm(SetTimestamp(dt), NULL, tm, &fsec, NULL);
|
||||
|
||||
}
|
||||
else if (TIMESTAMP_IS_CURRENT(*dt))
|
||||
else if (TIMESTAMP_IS_CURRENT(dt))
|
||||
{
|
||||
x = timestamp2tm(SetTimestamp(*dt), &tz, tm, &fsec, &tzn);
|
||||
x = timestamp2tm(SetTimestamp(dt), &tz, tm, &fsec, &tzn);
|
||||
|
||||
}
|
||||
else
|
||||
x = timestamp2tm(*dt, &tz, tm, &fsec, &tzn);
|
||||
x = timestamp2tm(dt, &tz, tm, &fsec, &tzn);
|
||||
|
||||
if (x != 0)
|
||||
elog(ERROR, "to_char(): Unable to convert timestamp to tm");
|
||||
@@ -2508,7 +2507,7 @@ timestamp_to_char(Timestamp *dt, text *fmt)
|
||||
VARSIZE(result) = len + VARHDRSZ;
|
||||
pfree(result_tmp);
|
||||
|
||||
return result;
|
||||
PG_RETURN_TEXT_P(result);
|
||||
}
|
||||
|
||||
|
||||
@@ -2519,20 +2518,19 @@ timestamp_to_char(Timestamp *dt, text *fmt)
|
||||
* ( to_timestamp is reverse to_char() )
|
||||
* ---------------------
|
||||
*/
|
||||
Timestamp *
|
||||
to_timestamp(text *date_str, text *fmt)
|
||||
Datum
|
||||
to_timestamp(PG_FUNCTION_ARGS)
|
||||
{
|
||||
text *date_str = PG_GETARG_TEXT_P(0);
|
||||
text *fmt = PG_GETARG_TEXT_P(1);
|
||||
FormatNode *format;
|
||||
int flag = 0;
|
||||
Timestamp *result;
|
||||
Timestamp result;
|
||||
char *str;
|
||||
int len = 0,
|
||||
fsec = 0,
|
||||
tz = 0;
|
||||
|
||||
if ((!PointerIsValid(date_str)) || (!PointerIsValid(fmt)))
|
||||
return NULL;
|
||||
|
||||
tm->tm_sec = 0;
|
||||
tm->tm_year = 0;
|
||||
tm->tm_min = 0;
|
||||
@@ -2543,8 +2541,6 @@ to_timestamp(text *date_str, text *fmt)
|
||||
tm->tm_isdst = 0;
|
||||
tm->tm_mon = 1;
|
||||
|
||||
result = palloc(sizeof(Timestamp));
|
||||
|
||||
len = VARSIZE(fmt) - VARHDRSZ;
|
||||
|
||||
if (len)
|
||||
@@ -2668,10 +2664,10 @@ to_timestamp(text *date_str, text *fmt)
|
||||
#ifdef DEBUG_TO_FROM_CHAR
|
||||
NOTICE_TM;
|
||||
#endif
|
||||
if (tm2timestamp(tm, fsec, &tz, result) != 0)
|
||||
elog(ERROR, "to_datatime(): can't convert 'tm' to timestamp.");
|
||||
if (tm2timestamp(tm, fsec, &tz, &result) != 0)
|
||||
elog(ERROR, "to_timestamp(): can't convert 'tm' to timestamp.");
|
||||
|
||||
return result;
|
||||
PG_RETURN_TIMESTAMP(result);
|
||||
}
|
||||
|
||||
/* ----------
|
||||
@@ -2679,10 +2675,13 @@ to_timestamp(text *date_str, text *fmt)
|
||||
* Make Date from date_str which is formated at argument 'fmt'
|
||||
* ----------
|
||||
*/
|
||||
DateADT
|
||||
to_date(text *date_str, text *fmt)
|
||||
Datum
|
||||
to_date(PG_FUNCTION_ARGS)
|
||||
{
|
||||
return timestamp_date(to_timestamp(date_str, fmt));
|
||||
/* Quick hack: since our inputs are just like to_timestamp,
|
||||
* hand over the whole input info struct...
|
||||
*/
|
||||
return DirectFunctionCall1(timestamp_date, to_timestamp(fcinfo));
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.22 2000/01/26 05:57:14 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/not_in.c,v 1.23 2000/06/09 01:11:09 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -34,23 +34,28 @@ static int my_varattno(Relation rd, char *a);
|
||||
*
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
bool
|
||||
int4notin(int32 not_in_arg, char *relation_and_attr)
|
||||
Datum
|
||||
int4notin(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 not_in_arg = PG_GETARG_INT32(0);
|
||||
text *relation_and_attr = PG_GETARG_TEXT_P(1);
|
||||
Relation relation_to_scan;
|
||||
int32 integer_value;
|
||||
HeapTuple current_tuple;
|
||||
HeapScanDesc scan_descriptor;
|
||||
bool dummy,
|
||||
bool isNull,
|
||||
retval;
|
||||
int attrid;
|
||||
int attrid,
|
||||
strlength;
|
||||
char *relation,
|
||||
*attribute;
|
||||
char my_copy[NAMEDATALEN * 2 + 2];
|
||||
Datum value;
|
||||
|
||||
strncpy(my_copy, relation_and_attr, sizeof(my_copy));
|
||||
my_copy[sizeof(my_copy) - 1] = '\0';
|
||||
strlength = VARSIZE(relation_and_attr) - VARHDRSZ + 1;
|
||||
if (strlength > sizeof(my_copy))
|
||||
strlength = sizeof(my_copy);
|
||||
StrNCpy(my_copy, VARDATA(relation_and_attr), strlength);
|
||||
|
||||
relation = (char *) strtok(my_copy, ".");
|
||||
attribute = (char *) strtok(NULL, ".");
|
||||
@@ -81,7 +86,9 @@ int4notin(int32 not_in_arg, char *relation_and_attr)
|
||||
value = heap_getattr(current_tuple,
|
||||
(AttrNumber) attrid,
|
||||
RelationGetDescr(relation_to_scan),
|
||||
&dummy);
|
||||
&isNull);
|
||||
if (isNull)
|
||||
continue;
|
||||
integer_value = DatumGetInt32(value);
|
||||
if (not_in_arg == integer_value)
|
||||
{
|
||||
@@ -94,15 +101,21 @@ int4notin(int32 not_in_arg, char *relation_and_attr)
|
||||
heap_endscan(scan_descriptor);
|
||||
heap_close(relation_to_scan, AccessShareLock);
|
||||
|
||||
return retval;
|
||||
PG_RETURN_BOOL(retval);
|
||||
}
|
||||
|
||||
bool
|
||||
oidnotin(Oid the_oid, char *compare)
|
||||
Datum
|
||||
oidnotin(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid the_oid = PG_GETARG_OID(0);
|
||||
#ifdef NOT_USED
|
||||
text *relation_and_attr = PG_GETARG_TEXT_P(1);
|
||||
#endif
|
||||
|
||||
if (the_oid == InvalidOid)
|
||||
return false;
|
||||
return int4notin(the_oid, compare);
|
||||
PG_RETURN_BOOL(false);
|
||||
/* XXX assume oid maps to int4 */
|
||||
return int4notin(fcinfo);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -117,7 +130,7 @@ my_varattno(Relation rd, char *a)
|
||||
|
||||
for (i = 0; i < rd->rd_rel->relnatts; i++)
|
||||
{
|
||||
if (!namestrcmp(&rd->rd_att->attrs[i]->attname, a))
|
||||
if (namestrcmp(&rd->rd_att->attrs[i]->attname, a) == 0)
|
||||
return i + 1;
|
||||
}
|
||||
return -1;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* out of its tuple
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.50 2000/05/30 04:24:51 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.51 2000/06/09 01:11:09 tgl Exp $
|
||||
*
|
||||
* This software is copyrighted by Jan Wieck - Hamburg.
|
||||
*
|
||||
@@ -319,9 +319,10 @@ pg_get_viewdef(NameData *rname)
|
||||
* get_indexdef - Get the definition of an index
|
||||
* ----------
|
||||
*/
|
||||
text *
|
||||
pg_get_indexdef(Oid indexrelid)
|
||||
Datum
|
||||
pg_get_indexdef(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Oid indexrelid = PG_GETARG_OID(0);
|
||||
text *indexdef;
|
||||
HeapTuple ht_idx;
|
||||
HeapTuple ht_idxrel;
|
||||
@@ -541,7 +542,7 @@ pg_get_indexdef(Oid indexrelid)
|
||||
if (SPI_finish() != SPI_OK_FINISH)
|
||||
elog(ERROR, "get_viewdef: SPI_finish() failed");
|
||||
|
||||
return indexdef;
|
||||
PG_RETURN_TEXT_P(indexdef);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.69 2000/06/05 07:28:52 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.70 2000/06/09 01:11:09 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -1038,14 +1038,16 @@ convert_timevalue_to_scalar(Datum value, Oid typid)
|
||||
switch (typid)
|
||||
{
|
||||
case TIMESTAMPOID:
|
||||
return *((Timestamp *) DatumGetPointer(value));
|
||||
return DatumGetTimestamp(value);
|
||||
case ABSTIMEOID:
|
||||
return *abstime_timestamp(value);
|
||||
return DatumGetTimestamp(DirectFunctionCall1(abstime_timestamp,
|
||||
value));
|
||||
case DATEOID:
|
||||
return *date_timestamp(value);
|
||||
return DatumGetTimestamp(DirectFunctionCall1(date_timestamp,
|
||||
value));
|
||||
case INTERVALOID:
|
||||
{
|
||||
Interval *interval = (Interval *) DatumGetPointer(value);
|
||||
Interval *interval = DatumGetIntervalP(value);
|
||||
|
||||
/*
|
||||
* Convert the month part of Interval to days using
|
||||
@@ -1056,17 +1058,17 @@ convert_timevalue_to_scalar(Datum value, Oid typid)
|
||||
interval->month * (365.25 / 12.0 * 24.0 * 60.0 * 60.0);
|
||||
}
|
||||
case RELTIMEOID:
|
||||
return (RelativeTime) DatumGetInt32(value);
|
||||
return DatumGetRelativeTime(value);
|
||||
case TINTERVALOID:
|
||||
{
|
||||
TimeInterval interval = (TimeInterval) DatumGetPointer(value);
|
||||
TimeInterval interval = DatumGetTimeInterval(value);
|
||||
|
||||
if (interval->status != 0)
|
||||
return interval->data[1] - interval->data[0];
|
||||
return 0; /* for lack of a better idea */
|
||||
}
|
||||
case TIMEOID:
|
||||
return *((TimeADT *) DatumGetPointer(value));
|
||||
return DatumGetTimeADT(value);
|
||||
}
|
||||
/* Can't get here unless someone tries to use scalarltsel/scalargtsel
|
||||
* on an operator with one timevalue and one non-timevalue operand.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.31 2000/05/28 17:56:06 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.32 2000/06/09 01:11:09 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -140,8 +140,12 @@ SetDefine(char *querystr, char *typename)
|
||||
* never executed. At runtime, the OID of the actual set is substituted
|
||||
* into the :funcid.
|
||||
*/
|
||||
int
|
||||
seteval(Oid funcoid)
|
||||
Datum
|
||||
seteval(PG_FUNCTION_ARGS)
|
||||
{
|
||||
return 17;
|
||||
Oid funcoid = PG_GETARG_OID(0);
|
||||
|
||||
elog(ERROR, "seteval called for OID %u", funcoid);
|
||||
|
||||
PG_RETURN_INT32(0); /* keep compiler happy */
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.19 2000/06/08 22:37:28 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.20 2000/06/09 01:11:09 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* input routine largely stolen from boxin().
|
||||
@@ -160,19 +160,21 @@ text_tid(const text *string)
|
||||
|
||||
/*
|
||||
* Functions to get latest tid of a specified tuple.
|
||||
* Maybe these implementations is moved
|
||||
* to another place
|
||||
*/
|
||||
ItemPointer
|
||||
currtid_byreloid(Oid reloid, ItemPointer tid)
|
||||
*
|
||||
* Maybe these implementations should be moved to another place
|
||||
*/
|
||||
Datum
|
||||
currtid_byreloid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ItemPointer result = NULL,
|
||||
ret;
|
||||
Relation rel;
|
||||
Oid reloid = PG_GETARG_OID(0);
|
||||
ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
|
||||
ItemPointer result,
|
||||
ret;
|
||||
Relation rel;
|
||||
|
||||
result = (ItemPointer) palloc(sizeof(ItemPointerData));
|
||||
ItemPointerSetInvalid(result);
|
||||
if (rel = heap_open(reloid, AccessShareLock), rel)
|
||||
if ((rel = heap_open(reloid, AccessShareLock)) != NULL)
|
||||
{
|
||||
ret = heap_get_latest_tid(rel, SnapshotNow, tid);
|
||||
if (ret)
|
||||
@@ -182,25 +184,24 @@ currtid_byreloid(Oid reloid, ItemPointer tid)
|
||||
else
|
||||
elog(ERROR, "Relation %u not found", reloid);
|
||||
|
||||
return result;
|
||||
} /* currtid_byreloid() */
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
ItemPointer
|
||||
currtid_byrelname(const text *relname, ItemPointer tid)
|
||||
Datum
|
||||
currtid_byrelname(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ItemPointer result = NULL,
|
||||
ret;
|
||||
char *str;
|
||||
Relation rel;
|
||||
text *relname = PG_GETARG_TEXT_P(0);
|
||||
ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
|
||||
ItemPointer result,
|
||||
ret;
|
||||
char *str;
|
||||
Relation rel;
|
||||
|
||||
if (!relname)
|
||||
return result;
|
||||
|
||||
str = textout((text *) relname);
|
||||
str = textout(relname);
|
||||
|
||||
result = (ItemPointer) palloc(sizeof(ItemPointerData));
|
||||
ItemPointerSetInvalid(result);
|
||||
if (rel = heap_openr(str, AccessShareLock), rel)
|
||||
if ((rel = heap_openr(str, AccessShareLock)) != NULL)
|
||||
{
|
||||
ret = heap_get_latest_tid(rel, SnapshotNow, tid);
|
||||
if (ret)
|
||||
@@ -208,8 +209,9 @@ currtid_byrelname(const text *relname, ItemPointer tid)
|
||||
heap_close(rel, AccessShareLock);
|
||||
}
|
||||
else
|
||||
elog(ERROR, "Relation %s not found", textout((text *) relname));
|
||||
elog(ERROR, "Relation %s not found", str);
|
||||
|
||||
pfree(str);
|
||||
|
||||
return result;
|
||||
} /* currtid_byrelname() */
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user