Commit ae526b40 authored by Tom Lane's avatar Tom Lane

Another round of updates for new fmgr, mostly in the datetime code.

parent 20ad43b5
/* /*
* PostgreSQL type definitions for managed LargeObjects. * PostgreSQL type definitions for managed LargeObjects.
* *
* $Id: lo.c,v 1.3 2000/05/29 01:59:02 tgl Exp $ * $Id: lo.c,v 1.4 2000/06/09 01:10:58 tgl Exp $
* *
*/ */
...@@ -76,7 +76,8 @@ lo_in(char *str) ...@@ -76,7 +76,8 @@ lo_in(char *str)
/* /*
* There is no Oid passed, so create a new one * There is no Oid passed, so create a new one
*/ */
oid = lo_creat(INV_READ | INV_WRITE); oid = DatumGetObjectId(DirectFunctionCall1(lo_creat,
Int32GetDatum(INV_READ | INV_WRITE)));
if (oid == InvalidOid) if (oid == InvalidOid)
{ {
elog(ERROR, "lo_in: InvalidOid returned from lo_creat"); elog(ERROR, "lo_in: InvalidOid returned from lo_creat");
...@@ -186,7 +187,8 @@ lo_manage(PG_FUNCTION_ARGS) ...@@ -186,7 +187,8 @@ lo_manage(PG_FUNCTION_ARGS)
char *newv = SPI_getvalue(newtuple, tupdesc, attnum); char *newv = SPI_getvalue(newtuple, tupdesc, attnum);
if ((orig != newv && (orig == NULL || newv == NULL)) || (orig != NULL && newv != NULL && strcmp(orig, newv))) if ((orig != newv && (orig == NULL || newv == NULL)) || (orig != NULL && newv != NULL && strcmp(orig, newv)))
lo_unlink(atoi(orig)); DirectFunctionCall1(lo_unlink,
ObjectIdGetDatum((Oid) atoi(orig)));
if (newv) if (newv)
pfree(newv); pfree(newv);
...@@ -206,7 +208,8 @@ lo_manage(PG_FUNCTION_ARGS) ...@@ -206,7 +208,8 @@ lo_manage(PG_FUNCTION_ARGS)
if (orig != NULL) if (orig != NULL)
{ {
lo_unlink(atoi(orig)); DirectFunctionCall1(lo_unlink,
ObjectIdGetDatum((Oid) atoi(orig)));
pfree(orig); pfree(orig);
} }
......
...@@ -62,7 +62,8 @@ moddatetime(PG_FUNCTION_ARGS) ...@@ -62,7 +62,8 @@ moddatetime(PG_FUNCTION_ARGS)
tupdesc = rel->rd_att; tupdesc = rel->rd_att;
/* Get the current datetime. */ /* Get the current datetime. */
newdt = (Datum) timestamp_in("now"); newdt = DirectFunctionCall1(timestamp_in,
CStringGetDatum("now"));
/* /*
* This gets the position in the turple of the field we want. args[0] * This gets the position in the turple of the field we want. args[0]
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* *
...@@ -170,9 +170,12 @@ btoidvectorcmp(PG_FUNCTION_ARGS) ...@@ -170,9 +170,12 @@ btoidvectorcmp(PG_FUNCTION_ARGS)
PG_RETURN_INT32(0); PG_RETURN_INT32(0);
} }
int32 Datum
btabstimecmp(AbsoluteTime a, AbsoluteTime b) btabstimecmp(PG_FUNCTION_ARGS)
{ {
AbsoluteTime a = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime b = PG_GETARG_ABSOLUTETIME(1);
if (AbsoluteTimeIsBefore(a, b)) if (AbsoluteTimeIsBefore(a, b))
PG_RETURN_INT32(-1); PG_RETURN_INT32(-1);
else if (AbsoluteTimeIsBefore(b, a)) else if (AbsoluteTimeIsBefore(b, a))
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,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
* *
* $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) ...@@ -122,8 +122,8 @@ write_password_file(Relation rel)
"%s\n", "%s\n",
nameout(DatumGetName(datum_n)), nameout(DatumGetName(datum_n)),
null_p ? "" : textout((text *) datum_p), null_p ? "" : textout((text *) datum_p),
null_v ? "\\N" : nabstimeout((AbsoluteTime) datum_v) /* this is how the null_v ? "\\N" :
* parser wants it */ DatumGetCString(DirectFunctionCall1(nabstimeout, datum_v))
); );
} }
heap_endscan(scan); heap_endscan(scan);
...@@ -268,7 +268,8 @@ CreateUser(CreateUserStmt *stmt) ...@@ -268,7 +268,8 @@ CreateUser(CreateUserStmt *stmt)
if (stmt->password) if (stmt->password)
new_record[Anum_pg_shadow_passwd - 1] = PointerGetDatum(textin(stmt->password)); new_record[Anum_pg_shadow_passwd - 1] = PointerGetDatum(textin(stmt->password));
if (stmt->validUntil) 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_usename - 1] = ' ';
new_record_nulls[Anum_pg_shadow_usesysid - 1] = ' '; new_record_nulls[Anum_pg_shadow_usesysid - 1] = ' ';
...@@ -445,7 +446,8 @@ AlterUser(AlterUserStmt *stmt) ...@@ -445,7 +446,8 @@ AlterUser(AlterUserStmt *stmt)
/* valid until */ /* valid until */
if (stmt->validUntil) 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] = ' '; new_record_nulls[Anum_pg_shadow_valuntil - 1] = ' ';
} }
else else
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* This should be moved to a more appropriate place. It is here * This should be moved to a more appropriate place. It is here
...@@ -49,6 +49,11 @@ ...@@ -49,6 +49,11 @@
#define BUFSIZE 1024 #define BUFSIZE 1024
#define FNAME_BUFSIZE 8192 #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 LargeObjectDesc *cookies[MAX_LOBJ_FDS];
static GlobalMemory fscxt = NULL; static GlobalMemory fscxt = NULL;
...@@ -61,15 +66,17 @@ static void deleteLOfd(int fd); ...@@ -61,15 +66,17 @@ static void deleteLOfd(int fd);
* File Interfaces for Large Objects * File Interfaces for Large Objects
*****************************************************************************/ *****************************************************************************/
int Datum
lo_open(Oid lobjId, int mode) lo_open(PG_FUNCTION_ARGS)
{ {
Oid lobjId = PG_GETARG_OID(0);
int32 mode = PG_GETARG_INT32(1);
LargeObjectDesc *lobjDesc; LargeObjectDesc *lobjDesc;
int fd; int fd;
MemoryContext currentContext; MemoryContext currentContext;
#if FSDB #if FSDB
elog(NOTICE, "LOopen(%u,%d)", lobjId, mode); elog(NOTICE, "lo_open(%u,%d)", lobjId, mode);
#endif #endif
if (fscxt == NULL) if (fscxt == NULL)
...@@ -84,7 +91,7 @@ lo_open(Oid lobjId, int mode) ...@@ -84,7 +91,7 @@ lo_open(Oid lobjId, int mode)
#if FSDB #if FSDB
elog(NOTICE, "cannot open large object %u", lobjId); elog(NOTICE, "cannot open large object %u", lobjId);
#endif #endif
return -1; PG_RETURN_INT32(-1);
} }
fd = newLOfd(lobjDesc); fd = newLOfd(lobjDesc);
...@@ -97,26 +104,27 @@ lo_open(Oid lobjId, int mode) ...@@ -97,26 +104,27 @@ lo_open(Oid lobjId, int mode)
elog(NOTICE, "Out of space for large object FDs"); elog(NOTICE, "Out of space for large object FDs");
#endif #endif
return fd; PG_RETURN_INT32(fd);
} }
int Datum
lo_close(int fd) lo_close(PG_FUNCTION_ARGS)
{ {
int32 fd = PG_GETARG_INT32(0);
MemoryContext currentContext; MemoryContext currentContext;
if (fd < 0 || fd >= MAX_LOBJ_FDS) if (fd < 0 || fd >= MAX_LOBJ_FDS)
{ {
elog(ERROR, "lo_close: large obj descriptor (%d) out of range", fd); elog(ERROR, "lo_close: large obj descriptor (%d) out of range", fd);
return -2; PG_RETURN_INT32(-2);
} }
if (cookies[fd] == NULL) if (cookies[fd] == NULL)
{ {
elog(ERROR, "lo_close: invalid large obj descriptor (%d)", fd); elog(ERROR, "lo_close: invalid large obj descriptor (%d)", fd);
return -3; PG_RETURN_INT32(-3);
} }
#if FSDB #if FSDB
elog(NOTICE, "LOclose(%d)", fd); elog(NOTICE, "lo_close(%d)", fd);
#endif #endif
Assert(fscxt != NULL); Assert(fscxt != NULL);
...@@ -127,13 +135,19 @@ lo_close(int fd) ...@@ -127,13 +135,19 @@ lo_close(int fd)
MemoryContextSwitchTo(currentContext); MemoryContextSwitchTo(currentContext);
deleteLOfd(fd); 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 * We assume the large object supports byte oriented reads and seeks so
* that our work is easier. * that our work is easier.
*/ *
*****************************************************************************/
int int
lo_read(int fd, char *buf, int len) lo_read(int fd, char *buf, int len)
{ {
...@@ -157,7 +171,8 @@ 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); status = inv_read(cookies[fd], buf, len);
MemoryContextSwitchTo(currentContext); MemoryContextSwitchTo(currentContext);
return (status);
return status;
} }
int int
...@@ -183,25 +198,29 @@ lo_write(int fd, char *buf, int len) ...@@ -183,25 +198,29 @@ lo_write(int fd, char *buf, int len)
status = inv_write(cookies[fd], buf, len); status = inv_write(cookies[fd], buf, len);
MemoryContextSwitchTo(currentContext); MemoryContextSwitchTo(currentContext);
return (status);
return status;
} }
int Datum
lo_lseek(int fd, int offset, int whence) 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; MemoryContext currentContext;
int status; int status;
if (fd < 0 || fd >= MAX_LOBJ_FDS) if (fd < 0 || fd >= MAX_LOBJ_FDS)
{ {
elog(ERROR, "lo_lseek: large obj descriptor (%d) out of range", fd); elog(ERROR, "lo_lseek: large obj descriptor (%d) out of range", fd);
return -2; PG_RETURN_INT32(-2);
} }
if (cookies[fd] == NULL) if (cookies[fd] == NULL)
{ {
elog(ERROR, "lo_lseek: invalid large obj descriptor (%d)", fd); elog(ERROR, "lo_lseek: invalid large obj descriptor (%d)", fd);
return -3; PG_RETURN_INT32(-3);
} }
Assert(fscxt != NULL); Assert(fscxt != NULL);
...@@ -211,12 +230,13 @@ lo_lseek(int fd, int offset, int whence) ...@@ -211,12 +230,13 @@ lo_lseek(int fd, int offset, int whence)
MemoryContextSwitchTo(currentContext); MemoryContextSwitchTo(currentContext);
return status; PG_RETURN_INT32(status);
} }
Oid Datum
lo_creat(int mode) lo_creat(PG_FUNCTION_ARGS)
{ {
int32 mode = PG_GETARG_INT32(0);
LargeObjectDesc *lobjDesc; LargeObjectDesc *lobjDesc;
MemoryContext currentContext; MemoryContext currentContext;
Oid lobjId; Oid lobjId;
...@@ -231,31 +251,32 @@ lo_creat(int mode) ...@@ -231,31 +251,32 @@ lo_creat(int mode)
if (lobjDesc == NULL) if (lobjDesc == NULL)
{ {
MemoryContextSwitchTo(currentContext); MemoryContextSwitchTo(currentContext);
return InvalidOid; PG_RETURN_OID(InvalidOid);
} }
lobjId = RelationGetRelid(lobjDesc->heap_r); lobjId = RelationGetRelid(lobjDesc->heap_r);
inv_close(lobjDesc); inv_close(lobjDesc);
/* switch context back to original memory context */
MemoryContextSwitchTo(currentContext); MemoryContextSwitchTo(currentContext);
return lobjId; PG_RETURN_OID(lobjId);
} }
int Datum
lo_tell(int fd) lo_tell(PG_FUNCTION_ARGS)
{ {
int32 fd = PG_GETARG_INT32(0);
if (fd < 0 || fd >= MAX_LOBJ_FDS) if (fd < 0 || fd >= MAX_LOBJ_FDS)
{ {
elog(ERROR, "lo_tell: large object descriptor (%d) out of range", fd); elog(ERROR, "lo_tell: large object descriptor (%d) out of range", fd);
return -2; PG_RETURN_INT32(-2);
} }
if (cookies[fd] == NULL) if (cookies[fd] == NULL)
{ {
elog(ERROR, "lo_tell: invalid large object descriptor (%d)", fd); elog(ERROR, "lo_tell: invalid large object descriptor (%d)", fd);
return -3; PG_RETURN_INT32(-3);
} }
/* /*
...@@ -263,12 +284,13 @@ lo_tell(int fd) ...@@ -263,12 +284,13 @@ lo_tell(int fd)
* true for now, but is probably more than this module ought to * true for now, but is probably more than this module ought to
* assume... * assume...
*/ */
return inv_tell(cookies[fd]); PG_RETURN_INT32(inv_tell(cookies[fd]));
} }
int Datum
lo_unlink(Oid lobjId) lo_unlink(PG_FUNCTION_ARGS)
{ {
Oid lobjId = PG_GETARG_OID(0);
/* /*
* inv_drop does not need a context switch, indeed it doesn't touch * inv_drop does not need a context switch, indeed it doesn't touch
...@@ -278,35 +300,42 @@ lo_unlink(Oid lobjId) ...@@ -278,35 +300,42 @@ lo_unlink(Oid lobjId)
* XXX there ought to be some code to clean up any open LOs that * XXX there ought to be some code to clean up any open LOs that
* reference the specified relation... as is, they remain "open". * 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 * Datum
loread(int fd, int len) loread(PG_FUNCTION_ARGS)
{ {
int32 fd = PG_GETARG_INT32(0);
int32 len = PG_GETARG_INT32(1);
struct varlena *retval; struct varlena *retval;
int totalread = 0; int totalread;
if (len < 0)
len = 0;
retval = (struct varlena *) palloc(VARHDRSZ + len); retval = (struct varlena *) palloc(VARHDRSZ + len);
totalread = lo_read(fd, VARDATA(retval), len); totalread = lo_read(fd, VARDATA(retval), len);
VARSIZE(retval) = totalread + VARHDRSZ; VARSIZE(retval) = totalread + VARHDRSZ;
return retval; PG_RETURN_POINTER(retval);
} }
int Datum
lowrite(int fd, struct varlena * wbuf) lowrite(PG_FUNCTION_ARGS)
{ {
int totalwritten; int32 fd = PG_GETARG_INT32(0);
struct varlena *wbuf = PG_GETARG_VARLENA_P(1);
int bytestowrite; int bytestowrite;
int totalwritten;
bytestowrite = VARSIZE(wbuf) - VARHDRSZ; bytestowrite = VARSIZE(wbuf) - VARHDRSZ;
totalwritten = lo_write(fd, VARDATA(wbuf), bytestowrite); totalwritten = lo_write(fd, VARDATA(wbuf), bytestowrite);
return totalwritten; PG_RETURN_INT32(totalwritten);
} }
/***************************************************************************** /*****************************************************************************
...@@ -317,9 +346,10 @@ lowrite(int fd, struct varlena * wbuf) ...@@ -317,9 +346,10 @@ lowrite(int fd, struct varlena * wbuf)
* lo_import - * lo_import -
* imports a file as an (inversion) large object. * imports a file as an (inversion) large object.
*/ */
Oid Datum
lo_import(text *filename) lo_import(PG_FUNCTION_ARGS)
{ {
text *filename = PG_GETARG_TEXT_P(0);
File fd; File fd;
int nbytes, int nbytes,
tmp; tmp;
...@@ -379,16 +409,18 @@ lo_import(text *filename) ...@@ -379,16 +409,18 @@ lo_import(text *filename)
FileClose(fd); FileClose(fd);
inv_close(lobj); inv_close(lobj);
return lobjOid; PG_RETURN_OID(lobjOid);
} }
/* /*
* lo_export - * lo_export -
* exports an (inversion) large object. * exports an (inversion) large object.
*/ */
int4 Datum
lo_export(Oid lobjId, text *filename) lo_export(PG_FUNCTION_ARGS)
{ {
Oid lobjId = PG_GETARG_OID(0);
text *filename = PG_GETARG_TEXT_P(1);
File fd; File fd;
int nbytes, int nbytes,
tmp; tmp;
...@@ -445,7 +477,7 @@ lo_export(Oid lobjId, text *filename) ...@@ -445,7 +477,7 @@ lo_export(Oid lobjId, text *filename)
inv_close(lobj); inv_close(lobj);
FileClose(fd); FileClose(fd);
return 1; PG_RETURN_INT32(1);
} }
/* /*
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* Dec 17, 1997 - Todd A. Brandys * Dec 17, 1997 - Todd A. Brandys
* Orignal Version Completed. * 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) ...@@ -288,7 +288,8 @@ crypt_verify(Port *port, const char *user, const char *pgpass)
if (!valuntil || strcmp(valuntil, "\\N") == 0) if (!valuntil || strcmp(valuntil, "\\N") == 0)
vuntil = INVALID_ABSTIME; vuntil = INVALID_ABSTIME;
else else
vuntil = nabstimein(valuntil); vuntil = DatumGetAbsoluteTime(DirectFunctionCall1(nabstimein,
CStringGetDatum(valuntil)));
current = GetCurrentAbsoluteTime(); current = GetCurrentAbsoluteTime();
if (vuntil != INVALID_ABSTIME && vuntil < current) if (vuntil != INVALID_ABSTIME && vuntil < current)
retval = STATUS_ERROR; retval = STATUS_ERROR;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -538,8 +538,11 @@ _ReadLOArray(char *str,
if (inputfile == NULL) if (inputfile == NULL)
elog(ERROR, "array_in: missing file name"); elog(ERROR, "array_in: missing file name");
lobjId = lo_creat(0); lobjId = DatumGetObjectId(DirectFunctionCall1(lo_creat,
*fd = lo_open(lobjId, INV_READ); Int32GetDatum(0)));
*fd = DatumGetInt32(DirectFunctionCall2(lo_open,
ObjectIdGetDatum(lobjId),
Int32GetDatum(INV_READ)));
if (*fd < 0) if (*fd < 0)
elog(ERROR, "Large object create failed"); elog(ERROR, "Large object create failed");
retStr = inputfile; retStr = inputfile;
...@@ -877,17 +880,23 @@ array_ref(ArrayType *array, ...@@ -877,17 +880,23 @@ array_ref(ArrayType *array,
v = _ReadChunkArray1El(indx, elmlen, fd, array, isNull); v = _ReadChunkArray1El(indx, elmlen, fd, array, isNull);
else else
{ {
if (lo_lseek(fd, offset, SEEK_SET) < 0) if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
Int32GetDatum(fd),
Int32GetDatum(offset),
Int32GetDatum(SEEK_SET))) < 0)
RETURN_NULL; RETURN_NULL;
#ifdef LOARRAY #ifdef LOARRAY
v = (struct varlena *) LOread(fd, elmlen); v = (struct varlena *)
DatumGetPointer(DirectFunctionCall2(loread,
Int32GetDatum(fd),
Int32GetDatum(elmlen)));
#endif #endif
} }
if (*isNull) if (*isNull)
RETURN_NULL; RETURN_NULL;
if (VARSIZE(v) - VARHDRSZ < elmlen) if (VARSIZE(v) - VARHDRSZ < elmlen)
RETURN_NULL; RETURN_NULL;
lo_close(fd); DirectFunctionCall1(lo_close, Int32GetDatum(fd));
retval = (char *) _ArrayCast((char *) VARDATA(v), reftype, elmlen); retval = (char *) _ArrayCast((char *) VARDATA(v), reftype, elmlen);
if (reftype == 0) if (reftype == 0)
{ /* not by value */ { /* not by value */
...@@ -1029,7 +1038,9 @@ array_clip(ArrayType *array, ...@@ -1029,7 +1038,9 @@ array_clip(ArrayType *array,
memmove(buff, &rsize, VARHDRSZ); memmove(buff, &rsize, VARHDRSZ);
#ifdef LOARRAY #ifdef LOARRAY
if (!*isNull) if (!*isNull)
bytes = LOwrite(newfd, (struct varlena *) buff); bytes = DatumGetInt32(DirectFunctionCall2(lowrite,
Int32GetDatum(newfd),
PointerGetDatum(buff)));
#endif #endif
pfree(buff); pfree(buff);
} }
...@@ -1140,20 +1151,25 @@ array_set(ArrayType *array, ...@@ -1140,20 +1151,25 @@ array_set(ArrayType *array,
if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_WRITE : O_WRONLY)) < 0) if ((fd = LOopen(lo_name, ARR_IS_INV(array) ? INV_WRITE : O_WRONLY)) < 0)
return (char *) array; return (char *) array;
#endif #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; return (char *) array;
v = (struct varlena *) palloc(elmlen + VARHDRSZ); v = (struct varlena *) palloc(elmlen + VARHDRSZ);
VARSIZE(v) = elmlen + VARHDRSZ; VARSIZE(v) = elmlen + VARHDRSZ;
ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, VARDATA(v)); ArrayCastAndSet(dataPtr, (bool) reftype, elmlen, VARDATA(v));
#ifdef LOARRAY #ifdef LOARRAY
n = LOwrite(fd, v); n = DatumGetInt32(DirectFunctionCall2(lowrite,
Int32GetDatum(fd),
PointerGetDatum(v)));
#endif #endif
/* /*
* if (n < VARSIZE(v) - VARHDRSZ) RETURN_NULL; * if (n < VARSIZE(v) - VARHDRSZ) RETURN_NULL;
*/ */
pfree(v); pfree(v);
lo_close(fd); DirectFunctionCall1(lo_close, Int32GetDatum(fd));
return (char *) array; return (char *) array;
} }
if (elmlen > 0) if (elmlen > 0)
...@@ -1270,14 +1286,14 @@ array_assgn(ArrayType *array, ...@@ -1270,14 +1286,14 @@ array_assgn(ArrayType *array,
return (char *) array; return (char *) array;
#endif #endif
_LOArrayRange(lowerIndx, upperIndx, len, fd, newfd, array, 1, isNull); _LOArrayRange(lowerIndx, upperIndx, len, fd, newfd, array, 1, isNull);
lo_close(newfd); DirectFunctionCall1(lo_close, Int32GetDatum(newfd));
} }
else else
{ {
_LOArrayRange(lowerIndx, upperIndx, len, fd, (int) ARR_DATA_PTR(newArr), _LOArrayRange(lowerIndx, upperIndx, len, fd, (int) ARR_DATA_PTR(newArr),
array, 0, isNull); array, 0, isNull);
} }
lo_close(fd); DirectFunctionCall1(lo_close, Int32GetDatum(fd));
return (char *) array; return (char *) array;
} }
_ArrayRange(lowerIndx, upperIndx, len, ARR_DATA_PTR(newArr), array, 0); _ArrayRange(lowerIndx, upperIndx, len, ARR_DATA_PTR(newArr), array, 0);
...@@ -1758,7 +1774,10 @@ _LOArrayRange(int *st, ...@@ -1758,7 +1774,10 @@ _LOArrayRange(int *st,
mda_get_prod(n, dim, prod); mda_get_prod(n, dim, prod);
st_pos = tuple2linear(n, st, prod); st_pos = tuple2linear(n, st, prod);
offset = st_pos * bsize; 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; return;
mda_get_range(n, span, st, endp); mda_get_range(n, span, st, endp);
mda_get_offset_values(n, dist, prod, span); mda_get_offset_values(n, dist, prod, span);
...@@ -1770,7 +1789,10 @@ _LOArrayRange(int *st, ...@@ -1770,7 +1789,10 @@ _LOArrayRange(int *st,
do do
{ {
offset += (dist[j] * bsize); 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; return;
tmp = _LOtransfer((char **) &srcfd, inc, 1, (char **) &destfd, isSrcLO, 1); tmp = _LOtransfer((char **) &srcfd, inc, 1, (char **) &destfd, isSrcLO, 1);
if (tmp < inc) if (tmp < inc)
...@@ -1812,7 +1834,10 @@ _ReadArray(int *st, ...@@ -1812,7 +1834,10 @@ _ReadArray(int *st,
mda_get_prod(n, dim, prod); mda_get_prod(n, dim, prod);
st_pos = tuple2linear(n, st, prod); st_pos = tuple2linear(n, st, prod);
offset = st_pos * bsize; 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; return;
mda_get_range(n, span, st, endp); mda_get_range(n, span, st, endp);
mda_get_offset_values(n, dist, prod, span); mda_get_offset_values(n, dist, prod, span);
...@@ -1824,7 +1849,10 @@ _ReadArray(int *st, ...@@ -1824,7 +1849,10 @@ _ReadArray(int *st,
do do
{ {
offset += (dist[j] * bsize); 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; return;
tmp = _LOtransfer((char **) &destfd, inc, 1, (char **) &srcfd, 1, isDestLO); tmp = _LOtransfer((char **) &destfd, inc, 1, (char **) &srcfd, 1, isDestLO);
if (tmp < inc) if (tmp < inc)
...@@ -1857,13 +1885,18 @@ _LOtransfer(char **destfd, ...@@ -1857,13 +1885,18 @@ _LOtransfer(char **destfd,
resid > 0 && (inc = min(resid, MAX_READ)) > 0; resid -= inc) resid > 0 && (inc = min(resid, MAX_READ)) > 0; resid -= inc)
{ {
#ifdef LOARRAY #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) if (VARSIZE(v) - VARHDRSZ < inc)
{ {
pfree(v); pfree(v);
return -1; return -1;
} }
tmp += LOwrite((int) *destfd, v); tmp += DatumGetInt32(DirectFunctionCall2(lowrite,
Int32GetDatum((int32) *destfd),
PointerGetDatum(v)));
#endif #endif
pfree(v); pfree(v);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -385,7 +385,9 @@ write_chunk(struct varlena * a_chunk, int ofile)
int got_n = 0; int got_n = 0;
#ifdef LOARRAY #ifdef LOARRAY
got_n = LOwrite(ofile, a_chunk); got_n = DatumGetInt32(DirectFunctionCall2(lowrite,
Int32GetDatum(ofile),
PointerGetDatum(a_chunk)));
#endif #endif
return got_n; return got_n;
} }
...@@ -400,13 +402,19 @@ write_chunk(struct varlena * a_chunk, int ofile) ...@@ -400,13 +402,19 @@ write_chunk(struct varlena * a_chunk, int ofile)
static int static int
seek_and_read(int pos, int size, char *buff, int fp, int from) seek_and_read(int pos, int size, char *buff, int fp, int from)
{ {
struct varlena *v = NULL; struct varlena *v;
/* Assuming only one file */ /* 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"); elog(ERROR, "File seek error");
#ifdef LOARRAY #ifdef LOARRAY
v = (struct varlena *) LOread(fp, size); v = (struct varlena *)
DatumGetPointer(DirectFunctionCall2(loread,
Int32GetDatum(fp),
Int32GetDatum(size)));
#endif #endif
if (VARSIZE(v) - VARHDRSZ < size) if (VARSIZE(v) - VARHDRSZ < size)
elog(ERROR, "File read error"); elog(ERROR, "File read error");
...@@ -505,7 +513,10 @@ _ReadChunkArray(int *st, ...@@ -505,7 +513,10 @@ _ReadChunkArray(int *st,
for (i = j = 0; i < n; i++) for (i = j = 0; i < n; i++)
j += chunk_st[i] * PC[i]; j += chunk_st[i] * PC[i];
temp_seek = srcOff = j * csize * bsize; 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; RETURN_NULL;
jj = n - 1; jj = n - 1;
...@@ -526,7 +537,10 @@ _ReadChunkArray(int *st, ...@@ -526,7 +537,10 @@ _ReadChunkArray(int *st,
bptr *= bsize; bptr *= bsize;
if (isDestLO) 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; RETURN_NULL;
} }
else else
...@@ -538,7 +552,10 @@ _ReadChunkArray(int *st, ...@@ -538,7 +552,10 @@ _ReadChunkArray(int *st,
{ {
temp = (dist[jj] * csize + block_seek + temp_seek) * bsize; temp = (dist[jj] * csize + block_seek + temp_seek) * bsize;
srcOff += temp; 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; RETURN_NULL;
} }
for (i = n - 1, to_read = bsize; i >= 0; for (i = n - 1, to_read = bsize; i >= 0;
...@@ -550,14 +567,20 @@ _ReadChunkArray(int *st, ...@@ -550,14 +567,20 @@ _ReadChunkArray(int *st,
if (cdist[j]) if (cdist[j])
{ {
srcOff += (cdist[j] * bsize); 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; RETURN_NULL;
} }
block_seek += cdist[j]; block_seek += cdist[j];
bptr += adist[j] * bsize; bptr += adist[j] * bsize;
if (isDestLO) 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; RETURN_NULL;
} }
else else
...@@ -675,10 +698,16 @@ _ReadChunkArray1El(int *st, ...@@ -675,10 +698,16 @@ _ReadChunkArray1El(int *st,
srcOff += (st[i] - chunk_st[i] * C[i]) * PCHUNK[i]; srcOff += (st[i] - chunk_st[i] * C[i]) * PCHUNK[i];
srcOff *= bsize; 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; RETURN_NULL;
#ifdef LOARRAY #ifdef LOARRAY
return (struct varlena *) LOread(fp, bsize); return (struct varlena *)
DatumGetPointer(DirectFunctionCall2(loread,
Int32GetDatum(fp),
Int32GetDatum(bsize)));
#endif #endif
return (struct varlena *) 0; return (struct varlena *) 0;
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.44 2000/04/12 17:15:48 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.45 2000/06/09 01:11:08 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -33,9 +33,10 @@ static int ...@@ -33,9 +33,10 @@ static int
/* date_in() /* date_in()
* Given date text string, convert to internal date format. * Given date text string, convert to internal date format.
*/ */
DateADT Datum
date_in(char *str) date_in(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0);
DateADT date; DateADT date;
double fsec; double fsec;
struct tm tt, struct tm tt,
...@@ -47,9 +48,6 @@ date_in(char *str) ...@@ -47,9 +48,6 @@ date_in(char *str)
int ftype[MAXDATEFIELDS]; int ftype[MAXDATEFIELDS];
char lowstr[MAXDATELEN + 1]; char lowstr[MAXDATELEN + 1];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) date external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0) if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tzp) != 0)) || (DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tzp) != 0))
elog(ERROR, "Bad date external representation '%s'", str); elog(ERROR, "Bad date external representation '%s'", str);
...@@ -75,15 +73,16 @@ date_in(char *str) ...@@ -75,15 +73,16 @@ date_in(char *str)
date = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - date2j(2000, 1, 1)); date = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - date2j(2000, 1, 1));
return date; PG_RETURN_DATEADT(date);
} /* date_in() */ }
/* date_out() /* date_out()
* Given internal format date, convert to text string. * Given internal format date, convert to text string.
*/ */
char * Datum
date_out(DateADT date) date_out(PG_FUNCTION_ARGS)
{ {
DateADT date = PG_GETARG_DATEADT(0);
char *result; char *result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -94,128 +93,160 @@ date_out(DateADT date) ...@@ -94,128 +93,160 @@ date_out(DateADT date)
EncodeDateOnly(tm, DateStyle, buf); EncodeDateOnly(tm, DateStyle, buf);
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
PG_RETURN_CSTRING(result);
}
strcpy(result, buf); Datum
date_eq(PG_FUNCTION_ARGS)
{
DateADT dateVal1 = PG_GETARG_DATEADT(0);
DateADT dateVal2 = PG_GETARG_DATEADT(1);
return result; PG_RETURN_BOOL(dateVal1 == dateVal2);
} /* date_out() */ }
bool Datum
date_eq(DateADT dateVal1, DateADT dateVal2) date_ne(PG_FUNCTION_ARGS)
{ {
return dateVal1 == dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
DateADT dateVal2 = PG_GETARG_DATEADT(1);
PG_RETURN_BOOL(dateVal1 != dateVal2);
} }
bool Datum
date_ne(DateADT dateVal1, DateADT dateVal2) date_lt(PG_FUNCTION_ARGS)
{ {
return dateVal1 != dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
DateADT dateVal2 = PG_GETARG_DATEADT(1);
PG_RETURN_BOOL(dateVal1 < dateVal2);
} }
bool Datum
date_lt(DateADT dateVal1, DateADT dateVal2) date_le(PG_FUNCTION_ARGS)
{ {
return dateVal1 < dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
} /* date_lt() */ DateADT dateVal2 = PG_GETARG_DATEADT(1);
bool PG_RETURN_BOOL(dateVal1 <= dateVal2);
date_le(DateADT dateVal1, DateADT dateVal2) }
{
return dateVal1 <= dateVal2;
} /* date_le() */
bool Datum
date_gt(DateADT dateVal1, DateADT dateVal2) date_gt(PG_FUNCTION_ARGS)
{ {
return dateVal1 > dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
} /* date_gt() */ DateADT dateVal2 = PG_GETARG_DATEADT(1);
PG_RETURN_BOOL(dateVal1 > dateVal2);
}
bool Datum
date_ge(DateADT dateVal1, DateADT dateVal2) date_ge(PG_FUNCTION_ARGS)
{ {
return dateVal1 >= dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
} /* date_ge() */ DateADT dateVal2 = PG_GETARG_DATEADT(1);
PG_RETURN_BOOL(dateVal1 >= dateVal2);
}
int Datum
date_cmp(DateADT dateVal1, DateADT dateVal2) date_cmp(PG_FUNCTION_ARGS)
{ {
DateADT dateVal1 = PG_GETARG_DATEADT(0);
DateADT dateVal2 = PG_GETARG_DATEADT(1);
if (dateVal1 < dateVal2) if (dateVal1 < dateVal2)
return -1; PG_RETURN_INT32(-1);
else if (dateVal1 > dateVal2) else if (dateVal1 > dateVal2)
return 1; PG_RETURN_INT32(1);
return 0; PG_RETURN_INT32(0);
} /* date_cmp() */ }
DateADT Datum
date_larger(DateADT dateVal1, DateADT dateVal2) date_larger(PG_FUNCTION_ARGS)
{ {
return date_gt(dateVal1, dateVal2) ? dateVal1 : dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
} /* date_larger() */ DateADT dateVal2 = PG_GETARG_DATEADT(1);
DateADT PG_RETURN_DATEADT((dateVal1 > dateVal2) ? dateVal1 : dateVal2);
date_smaller(DateADT dateVal1, DateADT dateVal2) }
Datum
date_smaller(PG_FUNCTION_ARGS)
{ {
return date_lt(dateVal1, dateVal2) ? dateVal1 : dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
} /* date_smaller() */ DateADT dateVal2 = PG_GETARG_DATEADT(1);
PG_RETURN_DATEADT((dateVal1 < dateVal2) ? dateVal1 : dateVal2);
}
/* Compute difference between two dates in days. /* Compute difference between two dates in days.
*/ */
int4 Datum
date_mi(DateADT dateVal1, DateADT dateVal2) date_mi(PG_FUNCTION_ARGS)
{ {
return dateVal1 - dateVal2; DateADT dateVal1 = PG_GETARG_DATEADT(0);
} /* date_mi() */ DateADT dateVal2 = PG_GETARG_DATEADT(1);
PG_RETURN_INT32((int32) (dateVal1 - dateVal2));
}
/* Add a number of days to a date, giving a new date. /* Add a number of days to a date, giving a new date.
* Must handle both positive and negative numbers of days. * Must handle both positive and negative numbers of days.
*/ */
DateADT Datum
date_pli(DateADT dateVal, int4 days) date_pli(PG_FUNCTION_ARGS)
{ {
return dateVal + days; DateADT dateVal = PG_GETARG_DATEADT(0);
} /* date_pli() */ int32 days = PG_GETARG_INT32(1);
PG_RETURN_DATEADT(dateVal + days);
}
/* Subtract a number of days from a date, giving a new date. /* Subtract a number of days from a date, giving a new date.
*/ */
DateADT Datum
date_mii(DateADT dateVal, int4 days) date_mii(PG_FUNCTION_ARGS)
{ {
return date_pli(dateVal, -days); DateADT dateVal = PG_GETARG_DATEADT(0);
} /* date_mii() */ int32 days = PG_GETARG_INT32(1);
PG_RETURN_DATEADT(dateVal - days);
}
/* date_timestamp() /* date_timestamp()
* Convert date to timestamp data type. * Convert date to timestamp data type.
*/ */
Timestamp * Datum
date_timestamp(DateADT dateVal) date_timestamp(PG_FUNCTION_ARGS)
{ {
Timestamp *result; DateADT dateVal = PG_GETARG_DATEADT(0);
Timestamp result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
int tz; int tz;
double fsec = 0; double fsec = 0;
char *tzn; char *tzn;
result = palloc(sizeof(*result));
if (date2tm(dateVal, &tz, tm, &fsec, &tzn) != 0) if (date2tm(dateVal, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert date to timestamp"); elog(ERROR, "Unable to convert date to timestamp");
if (tm2timestamp(tm, fsec, &tz, result) != 0) if (tm2timestamp(tm, fsec, &tz, &result) != 0)
elog(ERROR, "Timestamp out of range"); elog(ERROR, "Timestamp out of range");
return result; PG_RETURN_TIMESTAMP(result);
} /* date_timestamp() */ }
/* timestamp_date() /* timestamp_date()
* Convert timestamp to date data type. * Convert timestamp to date data type.
*/ */
DateADT Datum
timestamp_date(Timestamp *timestamp) timestamp_date(PG_FUNCTION_ARGS)
{ {
Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
DateADT result; DateADT result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -223,40 +254,36 @@ timestamp_date(Timestamp *timestamp) ...@@ -223,40 +254,36 @@ timestamp_date(Timestamp *timestamp)
double fsec; double fsec;
char *tzn; char *tzn;
if (!PointerIsValid(timestamp)) if (TIMESTAMP_NOT_FINITE(timestamp))
elog(ERROR, "Unable to convert null timestamp to date");
if (TIMESTAMP_NOT_FINITE(*timestamp))
elog(ERROR, "Unable to convert timestamp to date"); elog(ERROR, "Unable to convert timestamp to date");
if (TIMESTAMP_IS_EPOCH(*timestamp)) if (TIMESTAMP_IS_EPOCH(timestamp))
{ {
timestamp2tm(SetTimestamp(*timestamp), NULL, tm, &fsec, NULL); timestamp2tm(SetTimestamp(timestamp), NULL, tm, &fsec, NULL);
} }
else if (TIMESTAMP_IS_CURRENT(*timestamp)) else if (TIMESTAMP_IS_CURRENT(timestamp))
{ {
timestamp2tm(SetTimestamp(*timestamp), &tz, tm, &fsec, &tzn); timestamp2tm(SetTimestamp(timestamp), &tz, tm, &fsec, &tzn);
} }
else else
{ {
if (timestamp2tm(*timestamp, &tz, tm, &fsec, &tzn) != 0) if (timestamp2tm(timestamp, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert timestamp to date"); elog(ERROR, "Unable to convert timestamp to date");
} }
result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - date2j(2000, 1, 1)); result = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - date2j(2000, 1, 1);
return result; PG_RETURN_DATEADT(result);
} /* timestamp_date() */ }
/* abstime_date() /* abstime_date()
* Convert abstime to date data type. * Convert abstime to date data type.
*/ */
DateADT Datum
abstime_date(AbsoluteTime abstime) abstime_date(PG_FUNCTION_ARGS)
{ {
AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
DateADT result; DateADT result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -289,8 +316,8 @@ abstime_date(AbsoluteTime abstime) ...@@ -289,8 +316,8 @@ abstime_date(AbsoluteTime abstime)
break; break;
} }
return result; PG_RETURN_DATEADT(result);
} /* abstime_date() */ }
/* date2tm() /* date2tm()
...@@ -372,243 +399,237 @@ date2tm(DateADT dateVal, int *tzp, struct tm * tm, double *fsec, char **tzn) ...@@ -372,243 +399,237 @@ date2tm(DateADT dateVal, int *tzp, struct tm * tm, double *fsec, char **tzn)
* Time ADT * Time ADT
*****************************************************************************/ *****************************************************************************/
Datum
TimeADT * time_in(PG_FUNCTION_ARGS)
time_in(char *str)
{ {
TimeADT *time; char *str = PG_GETARG_CSTRING(0);
TimeADT time;
double fsec; double fsec;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
int nf; int nf;
char lowstr[MAXDATELEN + 1]; char lowstr[MAXDATELEN + 1];
char *field[MAXDATEFIELDS]; char *field[MAXDATEFIELDS];
int dtype; int dtype;
int ftype[MAXDATEFIELDS]; int ftype[MAXDATEFIELDS];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) time external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0) if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, NULL) != 0)) || (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, NULL) != 0))
elog(ERROR, "Bad time external representation '%s'", str); elog(ERROR, "Bad time external representation '%s'", str);
time = palloc(sizeof(*time)); time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
*time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
return time;
} /* time_in() */
PG_RETURN_TIMEADT(time);
}
char * Datum
time_out(TimeADT *time) time_out(PG_FUNCTION_ARGS)
{ {
TimeADT time = PG_GETARG_TIMEADT(0);
char *result; char *result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
double fsec; double fsec;
char buf[MAXDATELEN + 1]; char buf[MAXDATELEN + 1];
if (!PointerIsValid(time)) tm->tm_hour = (time / (60 * 60));
return NULL; tm->tm_min = (((int) (time / 60)) % 60);
tm->tm_sec = (((int) time) % 60);
tm->tm_hour = (*time / (60 * 60));
tm->tm_min = (((int) (*time / 60)) % 60);
tm->tm_sec = (((int) *time) % 60);
fsec = 0; fsec = 0;
EncodeTimeOnly(tm, fsec, NULL, DateStyle, buf); EncodeTimeOnly(tm, fsec, NULL, DateStyle, buf);
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
PG_RETURN_CSTRING(result);
}
strcpy(result, buf);
return result; Datum
} /* time_out() */ time_eq(PG_FUNCTION_ARGS)
{
TimeADT time1 = PG_GETARG_TIMEADT(0);
TimeADT time2 = PG_GETARG_TIMEADT(1);
PG_RETURN_BOOL(time1 == time2);
}
bool Datum
time_eq(TimeADT *time1, TimeADT *time2) time_ne(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeADT time1 = PG_GETARG_TIMEADT(0);
return FALSE; TimeADT time2 = PG_GETARG_TIMEADT(1);
return *time1 == *time2; PG_RETURN_BOOL(time1 != time2);
} /* time_eq() */ }
bool Datum
time_ne(TimeADT *time1, TimeADT *time2) time_lt(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeADT time1 = PG_GETARG_TIMEADT(0);
return FALSE; TimeADT time2 = PG_GETARG_TIMEADT(1);
return *time1 != *time2; PG_RETURN_BOOL(time1 < time2);
} /* time_eq() */ }
bool Datum
time_lt(TimeADT *time1, TimeADT *time2) time_le(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeADT time1 = PG_GETARG_TIMEADT(0);
return FALSE; TimeADT time2 = PG_GETARG_TIMEADT(1);
return (*time1 < *time2); PG_RETURN_BOOL(time1 <= time2);
} /* time_lt() */ }
bool Datum
time_le(TimeADT *time1, TimeADT *time2) time_gt(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeADT time1 = PG_GETARG_TIMEADT(0);
return FALSE; TimeADT time2 = PG_GETARG_TIMEADT(1);
return (*time1 <= *time2); PG_RETURN_BOOL(time1 > time2);
} /* time_le() */ }
bool Datum
time_gt(TimeADT *time1, TimeADT *time2) time_ge(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeADT time1 = PG_GETARG_TIMEADT(0);
return FALSE; TimeADT time2 = PG_GETARG_TIMEADT(1);
return (*time1 > *time2); PG_RETURN_BOOL(time1 >= time2);
} /* time_gt() */ }
bool Datum
time_ge(TimeADT *time1, TimeADT *time2) time_cmp(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeADT time1 = PG_GETARG_TIMEADT(0);
return FALSE; TimeADT time2 = PG_GETARG_TIMEADT(1);
return (*time1 >= *time2); if (time1 < time2)
} /* time_ge() */ PG_RETURN_INT32(-1);
if (time1 > time2)
PG_RETURN_INT32(1);
PG_RETURN_INT32(0);
}
int Datum
time_cmp(TimeADT *time1, TimeADT *time2) time_larger(PG_FUNCTION_ARGS)
{ {
return (*time1 < *time2) ? -1 : (((*time1 > *time2) ? 1 : 0)); TimeADT time1 = PG_GETARG_TIMEADT(0);
} /* time_cmp() */ TimeADT time2 = PG_GETARG_TIMEADT(1);
TimeADT * PG_RETURN_TIMEADT((time1 > time2) ? time1 : time2);
time_larger(TimeADT *time1, TimeADT *time2) }
{
return time_gt(time1, time2) ? time1 : time2;
} /* time_larger() */
TimeADT * Datum
time_smaller(TimeADT *time1, TimeADT *time2) time_smaller(PG_FUNCTION_ARGS)
{ {
return time_lt(time1, time2) ? time1 : time2; TimeADT time1 = PG_GETARG_TIMEADT(0);
} /* time_smaller() */ TimeADT time2 = PG_GETARG_TIMEADT(1);
PG_RETURN_TIMEADT((time1 < time2) ? time1 : time2);
}
/* overlaps_time() /* overlaps_time()
* Implements the SQL92 OVERLAPS operator. * Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997 * Algorithm from Date and Darwen, 1997
*/ */
bool Datum
overlaps_time(TimeADT *ts1, TimeADT *te1, TimeADT *ts2, TimeADT *te2) overlaps_time(PG_FUNCTION_ARGS)
{ {
TimeADT ts1 = PG_GETARG_TIMEADT(0);
TimeADT te1 = PG_GETARG_TIMEADT(1);
TimeADT ts2 = PG_GETARG_TIMEADT(2);
TimeADT te2 = PG_GETARG_TIMEADT(3);
/* Make sure we have ordered pairs... */ /* Make sure we have ordered pairs... */
if (time_gt(ts1, te1)) if (ts1 > te1)
{ {
TimeADT *tt = ts1; TimeADT tt = ts1;
ts1 = te1; ts1 = te1;
te1 = tt; te1 = tt;
} }
if (time_gt(ts2, te2)) if (ts2 > te2)
{ {
TimeADT *tt = ts2; TimeADT tt = ts2;
ts2 = te2; ts2 = te2;
te2 = tt; te2 = tt;
} }
return ((time_gt(ts1, ts2) && (time_lt(ts1, te2) || time_lt(te1, te2))) PG_RETURN_BOOL((ts1 > ts2 && (ts1 < te2 || te1 < te2)) ||
|| (time_gt(ts2, ts1) && (time_lt(ts2, te1) || time_lt(te2, te1))) (ts1 < ts2 && (ts2 < te1 || te2 < te1)) ||
|| time_eq(ts1, ts2)); (ts1 == ts2));
} }
/* timestamp_time() /* timestamp_time()
* Convert timestamp to time data type. * Convert timestamp to time data type.
*/ */
TimeADT * Datum
timestamp_time(Timestamp *timestamp) timestamp_time(PG_FUNCTION_ARGS)
{ {
TimeADT *result; Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
TimeADT result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
int tz; int tz;
double fsec; double fsec;
char *tzn; char *tzn;
if (!PointerIsValid(timestamp)) if (TIMESTAMP_NOT_FINITE(timestamp))
elog(ERROR, "Unable to convert null timestamp to date");
if (TIMESTAMP_NOT_FINITE(*timestamp))
elog(ERROR, "Unable to convert timestamp to date"); elog(ERROR, "Unable to convert timestamp to date");
if (TIMESTAMP_IS_EPOCH(*timestamp)) if (TIMESTAMP_IS_EPOCH(timestamp))
timestamp2tm(SetTimestamp(*timestamp), NULL, tm, &fsec, NULL); timestamp2tm(SetTimestamp(timestamp), NULL, tm, &fsec, NULL);
else if (TIMESTAMP_IS_CURRENT(*timestamp)) else if (TIMESTAMP_IS_CURRENT(timestamp))
timestamp2tm(SetTimestamp(*timestamp), &tz, tm, &fsec, &tzn); timestamp2tm(SetTimestamp(timestamp), &tz, tm, &fsec, &tzn);
else else
{ {
if (timestamp2tm(*timestamp, &tz, tm, &fsec, &tzn) != 0) if (timestamp2tm(timestamp, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert timestamp to date"); elog(ERROR, "Unable to convert timestamp to date");
} }
result = palloc(sizeof(*result)); result = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
*result = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec); PG_RETURN_TIMEADT(result);
}
return result;
} /* timestamp_time() */
/* datetime_timestamp() /* datetime_timestamp()
* Convert date and time to timestamp data type. * Convert date and time to timestamp data type.
*/ */
Timestamp * Datum
datetime_timestamp(DateADT date, TimeADT *time) datetime_timestamp(PG_FUNCTION_ARGS)
{ {
Timestamp *result; DateADT date = PG_GETARG_DATEADT(0);
TimeADT time = PG_GETARG_TIMEADT(1);
Timestamp result;
if (!PointerIsValid(time)) result = DatumGetTimestamp(DirectFunctionCall1(date_timestamp,
{ DateADTGetDatum(date)));
result = palloc(sizeof(*result)); result += time;
TIMESTAMP_INVALID(*result);
}
else
{
result = date_timestamp(date);
*result += *time;
}
return result; PG_RETURN_TIMESTAMP(result);
} /* datetime_timestamp() */ }
/* time_interval() /* time_interval()
* Convert time to interval data type. * Convert time to interval data type.
*/ */
Interval * Datum
time_interval(TimeADT *time) time_interval(PG_FUNCTION_ARGS)
{ {
TimeADT time = PG_GETARG_TIMEADT(0);
Interval *result; Interval *result;
if (!PointerIsValid(time)) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(*result)); result->time = time;
result->time = *time;
result->month = 0; result->month = 0;
return result; PG_RETURN_INTERVAL_P(result);
} /* time_interval() */ }
/***************************************************************************** /*****************************************************************************
...@@ -616,52 +637,44 @@ time_interval(TimeADT *time) ...@@ -616,52 +637,44 @@ time_interval(TimeADT *time)
*****************************************************************************/ *****************************************************************************/
TimeTzADT * Datum
timetz_in(char *str) timetz_in(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0);
TimeTzADT *time; TimeTzADT *time;
double fsec; double fsec;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
int tz; int tz;
int nf; int nf;
char lowstr[MAXDATELEN + 1]; char lowstr[MAXDATELEN + 1];
char *field[MAXDATEFIELDS]; char *field[MAXDATEFIELDS];
int dtype; int dtype;
int ftype[MAXDATEFIELDS]; int ftype[MAXDATEFIELDS];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) time external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0) if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, &tz) != 0)) || (DecodeTimeOnly(field, ftype, nf, &dtype, tm, &fsec, &tz) != 0))
elog(ERROR, "Bad time external representation '%s'", str); elog(ERROR, "Bad time external representation '%s'", str);
time = palloc(sizeof(*time)); time = (TimeTzADT *) palloc(sizeof(TimeTzADT));
time->time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec); time->time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
time->zone = tz; time->zone = tz;
return time; PG_RETURN_TIMETZADT_P(time);
} /* timetz_in() */ }
char * Datum
timetz_out(TimeTzADT *time) timetz_out(PG_FUNCTION_ARGS)
{ {
TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
char *result; char *result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
double fsec; double fsec;
int tz; int tz;
char buf[MAXDATELEN + 1]; char buf[MAXDATELEN + 1];
if (!PointerIsValid(time))
return NULL;
tm->tm_hour = (time->time / (60 * 60)); tm->tm_hour = (time->time / (60 * 60));
tm->tm_min = (((int) (time->time / 60)) % 60); tm->tm_min = (((int) (time->time / 60)) % 60);
tm->tm_sec = (((int) time->time) % 60); tm->tm_sec = (((int) time->time) % 60);
...@@ -671,120 +684,164 @@ timetz_out(TimeTzADT *time) ...@@ -671,120 +684,164 @@ timetz_out(TimeTzADT *time)
EncodeTimeOnly(tm, fsec, &tz, DateStyle, buf); EncodeTimeOnly(tm, fsec, &tz, DateStyle, buf);
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
PG_RETURN_CSTRING(result);
strcpy(result, buf); }
return result;
} /* timetz_out() */
bool Datum
timetz_eq(TimeTzADT *time1, TimeTzADT *time2) timetz_eq(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
return FALSE; TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
return ((time1->time + time1->zone) == (time2->time + time2->zone)); PG_RETURN_BOOL(((time1->time+time1->zone) == (time2->time+time2->zone)));
} /* timetz_eq() */ }
bool Datum
timetz_ne(TimeTzADT *time1, TimeTzADT *time2) timetz_ne(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
return FALSE; TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
return ((time1->time + time1->zone) != (time2->time + time2->zone)); PG_RETURN_BOOL(((time1->time+time1->zone) != (time2->time+time2->zone)));
} /* timetz_ne() */ }
bool Datum
timetz_lt(TimeTzADT *time1, TimeTzADT *time2) timetz_lt(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
return FALSE; TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
return ((time1->time + time1->zone) < (time2->time + time2->zone)); PG_RETURN_BOOL(((time1->time+time1->zone) < (time2->time+time2->zone)));
} /* timetz_lt() */ }
bool Datum
timetz_le(TimeTzADT *time1, TimeTzADT *time2) timetz_le(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
return FALSE; TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
return ((time1->time + time1->zone) <= (time2->time + time2->zone)); PG_RETURN_BOOL(((time1->time+time1->zone) <= (time2->time+time2->zone)));
} /* timetz_le() */ }
bool Datum
timetz_gt(TimeTzADT *time1, TimeTzADT *time2) timetz_gt(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
return FALSE; TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
return ((time1->time + time1->zone) > (time2->time + time2->zone)); PG_RETURN_BOOL(((time1->time+time1->zone) > (time2->time+time2->zone)));
} /* timetz_gt() */ }
bool Datum
timetz_ge(TimeTzADT *time1, TimeTzADT *time2) timetz_ge(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(time1) || !PointerIsValid(time2)) TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
return FALSE; TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
return ((time1->time + time1->zone) >= (time2->time + time2->zone)); PG_RETURN_BOOL(((time1->time+time1->zone) >= (time2->time+time2->zone)));
} /* timetz_ge() */ }
int Datum
timetz_cmp(TimeTzADT *time1, TimeTzADT *time2) timetz_cmp(PG_FUNCTION_ARGS)
{ {
return (timetz_lt(time1, time2) ? -1 : (timetz_gt(time1, time2) ? 1 : 0)); TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
} /* timetz_cmp() */ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
if (DatumGetBool(DirectFunctionCall2(timetz_lt,
TimeTzADTPGetDatum(time1),
TimeTzADTPGetDatum(time2))))
PG_RETURN_INT32(-1);
if (DatumGetBool(DirectFunctionCall2(timetz_gt,
TimeTzADTPGetDatum(time1),
TimeTzADTPGetDatum(time2))))
PG_RETURN_INT32(1);
PG_RETURN_INT32(0);
}
TimeTzADT * Datum
timetz_larger(TimeTzADT *time1, TimeTzADT *time2) timetz_larger(PG_FUNCTION_ARGS)
{ {
return timetz_gt(time1, time2) ? time1 : time2; TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
} /* timetz_larger() */ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
TimeTzADT * if (DatumGetBool(DirectFunctionCall2(timetz_gt,
timetz_smaller(TimeTzADT *time1, TimeTzADT *time2) TimeTzADTPGetDatum(time1),
TimeTzADTPGetDatum(time2))))
PG_RETURN_TIMETZADT_P(time1);
PG_RETURN_TIMETZADT_P(time2);
}
Datum
timetz_smaller(PG_FUNCTION_ARGS)
{ {
return timetz_lt(time1, time2) ? time1 : time2; TimeTzADT *time1 = PG_GETARG_TIMETZADT_P(0);
} /* timetz_smaller() */ TimeTzADT *time2 = PG_GETARG_TIMETZADT_P(1);
if (DatumGetBool(DirectFunctionCall2(timetz_lt,
TimeTzADTPGetDatum(time1),
TimeTzADTPGetDatum(time2))))
PG_RETURN_TIMETZADT_P(time1);
PG_RETURN_TIMETZADT_P(time2);
}
/* overlaps_timetz() /* overlaps_timetz()
* Implements the SQL92 OVERLAPS operator. * Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997 * Algorithm from Date and Darwen, 1997
*/ */
bool Datum
overlaps_timetz(TimeTzADT *ts1, TimeTzADT *te1, TimeTzADT *ts2, TimeTzADT *te2) overlaps_timetz(PG_FUNCTION_ARGS)
{ {
/* The arguments are TimeTzADT *, but we leave them as generic Datums
* for convenience of notation.
*/
Datum ts1 = PG_GETARG_DATUM(0);
Datum te1 = PG_GETARG_DATUM(1);
Datum ts2 = PG_GETARG_DATUM(2);
Datum te2 = PG_GETARG_DATUM(3);
#define TIMETZ_GT(t1,t2) \
DatumGetBool(DirectFunctionCall2(timetz_gt,t1,t2))
#define TIMETZ_LT(t1,t2) \
DatumGetBool(DirectFunctionCall2(timetz_lt,t1,t2))
#define TIMETZ_EQ(t1,t2) \
DatumGetBool(DirectFunctionCall2(timetz_eq,t1,t2))
/* Make sure we have ordered pairs... */ /* Make sure we have ordered pairs... */
if (timetz_gt(ts1, te1)) if (TIMETZ_GT(ts1, te1))
{ {
TimeTzADT *tt = ts1; Datum tt = ts1;
ts1 = te1; ts1 = te1;
te1 = tt; te1 = tt;
} }
if (timetz_gt(ts2, te2)) if (TIMETZ_GT(ts2, te2))
{ {
TimeTzADT *tt = ts2; Datum tt = ts2;
ts2 = te2; ts2 = te2;
te2 = tt; te2 = tt;
} }
return ((timetz_gt(ts1, ts2) && (timetz_lt(ts1, te2) || timetz_lt(te1, te2))) PG_RETURN_BOOL((TIMETZ_GT(ts1, ts2) &&
|| (timetz_gt(ts2, ts1) && (timetz_lt(ts2, te1) || timetz_lt(te2, te1))) (TIMETZ_LT(ts1, te2) || TIMETZ_LT(te1, te2))) ||
|| timetz_eq(ts1, ts2)); (TIMETZ_GT(ts2, ts1) &&
} /* overlaps_timetz() */ (TIMETZ_LT(ts2, te1) || TIMETZ_LT(te2, te1))) ||
TIMETZ_EQ(ts1, ts2));
#undef TIMETZ_GT
#undef TIMETZ_LT
#undef TIMETZ_EQ
}
/* timestamp_timetz() /* timestamp_timetz()
* Convert timestamp to timetz data type. * Convert timestamp to timetz data type.
*/ */
TimeTzADT * Datum
timestamp_timetz(Timestamp *timestamp) timestamp_timetz(PG_FUNCTION_ARGS)
{ {
Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
TimeTzADT *result; TimeTzADT *result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -792,32 +849,29 @@ timestamp_timetz(Timestamp *timestamp) ...@@ -792,32 +849,29 @@ timestamp_timetz(Timestamp *timestamp)
double fsec; double fsec;
char *tzn; char *tzn;
if (!PointerIsValid(timestamp)) if (TIMESTAMP_NOT_FINITE(timestamp))
elog(ERROR, "Unable to convert null timestamp to date");
if (TIMESTAMP_NOT_FINITE(*timestamp))
elog(ERROR, "Unable to convert timestamp to date"); elog(ERROR, "Unable to convert timestamp to date");
if (TIMESTAMP_IS_EPOCH(*timestamp)) if (TIMESTAMP_IS_EPOCH(timestamp))
{ {
timestamp2tm(SetTimestamp(*timestamp), NULL, tm, &fsec, NULL); timestamp2tm(SetTimestamp(timestamp), NULL, tm, &fsec, NULL);
tz = 0; tz = 0;
} }
else if (TIMESTAMP_IS_CURRENT(*timestamp)) else if (TIMESTAMP_IS_CURRENT(timestamp))
timestamp2tm(SetTimestamp(*timestamp), &tz, tm, &fsec, &tzn); timestamp2tm(SetTimestamp(timestamp), &tz, tm, &fsec, &tzn);
else else
{ {
if (timestamp2tm(*timestamp, &tz, tm, &fsec, &tzn) != 0) if (timestamp2tm(timestamp, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert timestamp to date"); elog(ERROR, "Unable to convert timestamp to date");
} }
result = palloc(sizeof(*result)); result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
result->time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec); result->time = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec + fsec);
result->zone = tz; result->zone = tz;
return result; PG_RETURN_TIMETZADT_P(result);
} /* timestamp_timetz() */ }
/* datetimetz_timestamp() /* datetimetz_timestamp()
...@@ -826,30 +880,25 @@ timestamp_timetz(Timestamp *timestamp) ...@@ -826,30 +880,25 @@ timestamp_timetz(Timestamp *timestamp)
* stored with the timetz to the result. * stored with the timetz to the result.
* - thomas 2000-03-10 * - thomas 2000-03-10
*/ */
Timestamp * Datum
datetimetz_timestamp(DateADT date, TimeTzADT *time) datetimetz_timestamp(PG_FUNCTION_ARGS)
{ {
Timestamp *result; DateADT date = PG_GETARG_DATEADT(0);
TimeTzADT *time = PG_GETARG_TIMETZADT_P(1);
Timestamp result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
int tz; int tz;
double fsec = 0; double fsec = 0;
char *tzn; char *tzn;
result = palloc(sizeof(*result));
if (!PointerIsValid(date) || !PointerIsValid(time))
TIMESTAMP_INVALID(*result);
else
{
if (date2tm(date, &tz, tm, &fsec, &tzn) != 0) if (date2tm(date, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to convert date to timestamp"); elog(ERROR, "Unable to convert date to timestamp");
if (tm2timestamp(tm, fsec, &time->zone, result) != 0) if (tm2timestamp(tm, fsec, &time->zone, &result) != 0)
elog(ERROR, "Timestamp out of range"); elog(ERROR, "Timestamp out of range");
*result += time->time; result += time->time;
}
return result; PG_RETURN_TIMESTAMP(result);
} /* datetimetz_timestamp() */ }
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.c * 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 * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
...@@ -2372,9 +2372,11 @@ DCH_cache_search(char *str) ...@@ -2372,9 +2372,11 @@ DCH_cache_search(char *str)
* TIMESTAMP to_char() * TIMESTAMP to_char()
* ------------------- * -------------------
*/ */
text * Datum
timestamp_to_char(Timestamp *dt, text *fmt) timestamp_to_char(PG_FUNCTION_ARGS)
{ {
Timestamp dt = PG_GETARG_TIMESTAMP(0);
text *fmt = PG_GETARG_TEXT_P(1);
text *result, text *result,
*result_tmp; *result_tmp;
FormatNode *format; FormatNode *format;
...@@ -2386,13 +2388,10 @@ timestamp_to_char(Timestamp *dt, text *fmt) ...@@ -2386,13 +2388,10 @@ timestamp_to_char(Timestamp *dt, text *fmt)
flag = 0, flag = 0,
x = 0; x = 0;
if ((!PointerIsValid(dt)) || (!PointerIsValid(fmt)))
return NULL;
len = VARSIZE(fmt) - VARHDRSZ; len = VARSIZE(fmt) - VARHDRSZ;
if ((!len) || (TIMESTAMP_NOT_FINITE(*dt))) if ((!len) || (TIMESTAMP_NOT_FINITE(dt)))
return textin(""); return PointerGetDatum(textin(""));
tm->tm_sec = 0; tm->tm_sec = 0;
tm->tm_year = 0; tm->tm_year = 0;
...@@ -2404,18 +2403,18 @@ timestamp_to_char(Timestamp *dt, text *fmt) ...@@ -2404,18 +2403,18 @@ timestamp_to_char(Timestamp *dt, text *fmt)
tm->tm_isdst = 0; tm->tm_isdst = 0;
tm->tm_mon = 1; 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 else
x = timestamp2tm(*dt, &tz, tm, &fsec, &tzn); x = timestamp2tm(dt, &tz, tm, &fsec, &tzn);
if (x != 0) if (x != 0)
elog(ERROR, "to_char(): Unable to convert timestamp to tm"); elog(ERROR, "to_char(): Unable to convert timestamp to tm");
...@@ -2508,7 +2507,7 @@ timestamp_to_char(Timestamp *dt, text *fmt) ...@@ -2508,7 +2507,7 @@ timestamp_to_char(Timestamp *dt, text *fmt)
VARSIZE(result) = len + VARHDRSZ; VARSIZE(result) = len + VARHDRSZ;
pfree(result_tmp); pfree(result_tmp);
return result; PG_RETURN_TEXT_P(result);
} }
...@@ -2519,20 +2518,19 @@ timestamp_to_char(Timestamp *dt, text *fmt) ...@@ -2519,20 +2518,19 @@ timestamp_to_char(Timestamp *dt, text *fmt)
* ( to_timestamp is reverse to_char() ) * ( to_timestamp is reverse to_char() )
* --------------------- * ---------------------
*/ */
Timestamp * Datum
to_timestamp(text *date_str, text *fmt) to_timestamp(PG_FUNCTION_ARGS)
{ {
text *date_str = PG_GETARG_TEXT_P(0);
text *fmt = PG_GETARG_TEXT_P(1);
FormatNode *format; FormatNode *format;
int flag = 0; int flag = 0;
Timestamp *result; Timestamp result;
char *str; char *str;
int len = 0, int len = 0,
fsec = 0, fsec = 0,
tz = 0; tz = 0;
if ((!PointerIsValid(date_str)) || (!PointerIsValid(fmt)))
return NULL;
tm->tm_sec = 0; tm->tm_sec = 0;
tm->tm_year = 0; tm->tm_year = 0;
tm->tm_min = 0; tm->tm_min = 0;
...@@ -2543,8 +2541,6 @@ to_timestamp(text *date_str, text *fmt) ...@@ -2543,8 +2541,6 @@ to_timestamp(text *date_str, text *fmt)
tm->tm_isdst = 0; tm->tm_isdst = 0;
tm->tm_mon = 1; tm->tm_mon = 1;
result = palloc(sizeof(Timestamp));
len = VARSIZE(fmt) - VARHDRSZ; len = VARSIZE(fmt) - VARHDRSZ;
if (len) if (len)
...@@ -2668,10 +2664,10 @@ to_timestamp(text *date_str, text *fmt) ...@@ -2668,10 +2664,10 @@ to_timestamp(text *date_str, text *fmt)
#ifdef DEBUG_TO_FROM_CHAR #ifdef DEBUG_TO_FROM_CHAR
NOTICE_TM; NOTICE_TM;
#endif #endif
if (tm2timestamp(tm, fsec, &tz, result) != 0) if (tm2timestamp(tm, fsec, &tz, &result) != 0)
elog(ERROR, "to_datatime(): can't convert 'tm' to timestamp."); 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) ...@@ -2679,10 +2675,13 @@ to_timestamp(text *date_str, text *fmt)
* Make Date from date_str which is formated at argument 'fmt' * Make Date from date_str which is formated at argument 'fmt'
* ---------- * ----------
*/ */
DateADT Datum
to_date(text *date_str, text *fmt) 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));
} }
/********************************************************************** /**********************************************************************
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.68 2000/05/29 19:16:57 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.69 2000/06/09 01:11:08 tgl Exp $
* *
* NOTES * NOTES
* *
...@@ -85,8 +85,14 @@ static AbsoluteTime tm2abstime(struct tm * tm, int tz); ...@@ -85,8 +85,14 @@ static AbsoluteTime tm2abstime(struct tm * tm, int tz);
#define INVALID_INTERVAL_STR "Undefined Range" #define INVALID_INTERVAL_STR "Undefined Range"
#define INVALID_INTERVAL_STR_LEN (sizeof(INVALID_INTERVAL_STR)-1) #define INVALID_INTERVAL_STR_LEN (sizeof(INVALID_INTERVAL_STR)-1)
#define ABSTIMEMIN(t1, t2) abstimele((t1),(t2)) ? (t1) : (t2) #define ABSTIMEMIN(t1, t2) \
#define ABSTIMEMAX(t1, t2) abstimelt((t1),(t2)) ? (t2) : (t1) (DatumGetBool(DirectFunctionCall2(abstimele, \
AbsoluteTimeGetDatum(t1), \
AbsoluteTimeGetDatum(t2))) ? (t1) : (t2))
#define ABSTIMEMAX(t1, t2) \
(DatumGetBool(DirectFunctionCall2(abstimelt, \
AbsoluteTimeGetDatum(t1), \
AbsoluteTimeGetDatum(t2))) ? (t2) : (t1))
#ifdef NOT_USED #ifdef NOT_USED
static char *unit_tab[] = { static char *unit_tab[] = {
...@@ -341,25 +347,21 @@ tm2abstime(struct tm * tm, int tz) ...@@ -341,25 +347,21 @@ tm2abstime(struct tm * tm, int tz)
/* nabstimein() /* nabstimein()
* Decode date/time string and return abstime. * Decode date/time string and return abstime.
*/ */
AbsoluteTime Datum
nabstimein(char *str) nabstimein(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0);
AbsoluteTime result; AbsoluteTime result;
double fsec; double fsec;
int tz = 0; int tz = 0;
struct tm date, struct tm date,
*tm = &date; *tm = &date;
char *field[MAXDATEFIELDS]; char *field[MAXDATEFIELDS];
char lowstr[MAXDATELEN + 1]; char lowstr[MAXDATELEN + 1];
int dtype; int dtype;
int nf, int nf,
ftype[MAXDATEFIELDS]; ftype[MAXDATEFIELDS];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) abstime external representation");
if (strlen(str) > MAXDATELEN) if (strlen(str) > MAXDATELEN)
elog(ERROR, "Bad (length) abstime external representation '%s'", str); elog(ERROR, "Bad (length) abstime external representation '%s'", str);
...@@ -399,16 +401,17 @@ nabstimein(char *str) ...@@ -399,16 +401,17 @@ nabstimein(char *str)
break; break;
}; };
return result; PG_RETURN_ABSOLUTETIME(result);
} /* nabstimein() */ }
/* nabstimeout() /* nabstimeout()
* Given an AbsoluteTime return the English text version of the date * Given an AbsoluteTime return the English text version of the date
*/ */
char * Datum
nabstimeout(AbsoluteTime time) nabstimeout(PG_FUNCTION_ARGS)
{ {
AbsoluteTime time = PG_GETARG_ABSOLUTETIME(0);
char *result; char *result;
int tz; int tz;
double fsec = 0; double fsec = 0;
...@@ -441,11 +444,9 @@ nabstimeout(AbsoluteTime time) ...@@ -441,11 +444,9 @@ nabstimeout(AbsoluteTime time)
break; break;
} }
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
strcpy(result, buf); PG_RETURN_CSTRING(result);
}
return result;
} /* nabstimeout() */
/* /*
...@@ -487,195 +488,204 @@ AbsoluteTimeIsAfter(AbsoluteTime time1, AbsoluteTime time2) ...@@ -487,195 +488,204 @@ AbsoluteTimeIsAfter(AbsoluteTime time1, AbsoluteTime time2)
/* abstime_finite() /* abstime_finite()
*/ */
bool Datum
abstime_finite(AbsoluteTime abstime) abstime_finite(PG_FUNCTION_ARGS)
{ {
return ((abstime != INVALID_ABSTIME) AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
&& (abstime != NOSTART_ABSTIME) && (abstime != NOEND_ABSTIME));
} /* abstime_finite() */ PG_RETURN_BOOL((abstime != INVALID_ABSTIME) &&
(abstime != NOSTART_ABSTIME) &&
(abstime != NOEND_ABSTIME));
}
/* /*
* abstimeeq - returns 1, iff arguments are equal * abstimeeq - returns true iff arguments are equal
* abstimene - returns 1, iff arguments are not equal * abstimene - returns true iff arguments are not equal
* abstimelt - returns 1, iff t1 less than t2 * abstimelt - returns true iff t1 less than t2
* abstimegt - returns 1, iff t1 greater than t2 * abstimegt - returns true iff t1 greater than t2
* abstimele - returns 1, iff t1 less than or equal to t2 * abstimele - returns true iff t1 less than or equal to t2
* abstimege - returns 1, iff t1 greater than or equal to t2 * abstimege - returns true iff t1 greater than or equal to t2
*/ */
bool Datum
abstimeeq(AbsoluteTime t1, AbsoluteTime t2) abstimeeq(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
return FALSE; PG_RETURN_BOOL(false);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
if (t2 == CURRENT_ABSTIME) if (t2 == CURRENT_ABSTIME)
t2 = GetCurrentTransactionStartTime(); t2 = GetCurrentTransactionStartTime();
return t1 == t2; PG_RETURN_BOOL(t1 == t2);
} }
bool Datum
abstimene(AbsoluteTime t1, AbsoluteTime t2) abstimene(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
return FALSE; PG_RETURN_BOOL(false);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
if (t2 == CURRENT_ABSTIME) if (t2 == CURRENT_ABSTIME)
t2 = GetCurrentTransactionStartTime(); t2 = GetCurrentTransactionStartTime();
return t1 != t2; PG_RETURN_BOOL(t1 != t2);
} }
bool Datum
abstimelt(AbsoluteTime t1, AbsoluteTime t2) abstimelt(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
return FALSE; PG_RETURN_BOOL(false);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
if (t2 == CURRENT_ABSTIME) if (t2 == CURRENT_ABSTIME)
t2 = GetCurrentTransactionStartTime(); t2 = GetCurrentTransactionStartTime();
return t1 < t2; PG_RETURN_BOOL(t1 < t2);
} }
bool Datum
abstimegt(AbsoluteTime t1, AbsoluteTime t2) abstimegt(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
return FALSE; PG_RETURN_BOOL(false);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
if (t2 == CURRENT_ABSTIME) if (t2 == CURRENT_ABSTIME)
t2 = GetCurrentTransactionStartTime(); t2 = GetCurrentTransactionStartTime();
return t1 > t2; PG_RETURN_BOOL(t1 > t2);
} }
bool Datum
abstimele(AbsoluteTime t1, AbsoluteTime t2) abstimele(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
return FALSE; PG_RETURN_BOOL(false);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
if (t2 == CURRENT_ABSTIME) if (t2 == CURRENT_ABSTIME)
t2 = GetCurrentTransactionStartTime(); t2 = GetCurrentTransactionStartTime();
return t1 <= t2; PG_RETURN_BOOL(t1 <= t2);
} }
bool Datum
abstimege(AbsoluteTime t1, AbsoluteTime t2) abstimege(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME) if (t1 == INVALID_ABSTIME || t2 == INVALID_ABSTIME)
return FALSE; PG_RETURN_BOOL(false);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
if (t2 == CURRENT_ABSTIME) if (t2 == CURRENT_ABSTIME)
t2 = GetCurrentTransactionStartTime(); t2 = GetCurrentTransactionStartTime();
return t1 >= t2; PG_RETURN_BOOL(t1 >= t2);
} }
/* datetime_abstime() /* datetime_abstime()
* Convert timestamp to abstime. * Convert timestamp to abstime.
*/ */
AbsoluteTime Datum
timestamp_abstime(Timestamp *timestamp) timestamp_abstime(PG_FUNCTION_ARGS)
{ {
Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
AbsoluteTime result; AbsoluteTime result;
double fsec; double fsec;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
if (!PointerIsValid(timestamp)) if (TIMESTAMP_IS_INVALID(timestamp))
{ {
result = INVALID_ABSTIME; result = INVALID_ABSTIME;
} }
else if (TIMESTAMP_IS_INVALID(*timestamp)) else if (TIMESTAMP_IS_NOBEGIN(timestamp))
{
result = INVALID_ABSTIME;
}
else if (TIMESTAMP_IS_NOBEGIN(*timestamp))
{ {
result = NOSTART_ABSTIME; result = NOSTART_ABSTIME;
} }
else if (TIMESTAMP_IS_NOEND(*timestamp)) else if (TIMESTAMP_IS_NOEND(timestamp))
{ {
result = NOEND_ABSTIME; result = NOEND_ABSTIME;
} }
else else
{ {
if (TIMESTAMP_IS_RELATIVE(*timestamp)) if (TIMESTAMP_IS_RELATIVE(timestamp))
{ {
timestamp2tm(SetTimestamp(*timestamp), NULL, tm, &fsec, NULL); timestamp2tm(SetTimestamp(timestamp), NULL, tm, &fsec, NULL);
result = tm2abstime(tm, 0); result = tm2abstime(tm, 0);
} }
else if (timestamp2tm(*timestamp, NULL, tm, &fsec, NULL) == 0) else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL) == 0)
{ {
result = tm2abstime(tm, 0); result = tm2abstime(tm, 0);
} }
else else
{ {
result = INVALID_ABSTIME; result = INVALID_ABSTIME;
}; }
}; }
return result; PG_RETURN_ABSOLUTETIME(result);
} /* timestamp_abstime() */ }
/* abstime_timestamp() /* abstime_timestamp()
* Convert abstime to timestamp. * Convert abstime to timestamp.
*/ */
Timestamp * Datum
abstime_timestamp(AbsoluteTime abstime) abstime_timestamp(PG_FUNCTION_ARGS)
{ {
Timestamp *result; AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0);
Timestamp result;
if (!PointerIsValid(result = palloc(sizeof(Timestamp))))
elog(ERROR, "Unable to allocate space to convert abstime to timestamp");
switch (abstime) switch (abstime)
{ {
case INVALID_ABSTIME: case INVALID_ABSTIME:
TIMESTAMP_INVALID(*result); TIMESTAMP_INVALID(result);
break; break;
case NOSTART_ABSTIME: case NOSTART_ABSTIME:
TIMESTAMP_NOBEGIN(*result); TIMESTAMP_NOBEGIN(result);
break; break;
case NOEND_ABSTIME: case NOEND_ABSTIME:
TIMESTAMP_NOEND(*result); TIMESTAMP_NOEND(result);
break; break;
case EPOCH_ABSTIME: case EPOCH_ABSTIME:
TIMESTAMP_EPOCH(*result); TIMESTAMP_EPOCH(result);
break; break;
case CURRENT_ABSTIME: case CURRENT_ABSTIME:
TIMESTAMP_CURRENT(*result); TIMESTAMP_CURRENT(result);
break; break;
default: default:
*result = abstime + ((date2j(1970, 1, 1) - date2j(2000, 1, 1)) * 86400); result = abstime + ((date2j(1970, 1, 1) - date2j(2000, 1, 1)) * 86400);
break; break;
}; };
return result; PG_RETURN_TIMESTAMP(result);
} /* abstime_timestamp() */ }
/***************************************************************************** /*****************************************************************************
...@@ -685,11 +695,11 @@ abstime_timestamp(AbsoluteTime abstime) ...@@ -685,11 +695,11 @@ abstime_timestamp(AbsoluteTime abstime)
/* /*
* reltimein - converts a reltime string in an internal format * reltimein - converts a reltime string in an internal format
*/ */
RelativeTime Datum
reltimein(char *str) reltimein(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0);
RelativeTime result; RelativeTime result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
double fsec; double fsec;
...@@ -699,9 +709,6 @@ reltimein(char *str) ...@@ -699,9 +709,6 @@ reltimein(char *str)
ftype[MAXDATEFIELDS]; ftype[MAXDATEFIELDS];
char lowstr[MAXDATELEN + 1]; char lowstr[MAXDATELEN + 1];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) date external representation");
if (strlen(str) > MAXDATELEN) if (strlen(str) > MAXDATELEN)
elog(ERROR, "Bad (length) reltime external representation '%s'", str); elog(ERROR, "Bad (length) reltime external representation '%s'", str);
...@@ -714,23 +721,24 @@ reltimein(char *str) ...@@ -714,23 +721,24 @@ reltimein(char *str)
case DTK_DELTA: case DTK_DELTA:
result = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec); result = ((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec);
result += (((tm->tm_year * 365) + (tm->tm_mon * 30) + tm->tm_mday) * (24 * 60 * 60)); result += (((tm->tm_year * 365) + (tm->tm_mon * 30) + tm->tm_mday) * (24 * 60 * 60));
return result; PG_RETURN_RELATIVETIME(result);
default: default:
return INVALID_RELTIME; PG_RETURN_RELATIVETIME(INVALID_RELTIME);
} }
elog(ERROR, "Bad reltime (internal coding error) '%s'", str); elog(ERROR, "Bad reltime (internal coding error) '%s'", str);
return INVALID_RELTIME; PG_RETURN_RELATIVETIME(INVALID_RELTIME);
} /* reltimein() */ }
/* /*
* reltimeout - converts the internal format to a reltime string * reltimeout - converts the internal format to a reltime string
*/ */
char * Datum
reltimeout(RelativeTime time) reltimeout(PG_FUNCTION_ARGS)
{ {
RelativeTime time = PG_GETARG_RELATIVETIME(0);
char *result; char *result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -739,7 +747,6 @@ reltimeout(RelativeTime time) ...@@ -739,7 +747,6 @@ reltimeout(RelativeTime time)
if (time == INVALID_RELTIME) if (time == INVALID_RELTIME)
{ {
strcpy(buf, INVALID_RELTIME_STR); strcpy(buf, INVALID_RELTIME_STR);
} }
else else
{ {
...@@ -747,11 +754,9 @@ reltimeout(RelativeTime time) ...@@ -747,11 +754,9 @@ reltimeout(RelativeTime time)
EncodeTimeSpan(tm, 0, DateStyle, buf); EncodeTimeSpan(tm, 0, DateStyle, buf);
} }
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
strcpy(result, buf); PG_RETURN_CSTRING(result);
}
return result;
} /* reltimeout() */
static void static void
...@@ -807,17 +812,18 @@ dummyfunc() ...@@ -807,17 +812,18 @@ dummyfunc()
/* /*
* tintervalin - converts an interval string to an internal format * tintervalin - converts an interval string to internal format
*/ */
TimeInterval Datum
tintervalin(char *intervalstr) tintervalin(PG_FUNCTION_ARGS)
{ {
char *intervalstr = PG_GETARG_CSTRING(0);
TimeInterval interval;
int error; int error;
AbsoluteTime i_start, AbsoluteTime i_start,
i_end, i_end,
t1, t1,
t2; t2;
TimeInterval interval;
interval = (TimeInterval) palloc(sizeof(TimeIntervalData)); interval = (TimeInterval) palloc(sizeof(TimeIntervalData));
error = istinterval(intervalstr, &t1, &t2); error = istinterval(intervalstr, &t1, &t2);
...@@ -833,7 +839,7 @@ tintervalin(char *intervalstr) ...@@ -833,7 +839,7 @@ tintervalin(char *intervalstr)
interval->data[1] = i_end; interval->data[1] = i_end;
interval->status = T_INTERVAL_VALID; interval->status = T_INTERVAL_VALID;
} }
return interval; PG_RETURN_TIMEINTERVAL(interval);
} }
...@@ -841,9 +847,10 @@ tintervalin(char *intervalstr) ...@@ -841,9 +847,10 @@ tintervalin(char *intervalstr)
* tintervalout - converts an internal interval format to a string * tintervalout - converts an internal interval format to a string
* *
*/ */
char * Datum
tintervalout(TimeInterval interval) tintervalout(PG_FUNCTION_ARGS)
{ {
TimeInterval interval = PG_GETARG_TIMEINTERVAL(0);
char *i_str, char *i_str,
*p; *p;
...@@ -853,16 +860,18 @@ tintervalout(TimeInterval interval) ...@@ -853,16 +860,18 @@ tintervalout(TimeInterval interval)
strcat(i_str, INVALID_INTERVAL_STR); strcat(i_str, INVALID_INTERVAL_STR);
else else
{ {
p = nabstimeout(interval->data[0]); p = DatumGetCString(DirectFunctionCall1(nabstimeout,
AbsoluteTimeGetDatum(interval->data[0])));
strcat(i_str, p); strcat(i_str, p);
pfree(p); pfree(p);
strcat(i_str, "\" \""); strcat(i_str, "\" \"");
p = nabstimeout(interval->data[1]); p = DatumGetCString(DirectFunctionCall1(nabstimeout,
AbsoluteTimeGetDatum(interval->data[1])));
strcat(i_str, p); strcat(i_str, p);
pfree(p); pfree(p);
} }
strcat(i_str, "\"]\0"); strcat(i_str, "\"]\0");
return i_str; PG_RETURN_CSTRING(i_str);
} }
...@@ -870,21 +879,18 @@ tintervalout(TimeInterval interval) ...@@ -870,21 +879,18 @@ tintervalout(TimeInterval interval)
* PUBLIC ROUTINES * * PUBLIC ROUTINES *
*****************************************************************************/ *****************************************************************************/
RelativeTime Datum
interval_reltime(Interval *interval) interval_reltime(PG_FUNCTION_ARGS)
{ {
Interval *interval = PG_GETARG_INTERVAL_P(0);
RelativeTime time; RelativeTime time;
int year, int year,
month; month;
double span; double span;
if (!PointerIsValid(interval))
time = INVALID_RELTIME;
if (INTERVAL_IS_INVALID(*interval)) if (INTERVAL_IS_INVALID(*interval))
{ {
time = INVALID_RELTIME; time = INVALID_RELTIME;
} }
else else
{ {
...@@ -892,13 +898,11 @@ interval_reltime(Interval *interval) ...@@ -892,13 +898,11 @@ interval_reltime(Interval *interval)
{ {
year = 0; year = 0;
month = 0; month = 0;
} }
else if (abs(interval->month) >= 12) else if (abs(interval->month) >= 12)
{ {
year = (interval->month / 12); year = (interval->month / 12);
month = (interval->month % 12); month = (interval->month % 12);
} }
else else
{ {
...@@ -911,19 +915,19 @@ interval_reltime(Interval *interval) ...@@ -911,19 +915,19 @@ interval_reltime(Interval *interval)
time = (((span > INT_MIN) && (span < INT_MAX)) ? span : INVALID_RELTIME); time = (((span > INT_MIN) && (span < INT_MAX)) ? span : INVALID_RELTIME);
} }
return time; PG_RETURN_RELATIVETIME(time);
} /* interval_reltime() */ }
Interval * Datum
reltime_interval(RelativeTime reltime) reltime_interval(PG_FUNCTION_ARGS)
{ {
RelativeTime reltime = PG_GETARG_RELATIVETIME(0);
Interval *result; Interval *result;
int year, int year,
month; month;
if (!PointerIsValid(result = palloc(sizeof(Interval)))) result = (Interval *) palloc(sizeof(Interval));
elog(ERROR, "Memory allocation failed, can't convert reltime to interval");
switch (reltime) switch (reltime)
{ {
...@@ -937,18 +941,21 @@ reltime_interval(RelativeTime reltime) ...@@ -937,18 +941,21 @@ reltime_interval(RelativeTime reltime)
result->time = reltime; result->time = reltime;
result->month = ((12 * year) + month); result->month = ((12 * year) + month);
break;
} }
return result; PG_RETURN_INTERVAL_P(result);
} /* reltime_interval() */ }
/* /*
* mktinterval - creates a time interval with endpoints t1 and t2 * mktinterval - creates a time interval with endpoints t1 and t2
*/ */
TimeInterval Datum
mktinterval(AbsoluteTime t1, AbsoluteTime t2) mktinterval(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
AbsoluteTime t2 = PG_GETARG_ABSOLUTETIME(1);
AbsoluteTime tstart = ABSTIMEMIN(t1, t2), AbsoluteTime tstart = ABSTIMEMIN(t1, t2),
tend = ABSTIMEMAX(t1, t2); tend = ABSTIMEMAX(t1, t2);
TimeInterval interval; TimeInterval interval;
...@@ -963,7 +970,7 @@ mktinterval(AbsoluteTime t1, AbsoluteTime t2) ...@@ -963,7 +970,7 @@ mktinterval(AbsoluteTime t1, AbsoluteTime t2)
interval->data[1] = tend; interval->data[1] = tend;
} }
return interval; PG_RETURN_TIMEINTERVAL(interval);
} }
/* /*
...@@ -976,9 +983,12 @@ mktinterval(AbsoluteTime t1, AbsoluteTime t2) ...@@ -976,9 +983,12 @@ mktinterval(AbsoluteTime t1, AbsoluteTime t2)
/* /*
* timepl - returns the value of (abstime t1 + relime t2) * timepl - returns the value of (abstime t1 + relime t2)
*/ */
AbsoluteTime Datum
timepl(AbsoluteTime t1, RelativeTime t2) timepl(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
...@@ -986,18 +996,21 @@ timepl(AbsoluteTime t1, RelativeTime t2) ...@@ -986,18 +996,21 @@ timepl(AbsoluteTime t1, RelativeTime t2)
RelativeTimeIsValid(t2) && RelativeTimeIsValid(t2) &&
((t2 > 0) ? (t1 < NOEND_ABSTIME - t2) ((t2 > 0) ? (t1 < NOEND_ABSTIME - t2)
: (t1 > NOSTART_ABSTIME - t2))) /* prevent overflow */ : (t1 > NOSTART_ABSTIME - t2))) /* prevent overflow */
return t1 + t2; PG_RETURN_ABSOLUTETIME(t1 + t2);
return INVALID_ABSTIME; PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
} }
/* /*
* timemi - returns the value of (abstime t1 - reltime t2) * timemi - returns the value of (abstime t1 - reltime t2)
*/ */
AbsoluteTime Datum
timemi(AbsoluteTime t1, RelativeTime t2) timemi(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t1 = PG_GETARG_ABSOLUTETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == CURRENT_ABSTIME) if (t1 == CURRENT_ABSTIME)
t1 = GetCurrentTransactionStartTime(); t1 = GetCurrentTransactionStartTime();
...@@ -1005,14 +1018,16 @@ timemi(AbsoluteTime t1, RelativeTime t2) ...@@ -1005,14 +1018,16 @@ timemi(AbsoluteTime t1, RelativeTime t2)
RelativeTimeIsValid(t2) && RelativeTimeIsValid(t2) &&
((t2 > 0) ? (t1 > NOSTART_ABSTIME + t2) ((t2 > 0) ? (t1 > NOSTART_ABSTIME + t2)
: (t1 < NOEND_ABSTIME + t2))) /* prevent overflow */ : (t1 < NOEND_ABSTIME + t2))) /* prevent overflow */
return t1 - t2; PG_RETURN_ABSOLUTETIME(t1 - t2);
return INVALID_ABSTIME; PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
} }
/* /*
* abstimemi - returns the value of (abstime t1 - abstime t2) * abstimemi - returns the value of (abstime t1 - abstime t2)
*
* This is not exported, so it's not been made fmgr-compatible.
*/ */
static RelativeTime static RelativeTime
abstimemi(AbsoluteTime t1, AbsoluteTime t2) abstimemi(AbsoluteTime t1, AbsoluteTime t2)
...@@ -1031,27 +1046,39 @@ abstimemi(AbsoluteTime t1, AbsoluteTime t2) ...@@ -1031,27 +1046,39 @@ abstimemi(AbsoluteTime t1, AbsoluteTime t2)
/* /*
* intinterval - returns 1, iff absolute date is in the interval * intinterval - returns true iff absolute date is in the interval
*/ */
int Datum
intinterval(AbsoluteTime t, TimeInterval interval) intinterval(PG_FUNCTION_ARGS)
{ {
AbsoluteTime t = PG_GETARG_ABSOLUTETIME(0);
TimeInterval interval = PG_GETARG_TIMEINTERVAL(1);
if (interval->status == T_INTERVAL_VALID && t != INVALID_ABSTIME) if (interval->status == T_INTERVAL_VALID && t != INVALID_ABSTIME)
return (abstimege(t, interval->data[0]) && {
abstimele(t, interval->data[1])); if (DatumGetBool(DirectFunctionCall2(abstimege,
return 0; AbsoluteTimeGetDatum(t),
AbsoluteTimeGetDatum(interval->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimele,
AbsoluteTimeGetDatum(t),
AbsoluteTimeGetDatum(interval->data[1]))))
PG_RETURN_BOOL(true);
}
PG_RETURN_BOOL(false);
} }
/* /*
* tintervalrel - returns relative time corresponding to interval * tintervalrel - returns relative time corresponding to interval
*/ */
RelativeTime Datum
tintervalrel(TimeInterval interval) tintervalrel(PG_FUNCTION_ARGS)
{ {
if (interval->status == T_INTERVAL_VALID) TimeInterval interval = PG_GETARG_TIMEINTERVAL(0);
return abstimemi(interval->data[1], interval->data[0]);
else if (interval->status != T_INTERVAL_VALID)
return INVALID_RELTIME; PG_RETURN_RELATIVETIME(INVALID_RELTIME);
PG_RETURN_RELATIVETIME(abstimemi(interval->data[1], interval->data[0]));
} }
/* /*
...@@ -1059,101 +1086,131 @@ tintervalrel(TimeInterval interval) ...@@ -1059,101 +1086,131 @@ tintervalrel(TimeInterval interval)
* *
* Now AbsoluteTime is time since Jan 1 1970 -mer 7 Feb 1992 * Now AbsoluteTime is time since Jan 1 1970 -mer 7 Feb 1992
*/ */
AbsoluteTime Datum
timenow() timenow(PG_FUNCTION_ARGS)
{ {
time_t sec; time_t sec;
if (time(&sec) < 0) if (time(&sec) < 0)
return INVALID_ABSTIME; PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
return (AbsoluteTime) sec; PG_RETURN_ABSOLUTETIME((AbsoluteTime) sec);
} }
/* /*
* reltimeeq - returns 1, iff arguments are equal * reltimeeq - returns true iff arguments are equal
* reltimene - returns 1, iff arguments are not equal * reltimene - returns true iff arguments are not equal
* reltimelt - returns 1, iff t1 less than t2 * reltimelt - returns true iff t1 less than t2
* reltimegt - returns 1, iff t1 greater than t2 * reltimegt - returns true iff t1 greater than t2
* reltimele - returns 1, iff t1 less than or equal to t2 * reltimele - returns true iff t1 less than or equal to t2
* reltimege - returns 1, iff t1 greater than or equal to t2 * reltimege - returns true iff t1 greater than or equal to t2
*/ */
bool Datum
reltimeeq(RelativeTime t1, RelativeTime t2) reltimeeq(PG_FUNCTION_ARGS)
{ {
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME) if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
return t1 == t2; PG_RETURN_BOOL(t1 == t2);
} }
bool Datum
reltimene(RelativeTime t1, RelativeTime t2) reltimene(PG_FUNCTION_ARGS)
{ {
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME) if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
return t1 != t2; PG_RETURN_BOOL(t1 != t2);
} }
bool Datum
reltimelt(RelativeTime t1, RelativeTime t2) reltimelt(PG_FUNCTION_ARGS)
{ {
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME) if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
return t1 < t2; PG_RETURN_BOOL(t1 < t2);
} }
bool Datum
reltimegt(RelativeTime t1, RelativeTime t2) reltimegt(PG_FUNCTION_ARGS)
{ {
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME) if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
return t1 > t2; PG_RETURN_BOOL(t1 > t2);
} }
bool Datum
reltimele(RelativeTime t1, RelativeTime t2) reltimele(PG_FUNCTION_ARGS)
{ {
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME) if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
return t1 <= t2; PG_RETURN_BOOL(t1 <= t2);
} }
bool Datum
reltimege(RelativeTime t1, RelativeTime t2) reltimege(PG_FUNCTION_ARGS)
{ {
RelativeTime t1 = PG_GETARG_RELATIVETIME(0);
RelativeTime t2 = PG_GETARG_RELATIVETIME(1);
if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME) if (t1 == INVALID_RELTIME || t2 == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
return t1 >= t2; PG_RETURN_BOOL(t1 >= t2);
} }
/* /*
* tintervalsame - returns 1, iff interval i1 is same as interval i2 * tintervalsame - returns true iff interval i1 is same as interval i2
* Check begin and end time. * Check begin and end time.
*/ */
bool Datum
tintervalsame(TimeInterval i1, TimeInterval i2) tintervalsame(PG_FUNCTION_ARGS)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
return (abstimeeq(i1->data[0], i2->data[0]) &&
abstimeeq(i1->data[1], i2->data[1])); if (DatumGetBool(DirectFunctionCall2(abstimeeq,
} /* tintervalsame() */ AbsoluteTimeGetDatum(i1->data[0]),
AbsoluteTimeGetDatum(i2->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimeeq,
AbsoluteTimeGetDatum(i1->data[1]),
AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(true);
PG_RETURN_BOOL(false);
}
/* /*
* tintervaleq - returns 1, iff interval i1 is equal to interval i2 * tintervaleq - returns true iff interval i1 is equal to interval i2
* Check length of intervals. * Check length of intervals.
*/ */
bool Datum
tintervaleq(TimeInterval i1, TimeInterval i2) tintervaleq(PG_FUNCTION_ARGS)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10, AbsoluteTime t10,
t11, t11,
t20, t20,
t21; t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
t10 = i1->data[0]; t10 = i1->data[0];
t11 = i1->data[1]; t11 = i1->data[1];
...@@ -1162,7 +1219,7 @@ tintervaleq(TimeInterval i1, TimeInterval i2) ...@@ -1162,7 +1219,7 @@ tintervaleq(TimeInterval i1, TimeInterval i2)
if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME) if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME)) || (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
return FALSE; PG_RETURN_BOOL(false);
if (t10 == CURRENT_ABSTIME) if (t10 == CURRENT_ABSTIME)
t10 = GetCurrentTransactionStartTime(); t10 = GetCurrentTransactionStartTime();
...@@ -1173,23 +1230,21 @@ tintervaleq(TimeInterval i1, TimeInterval i2) ...@@ -1173,23 +1230,21 @@ tintervaleq(TimeInterval i1, TimeInterval i2)
if (t21 == CURRENT_ABSTIME) if (t21 == CURRENT_ABSTIME)
t21 = GetCurrentTransactionStartTime(); t21 = GetCurrentTransactionStartTime();
return (t11 - t10) == (t21 - t20); PG_RETURN_BOOL((t11 - t10) == (t21 - t20));
} /* tintervaleq() */ }
/* Datum
* tintervalne - returns 1, iff interval i1 is not equal to interval i2 tintervalne(PG_FUNCTION_ARGS)
* Check length of intervals.
*/
bool
tintervalne(TimeInterval i1, TimeInterval i2)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10, AbsoluteTime t10,
t11, t11,
t20, t20,
t21; t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
t10 = i1->data[0]; t10 = i1->data[0];
t11 = i1->data[1]; t11 = i1->data[1];
...@@ -1198,7 +1253,7 @@ tintervalne(TimeInterval i1, TimeInterval i2) ...@@ -1198,7 +1253,7 @@ tintervalne(TimeInterval i1, TimeInterval i2)
if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME) if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME)) || (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
return FALSE; PG_RETURN_BOOL(false);
if (t10 == CURRENT_ABSTIME) if (t10 == CURRENT_ABSTIME)
t10 = GetCurrentTransactionStartTime(); t10 = GetCurrentTransactionStartTime();
...@@ -1209,23 +1264,21 @@ tintervalne(TimeInterval i1, TimeInterval i2) ...@@ -1209,23 +1264,21 @@ tintervalne(TimeInterval i1, TimeInterval i2)
if (t21 == CURRENT_ABSTIME) if (t21 == CURRENT_ABSTIME)
t21 = GetCurrentTransactionStartTime(); t21 = GetCurrentTransactionStartTime();
return (t11 - t10) != (t21 - t20); PG_RETURN_BOOL((t11 - t10) != (t21 - t20));
} /* tintervalne() */ }
/* Datum
* tintervallt - returns TRUE, iff interval i1 is less than interval i2 tintervallt(PG_FUNCTION_ARGS)
* Check length of intervals.
*/
bool
tintervallt(TimeInterval i1, TimeInterval i2)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10, AbsoluteTime t10,
t11, t11,
t20, t20,
t21; t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
t10 = i1->data[0]; t10 = i1->data[0];
t11 = i1->data[1]; t11 = i1->data[1];
...@@ -1234,7 +1287,7 @@ tintervallt(TimeInterval i1, TimeInterval i2) ...@@ -1234,7 +1287,7 @@ tintervallt(TimeInterval i1, TimeInterval i2)
if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME) if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME)) || (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
return FALSE; PG_RETURN_BOOL(false);
if (t10 == CURRENT_ABSTIME) if (t10 == CURRENT_ABSTIME)
t10 = GetCurrentTransactionStartTime(); t10 = GetCurrentTransactionStartTime();
...@@ -1245,23 +1298,21 @@ tintervallt(TimeInterval i1, TimeInterval i2) ...@@ -1245,23 +1298,21 @@ tintervallt(TimeInterval i1, TimeInterval i2)
if (t21 == CURRENT_ABSTIME) if (t21 == CURRENT_ABSTIME)
t21 = GetCurrentTransactionStartTime(); t21 = GetCurrentTransactionStartTime();
return (t11 - t10) < (t21 - t20); PG_RETURN_BOOL((t11 - t10) < (t21 - t20));
} /* tintervallt() */ }
/* Datum
* tintervalle - returns TRUE, iff interval i1 is less than or equal to interval i2 tintervalle(PG_FUNCTION_ARGS)
* Check length of intervals.
*/
bool
tintervalle(TimeInterval i1, TimeInterval i2)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10, AbsoluteTime t10,
t11, t11,
t20, t20,
t21; t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
t10 = i1->data[0]; t10 = i1->data[0];
t11 = i1->data[1]; t11 = i1->data[1];
...@@ -1270,7 +1321,7 @@ tintervalle(TimeInterval i1, TimeInterval i2) ...@@ -1270,7 +1321,7 @@ tintervalle(TimeInterval i1, TimeInterval i2)
if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME) if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME)) || (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
return FALSE; PG_RETURN_BOOL(false);
if (t10 == CURRENT_ABSTIME) if (t10 == CURRENT_ABSTIME)
t10 = GetCurrentTransactionStartTime(); t10 = GetCurrentTransactionStartTime();
...@@ -1281,23 +1332,21 @@ tintervalle(TimeInterval i1, TimeInterval i2) ...@@ -1281,23 +1332,21 @@ tintervalle(TimeInterval i1, TimeInterval i2)
if (t21 == CURRENT_ABSTIME) if (t21 == CURRENT_ABSTIME)
t21 = GetCurrentTransactionStartTime(); t21 = GetCurrentTransactionStartTime();
return (t11 - t10) <= (t21 - t20); PG_RETURN_BOOL((t11 - t10) <= (t21 - t20));
} /* tintervalle() */ }
/* Datum
* tintervalgt - returns TRUE, iff interval i1 is less than interval i2 tintervalgt(PG_FUNCTION_ARGS)
* Check length of intervals.
*/
bool
tintervalgt(TimeInterval i1, TimeInterval i2)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10, AbsoluteTime t10,
t11, t11,
t20, t20,
t21; t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
t10 = i1->data[0]; t10 = i1->data[0];
t11 = i1->data[1]; t11 = i1->data[1];
...@@ -1306,7 +1355,7 @@ tintervalgt(TimeInterval i1, TimeInterval i2) ...@@ -1306,7 +1355,7 @@ tintervalgt(TimeInterval i1, TimeInterval i2)
if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME) if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME)) || (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
return FALSE; PG_RETURN_BOOL(false);
if (t10 == CURRENT_ABSTIME) if (t10 == CURRENT_ABSTIME)
t10 = GetCurrentTransactionStartTime(); t10 = GetCurrentTransactionStartTime();
...@@ -1317,23 +1366,21 @@ tintervalgt(TimeInterval i1, TimeInterval i2) ...@@ -1317,23 +1366,21 @@ tintervalgt(TimeInterval i1, TimeInterval i2)
if (t21 == CURRENT_ABSTIME) if (t21 == CURRENT_ABSTIME)
t21 = GetCurrentTransactionStartTime(); t21 = GetCurrentTransactionStartTime();
return (t11 - t10) > (t21 - t20); PG_RETURN_BOOL((t11 - t10) > (t21 - t20));
} /* tintervalgt() */ }
/* Datum
* tintervalge - returns TRUE, iff interval i1 is less than or equal to interval i2 tintervalge(PG_FUNCTION_ARGS)
* Check length of intervals.
*/
bool
tintervalge(TimeInterval i1, TimeInterval i2)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
AbsoluteTime t10, AbsoluteTime t10,
t11, t11,
t20, t20,
t21; t21;
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return FALSE; /* invalid interval */ PG_RETURN_BOOL(false);
t10 = i1->data[0]; t10 = i1->data[0];
t11 = i1->data[1]; t11 = i1->data[1];
...@@ -1342,7 +1389,7 @@ tintervalge(TimeInterval i1, TimeInterval i2) ...@@ -1342,7 +1389,7 @@ tintervalge(TimeInterval i1, TimeInterval i2)
if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME) if ((t10 == INVALID_ABSTIME) || (t20 == INVALID_ABSTIME)
|| (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME)) || (t20 == INVALID_ABSTIME) || (t21 == INVALID_ABSTIME))
return FALSE; PG_RETURN_BOOL(false);
if (t10 == CURRENT_ABSTIME) if (t10 == CURRENT_ABSTIME)
t10 = GetCurrentTransactionStartTime(); t10 = GetCurrentTransactionStartTime();
...@@ -1353,144 +1400,174 @@ tintervalge(TimeInterval i1, TimeInterval i2) ...@@ -1353,144 +1400,174 @@ tintervalge(TimeInterval i1, TimeInterval i2)
if (t21 == CURRENT_ABSTIME) if (t21 == CURRENT_ABSTIME)
t21 = GetCurrentTransactionStartTime(); t21 = GetCurrentTransactionStartTime();
return (t11 - t10) >= (t21 - t20); PG_RETURN_BOOL((t11 - t10) >= (t21 - t20));
} /* tintervalge() */ }
/* /*
* tintervalleneq - returns 1, iff length of interval i is equal to * tintervalleneq - returns true iff length of interval i is equal to
* reltime t * reltime t
* tintervallenne - returns true iff length of interval i is not equal
* to reltime t
* tintervallenlt - returns true iff length of interval i is less than
* reltime t
* tintervallengt - returns true iff length of interval i is greater
* than reltime t
* tintervallenle - returns true iff length of interval i is less or
* equal than reltime t
* tintervallenge - returns true iff length of interval i is greater or
* equal than reltime t
*/ */
bool Datum
tintervalleneq(TimeInterval i, RelativeTime t) tintervalleneq(PG_FUNCTION_ARGS)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt; RelativeTime rt;
if ((i->status == T_INTERVAL_INVAL) || (t == INVALID_RELTIME)) if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
rt = tintervalrel(i); rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
return rt != INVALID_RELTIME && rt == t; TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt == t);
} }
/* Datum
* tintervallenne - returns 1, iff length of interval i is not equal tintervallenne(PG_FUNCTION_ARGS)
* to reltime t
*/
bool
tintervallenne(TimeInterval i, RelativeTime t)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt; RelativeTime rt;
if ((i->status == T_INTERVAL_INVAL) || (t == INVALID_RELTIME)) if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
rt = tintervalrel(i); rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
return rt != INVALID_RELTIME && rt != t; TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt != t);
} }
/* Datum
* tintervallenlt - returns 1, iff length of interval i is less than tintervallenlt(PG_FUNCTION_ARGS)
* reltime t
*/
bool
tintervallenlt(TimeInterval i, RelativeTime t)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt; RelativeTime rt;
if ((i->status == T_INTERVAL_INVAL) || (t == INVALID_RELTIME)) if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
rt = tintervalrel(i); rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
return rt != INVALID_RELTIME && rt < t; TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt < t);
} }
/* Datum
* tintervallengt - returns 1, iff length of interval i is greater than tintervallengt(PG_FUNCTION_ARGS)
* reltime t
*/
bool
tintervallengt(TimeInterval i, RelativeTime t)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt; RelativeTime rt;
if ((i->status == T_INTERVAL_INVAL) || (t == INVALID_RELTIME)) if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
rt = tintervalrel(i); rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
return rt != INVALID_RELTIME && rt > t; TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt > t);
} }
/* Datum
* tintervallenle - returns 1, iff length of interval i is less or equal tintervallenle(PG_FUNCTION_ARGS)
* than reltime t
*/
bool
tintervallenle(TimeInterval i, RelativeTime t)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt; RelativeTime rt;
if ((i->status == T_INTERVAL_INVAL) || (t == INVALID_RELTIME)) if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
rt = tintervalrel(i); rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
return rt != INVALID_RELTIME && rt <= t; TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt <= t);
} }
/* Datum
* tintervallenge - returns 1, iff length of interval i is greater or tintervallenge(PG_FUNCTION_ARGS)
* equal than reltime t
*/
bool
tintervallenge(TimeInterval i, RelativeTime t)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
RelativeTime t = PG_GETARG_RELATIVETIME(1);
RelativeTime rt; RelativeTime rt;
if ((i->status == T_INTERVAL_INVAL) || (t == INVALID_RELTIME)) if (i->status == T_INTERVAL_INVAL || t == INVALID_RELTIME)
return 0; PG_RETURN_BOOL(false);
rt = tintervalrel(i); rt = DatumGetRelativeTime(DirectFunctionCall1(tintervalrel,
return rt != INVALID_RELTIME && rt >= t; TimeIntervalGetDatum(i)));
PG_RETURN_BOOL(rt != INVALID_RELTIME && rt >= t);
} }
/* /*
* tintervalct - returns 1, iff interval i1 contains interval i2 * tintervalct - returns true iff interval i1 contains interval i2
*/ */
bool Datum
tintervalct(TimeInterval i1, TimeInterval i2) tintervalct(PG_FUNCTION_ARGS)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return 0; PG_RETURN_BOOL(false);
return (abstimele(i1->data[0], i2->data[0]) && if (DatumGetBool(DirectFunctionCall2(abstimele,
abstimege(i1->data[1], i2->data[1])); AbsoluteTimeGetDatum(i1->data[0]),
AbsoluteTimeGetDatum(i2->data[0]))) &&
DatumGetBool(DirectFunctionCall2(abstimege,
AbsoluteTimeGetDatum(i1->data[1]),
AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(true);
PG_RETURN_BOOL(false);
} }
/* /*
* tintervalov - returns 1, iff interval i1 (partially) overlaps i2 * tintervalov - returns true iff interval i1 (partially) overlaps i2
*/ */
bool Datum
tintervalov(TimeInterval i1, TimeInterval i2) tintervalov(PG_FUNCTION_ARGS)
{ {
TimeInterval i1 = PG_GETARG_TIMEINTERVAL(0);
TimeInterval i2 = PG_GETARG_TIMEINTERVAL(1);
if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL) if (i1->status == T_INTERVAL_INVAL || i2->status == T_INTERVAL_INVAL)
return 0; PG_RETURN_BOOL(false);
return (!(abstimelt(i1->data[1], i2->data[0]) || if (DatumGetBool(DirectFunctionCall2(abstimelt,
abstimegt(i1->data[0], i2->data[1]))); AbsoluteTimeGetDatum(i1->data[1]),
AbsoluteTimeGetDatum(i2->data[0]))) ||
DatumGetBool(DirectFunctionCall2(abstimegt,
AbsoluteTimeGetDatum(i1->data[0]),
AbsoluteTimeGetDatum(i2->data[1]))))
PG_RETURN_BOOL(false);
PG_RETURN_BOOL(true);
} }
/* /*
* tintervalstart - returns the start of interval i * tintervalstart - returns the start of interval i
*/ */
AbsoluteTime Datum
tintervalstart(TimeInterval i) tintervalstart(PG_FUNCTION_ARGS)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
if (i->status == T_INTERVAL_INVAL) if (i->status == T_INTERVAL_INVAL)
return INVALID_ABSTIME; PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
return i->data[0]; PG_RETURN_ABSOLUTETIME(i->data[0]);
} }
/* /*
* tintervalend - returns the end of interval i * tintervalend - returns the end of interval i
*/ */
AbsoluteTime Datum
tintervalend(TimeInterval i) tintervalend(PG_FUNCTION_ARGS)
{ {
TimeInterval i = PG_GETARG_TIMEINTERVAL(0);
if (i->status == T_INTERVAL_INVAL) if (i->status == T_INTERVAL_INVAL)
return INVALID_ABSTIME; PG_RETURN_ABSOLUTETIME(INVALID_ABSTIME);
return i->data[1]; PG_RETURN_ABSOLUTETIME(i->data[1]);
} }
...@@ -1778,7 +1855,8 @@ istinterval(char *i_string, ...@@ -1778,7 +1855,8 @@ istinterval(char *i_string,
p1++; p1++;
} }
/* get the first date */ /* get the first date */
*i_start = nabstimein(p); /* first absolute date */ *i_start = DatumGetAbsoluteTime(DirectFunctionCall1(nabstimein,
CStringGetDatum(p)));
/* rechange NULL at the end of the first date to a "'" */ /* rechange NULL at the end of the first date to a "'" */
*p1 = '"'; *p1 = '"';
p = ++p1; p = ++p1;
...@@ -1805,7 +1883,8 @@ istinterval(char *i_string, ...@@ -1805,7 +1883,8 @@ istinterval(char *i_string,
p1++; p1++;
} }
/* get the second date */ /* get the second date */
*i_end = nabstimein(p); /* second absolute date */ *i_end = DatumGetAbsoluteTime(DirectFunctionCall1(nabstimein,
CStringGetDatum(p)));
/* rechange NULL at the end of the first date to a ''' */ /* rechange NULL at the end of the first date to a ''' */
*p1 = '"'; *p1 = '"';
p = ++p1; p = ++p1;
...@@ -1832,10 +1911,13 @@ istinterval(char *i_string, ...@@ -1832,10 +1911,13 @@ istinterval(char *i_string,
* *
*****************************************************************************/ *****************************************************************************/
int32 /* RelativeTime */ Datum
int4reltime(int32 timevalue) int4reltime(PG_FUNCTION_ARGS)
{ {
return timevalue; int32 timevalue = PG_GETARG_INT32(0);
/* Just coerce it directly to RelativeTime ... */
PG_RETURN_RELATIVETIME((RelativeTime) timevalue);
} }
/* /*
...@@ -1845,25 +1927,24 @@ int4reltime(int32 timevalue) ...@@ -1845,25 +1927,24 @@ int4reltime(int32 timevalue)
* the Wisconsin benchmark with Illustra whose TimeNow() shows current * the Wisconsin benchmark with Illustra whose TimeNow() shows current
* time with precision up to microsecs.) - ay 3/95 * time with precision up to microsecs.) - ay 3/95
*/ */
text * Datum
timeofday(void) timeofday(PG_FUNCTION_ARGS)
{ {
struct timeval tp; struct timeval tp;
struct timezone tpz; struct timezone tpz;
char templ[500]; char templ[500];
char buf[500]; char buf[500];
text *tm; text *result;
int len = 0; int len = 0;
gettimeofday(&tp, &tpz); gettimeofday(&tp, &tpz);
strftime(templ, sizeof(templ), "%a %b %d %H:%M:%S.%%d %Y %Z", strftime(templ, sizeof(templ), "%a %b %d %H:%M:%S.%%d %Y %Z",
localtime((time_t *) &tp.tv_sec)); localtime((time_t *) &tp.tv_sec));
sprintf(buf, templ, tp.tv_usec); snprintf(buf, sizeof(buf), templ, tp.tv_usec);
len = VARHDRSZ + strlen(buf); len = VARHDRSZ + strlen(buf);
tm = (text *) palloc(len); result = (text *) palloc(len);
VARSIZE(tm) = len; VARSIZE(result) = len;
strncpy(VARDATA(tm), buf, strlen(buf)); memcpy(VARDATA(result), buf, strlen(buf));
return tm; PG_RETURN_TEXT_P(result);
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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); ...@@ -34,23 +34,28 @@ static int my_varattno(Relation rd, char *a);
* *
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
bool Datum
int4notin(int32 not_in_arg, char *relation_and_attr) 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; Relation relation_to_scan;
int32 integer_value; int32 integer_value;
HeapTuple current_tuple; HeapTuple current_tuple;
HeapScanDesc scan_descriptor; HeapScanDesc scan_descriptor;
bool dummy, bool isNull,
retval; retval;
int attrid; int attrid,
strlength;
char *relation, char *relation,
*attribute; *attribute;
char my_copy[NAMEDATALEN * 2 + 2]; char my_copy[NAMEDATALEN * 2 + 2];
Datum value; Datum value;
strncpy(my_copy, relation_and_attr, sizeof(my_copy)); strlength = VARSIZE(relation_and_attr) - VARHDRSZ + 1;
my_copy[sizeof(my_copy) - 1] = '\0'; if (strlength > sizeof(my_copy))
strlength = sizeof(my_copy);
StrNCpy(my_copy, VARDATA(relation_and_attr), strlength);
relation = (char *) strtok(my_copy, "."); relation = (char *) strtok(my_copy, ".");
attribute = (char *) strtok(NULL, "."); attribute = (char *) strtok(NULL, ".");
...@@ -81,7 +86,9 @@ int4notin(int32 not_in_arg, char *relation_and_attr) ...@@ -81,7 +86,9 @@ int4notin(int32 not_in_arg, char *relation_and_attr)
value = heap_getattr(current_tuple, value = heap_getattr(current_tuple,
(AttrNumber) attrid, (AttrNumber) attrid,
RelationGetDescr(relation_to_scan), RelationGetDescr(relation_to_scan),
&dummy); &isNull);
if (isNull)
continue;
integer_value = DatumGetInt32(value); integer_value = DatumGetInt32(value);
if (not_in_arg == integer_value) if (not_in_arg == integer_value)
{ {
...@@ -94,15 +101,21 @@ int4notin(int32 not_in_arg, char *relation_and_attr) ...@@ -94,15 +101,21 @@ int4notin(int32 not_in_arg, char *relation_and_attr)
heap_endscan(scan_descriptor); heap_endscan(scan_descriptor);
heap_close(relation_to_scan, AccessShareLock); heap_close(relation_to_scan, AccessShareLock);
return retval; PG_RETURN_BOOL(retval);
} }
bool Datum
oidnotin(Oid the_oid, char *compare) 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) if (the_oid == InvalidOid)
return false; PG_RETURN_BOOL(false);
return int4notin(the_oid, compare); /* XXX assume oid maps to int4 */
return int4notin(fcinfo);
} }
/* /*
...@@ -117,7 +130,7 @@ my_varattno(Relation rd, char *a) ...@@ -117,7 +130,7 @@ my_varattno(Relation rd, char *a)
for (i = 0; i < rd->rd_rel->relnatts; i++) 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 i + 1;
} }
return -1; return -1;
......
...@@ -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.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. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -319,9 +319,10 @@ pg_get_viewdef(NameData *rname) ...@@ -319,9 +319,10 @@ pg_get_viewdef(NameData *rname)
* get_indexdef - Get the definition of an index * get_indexdef - Get the definition of an index
* ---------- * ----------
*/ */
text * Datum
pg_get_indexdef(Oid indexrelid) pg_get_indexdef(PG_FUNCTION_ARGS)
{ {
Oid indexrelid = PG_GETARG_OID(0);
text *indexdef; text *indexdef;
HeapTuple ht_idx; HeapTuple ht_idx;
HeapTuple ht_idxrel; HeapTuple ht_idxrel;
...@@ -541,7 +542,7 @@ pg_get_indexdef(Oid indexrelid) ...@@ -541,7 +542,7 @@ pg_get_indexdef(Oid indexrelid)
if (SPI_finish() != SPI_OK_FINISH) if (SPI_finish() != SPI_OK_FINISH)
elog(ERROR, "get_viewdef: SPI_finish() failed"); elog(ERROR, "get_viewdef: SPI_finish() failed");
return indexdef; PG_RETURN_TEXT_P(indexdef);
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -1038,14 +1038,16 @@ convert_timevalue_to_scalar(Datum value, Oid typid)
switch (typid) switch (typid)
{ {
case TIMESTAMPOID: case TIMESTAMPOID:
return *((Timestamp *) DatumGetPointer(value)); return DatumGetTimestamp(value);
case ABSTIMEOID: case ABSTIMEOID:
return *abstime_timestamp(value); return DatumGetTimestamp(DirectFunctionCall1(abstime_timestamp,
value));
case DATEOID: case DATEOID:
return *date_timestamp(value); return DatumGetTimestamp(DirectFunctionCall1(date_timestamp,
value));
case INTERVALOID: case INTERVALOID:
{ {
Interval *interval = (Interval *) DatumGetPointer(value); Interval *interval = DatumGetIntervalP(value);
/* /*
* Convert the month part of Interval to days using * Convert the month part of Interval to days using
...@@ -1056,17 +1058,17 @@ convert_timevalue_to_scalar(Datum value, Oid typid) ...@@ -1056,17 +1058,17 @@ convert_timevalue_to_scalar(Datum value, Oid typid)
interval->month * (365.25 / 12.0 * 24.0 * 60.0 * 60.0); interval->month * (365.25 / 12.0 * 24.0 * 60.0 * 60.0);
} }
case RELTIMEOID: case RELTIMEOID:
return (RelativeTime) DatumGetInt32(value); return DatumGetRelativeTime(value);
case TINTERVALOID: case TINTERVALOID:
{ {
TimeInterval interval = (TimeInterval) DatumGetPointer(value); TimeInterval interval = DatumGetTimeInterval(value);
if (interval->status != 0) if (interval->status != 0)
return interval->data[1] - interval->data[0]; return interval->data[1] - interval->data[0];
return 0; /* for lack of a better idea */ return 0; /* for lack of a better idea */
} }
case TIMEOID: case TIMEOID:
return *((TimeADT *) DatumGetPointer(value)); return DatumGetTimeADT(value);
} }
/* Can't get here unless someone tries to use scalarltsel/scalargtsel /* Can't get here unless someone tries to use scalarltsel/scalargtsel
* on an operator with one timevalue and one non-timevalue operand. * on an operator with one timevalue and one non-timevalue operand.
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -140,8 +140,12 @@ SetDefine(char *querystr, char *typename)
* never executed. At runtime, the OID of the actual set is substituted * never executed. At runtime, the OID of the actual set is substituted
* into the :funcid. * into the :funcid.
*/ */
int Datum
seteval(Oid funcoid) 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 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* input routine largely stolen from boxin(). * input routine largely stolen from boxin().
...@@ -160,19 +160,21 @@ text_tid(const text *string) ...@@ -160,19 +160,21 @@ text_tid(const text *string)
/* /*
* Functions to get latest tid of a specified tuple. * Functions to get latest tid of a specified tuple.
* Maybe these implementations is moved *
* to another place * Maybe these implementations should be moved to another place
*/ */
ItemPointer Datum
currtid_byreloid(Oid reloid, ItemPointer tid) currtid_byreloid(PG_FUNCTION_ARGS)
{ {
ItemPointer result = NULL, Oid reloid = PG_GETARG_OID(0);
ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
ItemPointer result,
ret; ret;
Relation rel; Relation rel;
result = (ItemPointer) palloc(sizeof(ItemPointerData)); result = (ItemPointer) palloc(sizeof(ItemPointerData));
ItemPointerSetInvalid(result); ItemPointerSetInvalid(result);
if (rel = heap_open(reloid, AccessShareLock), rel) if ((rel = heap_open(reloid, AccessShareLock)) != NULL)
{ {
ret = heap_get_latest_tid(rel, SnapshotNow, tid); ret = heap_get_latest_tid(rel, SnapshotNow, tid);
if (ret) if (ret)
...@@ -182,25 +184,24 @@ currtid_byreloid(Oid reloid, ItemPointer tid) ...@@ -182,25 +184,24 @@ currtid_byreloid(Oid reloid, ItemPointer tid)
else else
elog(ERROR, "Relation %u not found", reloid); elog(ERROR, "Relation %u not found", reloid);
return result; PG_RETURN_POINTER(result);
} /* currtid_byreloid() */ }
ItemPointer Datum
currtid_byrelname(const text *relname, ItemPointer tid) currtid_byrelname(PG_FUNCTION_ARGS)
{ {
ItemPointer result = NULL, text *relname = PG_GETARG_TEXT_P(0);
ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
ItemPointer result,
ret; ret;
char *str; char *str;
Relation rel; Relation rel;
if (!relname) str = textout(relname);
return result;
str = textout((text *) relname);
result = (ItemPointer) palloc(sizeof(ItemPointerData)); result = (ItemPointer) palloc(sizeof(ItemPointerData));
ItemPointerSetInvalid(result); ItemPointerSetInvalid(result);
if (rel = heap_openr(str, AccessShareLock), rel) if ((rel = heap_openr(str, AccessShareLock)) != NULL)
{ {
ret = heap_get_latest_tid(rel, SnapshotNow, tid); ret = heap_get_latest_tid(rel, SnapshotNow, tid);
if (ret) if (ret)
...@@ -208,8 +209,9 @@ currtid_byrelname(const text *relname, ItemPointer tid) ...@@ -208,8 +209,9 @@ currtid_byrelname(const text *relname, ItemPointer tid)
heap_close(rel, AccessShareLock); heap_close(rel, AccessShareLock);
} }
else else
elog(ERROR, "Relation %s not found", textout((text *) relname)); elog(ERROR, "Relation %s not found", str);
pfree(str); pfree(str);
return result; PG_RETURN_POINTER(result);
} /* currtid_byrelname() */ }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.28 2000/06/08 22:37:28 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.29 2000/06/09 01:11:09 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -49,11 +49,11 @@ static int tm2interval(struct tm * tm, double fsec, Interval *span); ...@@ -49,11 +49,11 @@ static int tm2interval(struct tm * tm, double fsec, Interval *span);
/* timestamp_in() /* timestamp_in()
* Convert a string to internal form. * Convert a string to internal form.
*/ */
Timestamp * Datum
timestamp_in(char *str) timestamp_in(PG_FUNCTION_ARGS)
{ {
Timestamp *result; char *str = PG_GETARG_CSTRING(0);
Timestamp result;
double fsec; double fsec;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -64,55 +64,52 @@ timestamp_in(char *str) ...@@ -64,55 +64,52 @@ timestamp_in(char *str)
int ftype[MAXDATEFIELDS]; int ftype[MAXDATEFIELDS];
char lowstr[MAXDATELEN + 1]; char lowstr[MAXDATELEN + 1];
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) timestamp external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0) if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz) != 0)) || (DecodeDateTime(field, ftype, nf, &dtype, tm, &fsec, &tz) != 0))
elog(ERROR, "Bad timestamp external representation '%s'", str); elog(ERROR, "Bad timestamp external representation '%s'", str);
result = palloc(sizeof(Timestamp));
switch (dtype) switch (dtype)
{ {
case DTK_DATE: case DTK_DATE:
if (tm2timestamp(tm, fsec, &tz, result) != 0) if (tm2timestamp(tm, fsec, &tz, &result) != 0)
elog(ERROR, "Timestamp out of range '%s'", str); elog(ERROR, "Timestamp out of range '%s'", str);
break; break;
case DTK_EPOCH: case DTK_EPOCH:
TIMESTAMP_EPOCH(*result); TIMESTAMP_EPOCH(result);
break; break;
case DTK_CURRENT: case DTK_CURRENT:
TIMESTAMP_CURRENT(*result); TIMESTAMP_CURRENT(result);
break; break;
case DTK_LATE: case DTK_LATE:
TIMESTAMP_NOEND(*result); TIMESTAMP_NOEND(result);
break; break;
case DTK_EARLY: case DTK_EARLY:
TIMESTAMP_NOBEGIN(*result); TIMESTAMP_NOBEGIN(result);
break; break;
case DTK_INVALID: case DTK_INVALID:
TIMESTAMP_INVALID(*result); TIMESTAMP_INVALID(result);
break; break;
default: default:
elog(ERROR, "Internal coding error, can't input timestamp '%s'", str); elog(ERROR, "Internal coding error, can't input timestamp '%s'", str);
TIMESTAMP_INVALID(result); /* keep compiler quiet */
} }
return result; PG_RETURN_TIMESTAMP(result);
} /* timestamp_in() */ }
/* timestamp_out() /* timestamp_out()
* Convert a timestamp to external form. * Convert a timestamp to external form.
*/ */
char * Datum
timestamp_out(Timestamp *dt) timestamp_out(PG_FUNCTION_ARGS)
{ {
Timestamp dt = PG_GETARG_TIMESTAMP(0);
char *result; char *result;
int tz; int tz;
struct tm tt, struct tm tt,
...@@ -121,22 +118,16 @@ timestamp_out(Timestamp *dt) ...@@ -121,22 +118,16 @@ timestamp_out(Timestamp *dt)
char *tzn; char *tzn;
char buf[MAXDATELEN + 1]; char buf[MAXDATELEN + 1];
if (!PointerIsValid(dt)) if (TIMESTAMP_IS_RESERVED(dt))
return NULL; EncodeSpecialTimestamp(dt, buf);
else if (timestamp2tm(dt, &tz, tm, &fsec, &tzn) == 0)
if (TIMESTAMP_IS_RESERVED(*dt))
EncodeSpecialTimestamp(*dt, buf);
else if (timestamp2tm(*dt, &tz, tm, &fsec, &tzn) == 0)
EncodeDateTime(tm, fsec, &tz, &tzn, DateStyle, buf); EncodeDateTime(tm, fsec, &tz, &tzn, DateStyle, buf);
else else
EncodeSpecialTimestamp(DT_INVALID, buf); EncodeSpecialTimestamp(DT_INVALID, buf);
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
PG_RETURN_CSTRING(result);
strcpy(result, buf); }
return result;
} /* timestamp_out() */
/* interval_in() /* interval_in()
...@@ -145,11 +136,11 @@ timestamp_out(Timestamp *dt) ...@@ -145,11 +136,11 @@ timestamp_out(Timestamp *dt)
* External format(s): * External format(s):
* Uses the generic date/time parsing and decoding routines. * Uses the generic date/time parsing and decoding routines.
*/ */
Interval * Datum
interval_in(char *str) interval_in(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0);
Interval *span; Interval *span;
double fsec; double fsec;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
...@@ -167,14 +158,11 @@ interval_in(char *str) ...@@ -167,14 +158,11 @@ interval_in(char *str)
tm->tm_sec = 0; tm->tm_sec = 0;
fsec = 0; fsec = 0;
if (!PointerIsValid(str))
elog(ERROR, "Bad (null) interval external representation");
if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0) if ((ParseDateTime(str, lowstr, field, ftype, MAXDATEFIELDS, &nf) != 0)
|| (DecodeDateDelta(field, ftype, nf, &dtype, tm, &fsec) != 0)) || (DecodeDateDelta(field, ftype, nf, &dtype, tm, &fsec) != 0))
elog(ERROR, "Bad interval external representation '%s'", str); elog(ERROR, "Bad interval external representation '%s'", str);
span = palloc(sizeof(Interval)); span = (Interval *) palloc(sizeof(Interval));
switch (dtype) switch (dtype)
{ {
...@@ -192,36 +180,31 @@ interval_in(char *str) ...@@ -192,36 +180,31 @@ interval_in(char *str)
elog(ERROR, "Internal coding error, can't input interval '%s'", str); elog(ERROR, "Internal coding error, can't input interval '%s'", str);
} }
return span; PG_RETURN_INTERVAL_P(span);
} /* interval_in() */ }
/* interval_out() /* interval_out()
* Convert a time span to external form. * Convert a time span to external form.
*/ */
char * Datum
interval_out(Interval *span) interval_out(PG_FUNCTION_ARGS)
{ {
Interval *span = PG_GETARG_INTERVAL_P(0);
char *result; char *result;
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
double fsec; double fsec;
char buf[MAXDATELEN + 1]; char buf[MAXDATELEN + 1];
if (!PointerIsValid(span))
return NULL;
if (interval2tm(*span, tm, &fsec) != 0) if (interval2tm(*span, tm, &fsec) != 0)
return NULL; PG_RETURN_NULL();
if (EncodeTimeSpan(tm, fsec, DateStyle, buf) != 0) if (EncodeTimeSpan(tm, fsec, DateStyle, buf) != 0)
elog(ERROR, "Unable to format interval"); elog(ERROR, "Unable to format interval");
result = palloc(strlen(buf) + 1); result = pstrdup(buf);
PG_RETURN_CSTRING(result);
strcpy(result, buf); }
return result;
} /* interval_out() */
/* EncodeSpecialTimestamp() /* EncodeSpecialTimestamp()
...@@ -250,19 +233,17 @@ EncodeSpecialTimestamp(Timestamp dt, char *str) ...@@ -250,19 +233,17 @@ EncodeSpecialTimestamp(Timestamp dt, char *str)
return FALSE; return FALSE;
} /* EncodeSpecialTimestamp() */ } /* EncodeSpecialTimestamp() */
Timestamp * Datum
now(void) now(PG_FUNCTION_ARGS)
{ {
Timestamp *result; Timestamp result;
AbsoluteTime sec; AbsoluteTime sec;
result = palloc(sizeof(Timestamp));
sec = GetCurrentTransactionStartTime(); sec = GetCurrentTransactionStartTime();
*result = (sec - ((date2j(2000, 1, 1) - date2j(1970, 1, 1)) * 86400)); result = (sec - ((date2j(2000, 1, 1) - date2j(1970, 1, 1)) * 86400));
return result; PG_RETURN_TIMESTAMP(result);
} }
static void static void
...@@ -498,23 +479,21 @@ dt2local(Timestamp dt, int tz) ...@@ -498,23 +479,21 @@ dt2local(Timestamp dt, int tz)
*****************************************************************************/ *****************************************************************************/
bool Datum
timestamp_finite(Timestamp *timestamp) timestamp_finite(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(timestamp)) Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
return FALSE;
return !TIMESTAMP_NOT_FINITE(*timestamp); PG_RETURN_BOOL(! TIMESTAMP_NOT_FINITE(timestamp));
} /* timestamp_finite() */ }
bool Datum
interval_finite(Interval *interval) interval_finite(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(interval)) Interval *interval = PG_GETARG_INTERVAL_P(0);
return FALSE;
return !INTERVAL_NOT_FINITE(*interval); PG_RETURN_BOOL(! INTERVAL_NOT_FINITE(*interval));
} /* interval_finite() */ }
/*---------------------------------------------------------- /*----------------------------------------------------------
...@@ -563,171 +542,128 @@ SetTimestamp(Timestamp dt) ...@@ -563,171 +542,128 @@ SetTimestamp(Timestamp dt)
return dt; return dt;
} /* SetTimestamp() */ } /* SetTimestamp() */
/* timestamp_relop - is timestamp1 relop timestamp2 /*
* timestamp_relop - is timestamp1 relop timestamp2
*/ */
bool Datum
timestamp_eq(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_eq(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return FALSE;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2)) if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2))
return FALSE; PG_RETURN_BOOL(false);
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
if (TIMESTAMP_IS_RELATIVE(dt2)) if (TIMESTAMP_IS_RELATIVE(dt2))
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
return dt1 == dt2; PG_RETURN_BOOL(dt1 == dt2);
} /* timestamp_eq() */ }
bool Datum
timestamp_ne(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_ne(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return FALSE;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2)) if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2))
return FALSE; PG_RETURN_BOOL(false);
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
if (TIMESTAMP_IS_RELATIVE(dt2)) if (TIMESTAMP_IS_RELATIVE(dt2))
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
return dt1 != dt2; PG_RETURN_BOOL(dt1 != dt2);
} /* timestamp_ne() */ }
bool Datum
timestamp_lt(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_lt(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return FALSE;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2)) if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2))
return FALSE; PG_RETURN_BOOL(false);
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
if (TIMESTAMP_IS_RELATIVE(dt2)) if (TIMESTAMP_IS_RELATIVE(dt2))
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
return dt1 < dt2; PG_RETURN_BOOL(dt1 < dt2);
} /* timestamp_lt() */ }
bool Datum
timestamp_gt(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_gt(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return FALSE;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2)) if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2))
return FALSE; PG_RETURN_BOOL(false);
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
if (TIMESTAMP_IS_RELATIVE(dt2)) if (TIMESTAMP_IS_RELATIVE(dt2))
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
return dt1 > dt2; PG_RETURN_BOOL(dt1 > dt2);
} /* timestamp_gt() */ }
bool Datum
timestamp_le(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_le(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return FALSE;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2)) if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2))
return FALSE; PG_RETURN_BOOL(false);
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
if (TIMESTAMP_IS_RELATIVE(dt2)) if (TIMESTAMP_IS_RELATIVE(dt2))
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
return dt1 <= dt2; PG_RETURN_BOOL(dt1 <= dt2);
} /* timestamp_le() */ }
bool Datum
timestamp_ge(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_ge(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return FALSE;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2)) if (TIMESTAMP_IS_INVALID(dt1) || TIMESTAMP_IS_INVALID(dt2))
return FALSE; PG_RETURN_BOOL(false);
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
if (TIMESTAMP_IS_RELATIVE(dt2)) if (TIMESTAMP_IS_RELATIVE(dt2))
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
return dt1 >= dt2; PG_RETURN_BOOL(dt1 >= dt2);
} /* timestamp_ge() */ }
/* timestamp_cmp - 3-state comparison for timestamp /* timestamp_cmp - 3-state comparison for timestamp
* collate invalid timestamp at the end * collate invalid timestamp at the end
*/ */
int Datum
timestamp_cmp(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_cmp(PG_FUNCTION_ARGS)
{ {
Timestamp dt1, Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
dt2; Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return 0;
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_INVALID(dt1)) if (TIMESTAMP_IS_INVALID(dt1))
{ {
return (TIMESTAMP_IS_INVALID(dt2) ? 0 : 1); PG_RETURN_INT32(TIMESTAMP_IS_INVALID(dt2) ? 0 : 1);
} }
else if (TIMESTAMP_IS_INVALID(dt2)) else if (TIMESTAMP_IS_INVALID(dt2))
{ {
return -1; PG_RETURN_INT32(-1);
} }
else else
{ {
...@@ -737,49 +673,49 @@ timestamp_cmp(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -737,49 +673,49 @@ timestamp_cmp(Timestamp *timestamp1, Timestamp *timestamp2)
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
} }
return ((dt1 < dt2) ? -1 : ((dt1 > dt2) ? 1 : 0)); PG_RETURN_INT32((dt1 < dt2) ? -1 : ((dt1 > dt2) ? 1 : 0));
} /* timestamp_cmp() */ }
/* interval_relop - is interval1 relop interval2 /*
* interval_relop - is interval1 relop interval2
*/ */
bool Datum
interval_eq(Interval *interval1, Interval *interval2) interval_eq(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(interval1) || !PointerIsValid(interval2)) Interval *interval1 = PG_GETARG_INTERVAL_P(0);
return FALSE; Interval *interval2 = PG_GETARG_INTERVAL_P(1);
if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2)) if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2))
return FALSE; PG_RETURN_BOOL(false);
return ((interval1->time == interval2->time) PG_RETURN_BOOL((interval1->time == interval2->time) &&
&& (interval1->month == interval2->month)); (interval1->month == interval2->month));
} /* interval_eq() */ }
bool Datum
interval_ne(Interval *interval1, Interval *interval2) interval_ne(PG_FUNCTION_ARGS)
{ {
if (!PointerIsValid(interval1) || !PointerIsValid(interval2)) Interval *interval1 = PG_GETARG_INTERVAL_P(0);
return FALSE; Interval *interval2 = PG_GETARG_INTERVAL_P(1);
if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2)) if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2))
return FALSE; PG_RETURN_BOOL(false);
return ((interval1->time != interval2->time) PG_RETURN_BOOL((interval1->time != interval2->time) ||
|| (interval1->month != interval2->month)); (interval1->month != interval2->month));
} /* interval_ne() */ }
bool Datum
interval_lt(Interval *interval1, Interval *interval2) interval_lt(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2))
return FALSE;
if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2)) if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2))
return FALSE; PG_RETURN_BOOL(false);
span1 = interval1->time; span1 = interval1->time;
if (interval1->month != 0) if (interval1->month != 0)
...@@ -788,20 +724,19 @@ interval_lt(Interval *interval1, Interval *interval2) ...@@ -788,20 +724,19 @@ interval_lt(Interval *interval1, Interval *interval2)
if (interval2->month != 0) if (interval2->month != 0)
span2 += (interval2->month * (30.0 * 86400)); span2 += (interval2->month * (30.0 * 86400));
return span1 < span2; PG_RETURN_BOOL(span1 < span2);
} /* interval_lt() */ }
bool Datum
interval_gt(Interval *interval1, Interval *interval2) interval_gt(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2))
return FALSE;
if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2)) if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2))
return FALSE; PG_RETURN_BOOL(false);
span1 = interval1->time; span1 = interval1->time;
if (interval1->month != 0) if (interval1->month != 0)
...@@ -810,20 +745,19 @@ interval_gt(Interval *interval1, Interval *interval2) ...@@ -810,20 +745,19 @@ interval_gt(Interval *interval1, Interval *interval2)
if (interval2->month != 0) if (interval2->month != 0)
span2 += (interval2->month * (30.0 * 86400)); span2 += (interval2->month * (30.0 * 86400));
return span1 > span2; PG_RETURN_BOOL(span1 > span2);
} /* interval_gt() */ }
bool Datum
interval_le(Interval *interval1, Interval *interval2) interval_le(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2))
return FALSE;
if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2)) if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2))
return FALSE; PG_RETURN_BOOL(false);
span1 = interval1->time; span1 = interval1->time;
if (interval1->month != 0) if (interval1->month != 0)
...@@ -832,20 +766,19 @@ interval_le(Interval *interval1, Interval *interval2) ...@@ -832,20 +766,19 @@ interval_le(Interval *interval1, Interval *interval2)
if (interval2->month != 0) if (interval2->month != 0)
span2 += (interval2->month * (30.0 * 86400)); span2 += (interval2->month * (30.0 * 86400));
return span1 <= span2; PG_RETURN_BOOL(span1 <= span2);
} /* interval_le() */ }
bool Datum
interval_ge(Interval *interval1, Interval *interval2) interval_ge(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2))
return FALSE;
if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2)) if (INTERVAL_IS_INVALID(*interval1) || INTERVAL_IS_INVALID(*interval2))
return FALSE; PG_RETURN_BOOL(false);
span1 = interval1->time; span1 = interval1->time;
if (interval1->month != 0) if (interval1->month != 0)
...@@ -854,28 +787,24 @@ interval_ge(Interval *interval1, Interval *interval2) ...@@ -854,28 +787,24 @@ interval_ge(Interval *interval1, Interval *interval2)
if (interval2->month != 0) if (interval2->month != 0)
span2 += (interval2->month * (30.0 * 86400)); span2 += (interval2->month * (30.0 * 86400));
return span1 >= span2; PG_RETURN_BOOL(span1 >= span2);
} /* interval_ge() */ }
/* interval_cmp - 3-state comparison for interval /* interval_cmp - 3-state comparison for interval
*/ */
int Datum
interval_cmp(Interval *interval1, Interval *interval2) interval_cmp(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2))
return 0;
if (INTERVAL_IS_INVALID(*interval1)) if (INTERVAL_IS_INVALID(*interval1))
{ PG_RETURN_INT32(INTERVAL_IS_INVALID(*interval2) ? 0 : 1);
return INTERVAL_IS_INVALID(*interval2) ? 0 : 1;
}
else if (INTERVAL_IS_INVALID(*interval2)) else if (INTERVAL_IS_INVALID(*interval2))
return -1; PG_RETURN_INT32(-1);
span1 = interval1->time; span1 = interval1->time;
if (interval1->month != 0) if (interval1->month != 0)
...@@ -884,36 +813,57 @@ interval_cmp(Interval *interval1, Interval *interval2) ...@@ -884,36 +813,57 @@ interval_cmp(Interval *interval1, Interval *interval2)
if (interval2->month != 0) if (interval2->month != 0)
span2 += (interval2->month * (30.0 * 86400)); span2 += (interval2->month * (30.0 * 86400));
return (span1 < span2) ? -1 : (span1 > span2) ? 1 : 0; PG_RETURN_INT32((span1 < span2) ? -1 : (span1 > span2) ? 1 : 0);
} /* interval_cmp() */ }
/* overlaps_timestamp() /* overlaps_timestamp()
* Implements the SQL92 OVERLAPS operator. * Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997 * Algorithm from Date and Darwen, 1997
*/ */
bool Datum
overlaps_timestamp(Timestamp *ts1, Timestamp *te1, Timestamp *ts2, Timestamp *te2) overlaps_timestamp(PG_FUNCTION_ARGS)
{ {
/* The arguments are Timestamps, but we leave them as generic Datums
* to avoid unnecessary conversions between value and reference forms...
*/
Datum ts1 = PG_GETARG_DATUM(0);
Datum te1 = PG_GETARG_DATUM(1);
Datum ts2 = PG_GETARG_DATUM(2);
Datum te2 = PG_GETARG_DATUM(3);
#define TIMESTAMP_GT(t1,t2) \
DatumGetBool(DirectFunctionCall2(timestamp_gt,t1,t2))
#define TIMESTAMP_LT(t1,t2) \
DatumGetBool(DirectFunctionCall2(timestamp_lt,t1,t2))
#define TIMESTAMP_EQ(t1,t2) \
DatumGetBool(DirectFunctionCall2(timestamp_eq,t1,t2))
/* Make sure we have ordered pairs... */ /* Make sure we have ordered pairs... */
if (timestamp_gt(ts1, te1)) if (TIMESTAMP_GT(ts1, te1))
{ {
Timestamp *tt = ts1; Datum tt = ts1;
ts1 = te1; ts1 = te1;
te1 = tt; te1 = tt;
} }
if (timestamp_gt(ts2, te2)) if (TIMESTAMP_GT(ts2, te2))
{ {
Timestamp *tt = ts2; Datum tt = ts2;
ts2 = te2; ts2 = te2;
te2 = tt; te2 = tt;
} }
return ((timestamp_gt(ts1, ts2) && (timestamp_lt(ts1, te2) || timestamp_lt(te1, te2))) PG_RETURN_BOOL((TIMESTAMP_GT(ts1, ts2) &&
|| (timestamp_gt(ts2, ts1) && (timestamp_lt(ts2, te1) || timestamp_lt(te2, te1))) (TIMESTAMP_LT(ts1, te2) || TIMESTAMP_LT(te1, te2))) ||
|| timestamp_eq(ts1, ts2)); (TIMESTAMP_GT(ts2, ts1) &&
} /* overlaps_timestamp() */ (TIMESTAMP_LT(ts2, te1) || TIMESTAMP_LT(te2, te1))) ||
TIMESTAMP_EQ(ts1, ts2));
#undef TIMESTAMP_GT
#undef TIMESTAMP_LT
#undef TIMESTAMP_EQ
}
/*---------------------------------------------------------- /*----------------------------------------------------------
...@@ -924,21 +874,12 @@ overlaps_timestamp(Timestamp *ts1, Timestamp *te1, Timestamp *ts2, Timestamp *te ...@@ -924,21 +874,12 @@ overlaps_timestamp(Timestamp *ts1, Timestamp *te1, Timestamp *ts2, Timestamp *te
* actual value. * actual value.
*---------------------------------------------------------*/ *---------------------------------------------------------*/
Timestamp * Datum
timestamp_smaller(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_smaller(PG_FUNCTION_ARGS)
{ {
Timestamp *result; Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
Timestamp dt1, Timestamp result;
dt2;
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return NULL;
dt1 = *timestamp1;
dt2 = *timestamp2;
result = palloc(sizeof(Timestamp));
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
...@@ -946,30 +887,21 @@ timestamp_smaller(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -946,30 +887,21 @@ timestamp_smaller(Timestamp *timestamp1, Timestamp *timestamp2)
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
if (TIMESTAMP_IS_INVALID(dt1)) if (TIMESTAMP_IS_INVALID(dt1))
*result = dt2; result = dt2;
else if (TIMESTAMP_IS_INVALID(dt2)) else if (TIMESTAMP_IS_INVALID(dt2))
*result = dt1; result = dt1;
else else
*result = ((dt2 < dt1) ? dt2 : dt1); result = ((dt2 < dt1) ? dt2 : dt1);
return result; PG_RETURN_TIMESTAMP(result);
} /* timestamp_smaller() */ }
Timestamp * Datum
timestamp_larger(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_larger(PG_FUNCTION_ARGS)
{ {
Timestamp *result; Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
Timestamp dt1, Timestamp result;
dt2;
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return NULL;
dt1 = *timestamp1;
dt2 = *timestamp2;
result = palloc(sizeof(Timestamp));
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
...@@ -977,31 +909,24 @@ timestamp_larger(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -977,31 +909,24 @@ timestamp_larger(Timestamp *timestamp1, Timestamp *timestamp2)
dt2 = SetTimestamp(dt2); dt2 = SetTimestamp(dt2);
if (TIMESTAMP_IS_INVALID(dt1)) if (TIMESTAMP_IS_INVALID(dt1))
*result = dt2; result = dt2;
else if (TIMESTAMP_IS_INVALID(dt2)) else if (TIMESTAMP_IS_INVALID(dt2))
*result = dt1; result = dt1;
else else
*result = ((dt2 > dt1) ? dt2 : dt1); result = ((dt2 > dt1) ? dt2 : dt1);
return result; PG_RETURN_TIMESTAMP(result);
} /* timestamp_larger() */ }
Interval * Datum
timestamp_mi(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_mi(PG_FUNCTION_ARGS)
{ {
Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
Interval *result; Interval *result;
Timestamp dt1, result = (Interval *) palloc(sizeof(Interval));
dt2;
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2))
return NULL;
dt1 = *timestamp1;
dt2 = *timestamp2;
result = palloc(sizeof(Interval));
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
...@@ -1010,16 +935,13 @@ timestamp_mi(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -1010,16 +935,13 @@ timestamp_mi(Timestamp *timestamp1, Timestamp *timestamp2)
if (TIMESTAMP_IS_INVALID(dt1) if (TIMESTAMP_IS_INVALID(dt1)
|| TIMESTAMP_IS_INVALID(dt2)) || TIMESTAMP_IS_INVALID(dt2))
{
TIMESTAMP_INVALID(result->time); TIMESTAMP_INVALID(result->time);
}
else else
result->time = JROUND(dt1 - dt2); result->time = JROUND(dt1 - dt2);
result->month = 0; result->month = 0;
return result; PG_RETURN_INTERVAL_P(result);
} /* timestamp_mi() */ }
/* timestamp_pl_span() /* timestamp_pl_span()
...@@ -1031,32 +953,23 @@ timestamp_mi(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -1031,32 +953,23 @@ timestamp_mi(Timestamp *timestamp1, Timestamp *timestamp2)
* to the last day of month. * to the last day of month.
* Lastly, add in the "quantitative time". * Lastly, add in the "quantitative time".
*/ */
Timestamp * Datum
timestamp_pl_span(Timestamp *timestamp, Interval *span) timestamp_pl_span(PG_FUNCTION_ARGS)
{ {
Timestamp *result; Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
Interval *span = PG_GETARG_INTERVAL_P(1);
Timestamp result;
Timestamp dt; Timestamp dt;
int tz; int tz;
char *tzn; char *tzn;
if ((!PointerIsValid(timestamp)) || (!PointerIsValid(span))) if (TIMESTAMP_NOT_FINITE(timestamp))
return NULL; result = timestamp;
result = palloc(sizeof(Timestamp));
if (TIMESTAMP_NOT_FINITE(*timestamp))
{
*result = *timestamp;
}
else if (INTERVAL_IS_INVALID(*span)) else if (INTERVAL_IS_INVALID(*span))
{ TIMESTAMP_INVALID(result);
TIMESTAMP_INVALID(*result);
}
else else
{ {
dt = (TIMESTAMP_IS_RELATIVE(*timestamp) ? SetTimestamp(*timestamp) : *timestamp); dt = (TIMESTAMP_IS_RELATIVE(timestamp) ? SetTimestamp(timestamp) : timestamp);
if (span->month != 0) if (span->month != 0)
{ {
...@@ -1096,71 +1009,63 @@ timestamp_pl_span(Timestamp *timestamp, Interval *span) ...@@ -1096,71 +1009,63 @@ timestamp_pl_span(Timestamp *timestamp, Interval *span)
dt += span->time; dt += span->time;
#endif #endif
*result = dt; result = dt;
} }
return result; PG_RETURN_TIMESTAMP(result);
} /* timestamp_pl_span() */ }
Timestamp * Datum
timestamp_mi_span(Timestamp *timestamp, Interval *span) timestamp_mi_span(PG_FUNCTION_ARGS)
{ {
Timestamp *result; Timestamp timestamp = PG_GETARG_TIMESTAMP(0);
Interval *span = PG_GETARG_INTERVAL_P(1);
Interval tspan; Interval tspan;
if (!PointerIsValid(timestamp) || !PointerIsValid(span)) tspan.month = - span->month;
return NULL; tspan.time = - span->time;
tspan.month = -span->month;
tspan.time = -span->time;
result = timestamp_pl_span(timestamp, &tspan);
return result; return DirectFunctionCall2(timestamp_pl_span,
} /* timestamp_mi_span() */ TimestampGetDatum(timestamp),
PointerGetDatum(&tspan));
}
Interval * Datum
interval_um(Interval *interval) interval_um(PG_FUNCTION_ARGS)
{ {
Interval *interval = PG_GETARG_INTERVAL_P(0);
Interval *result; Interval *result;
if (!PointerIsValid(interval)) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
result->time = -(interval->time); result->time = -(interval->time);
result->month = -(interval->month); result->month = -(interval->month);
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_um() */ }
Interval * Datum
interval_smaller(Interval *interval1, Interval *interval2) interval_smaller(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
Interval *result; Interval *result;
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2)) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
if (INTERVAL_IS_INVALID(*interval1)) if (INTERVAL_IS_INVALID(*interval1))
{ {
result->time = interval2->time; result->time = interval2->time;
result->month = interval2->month; result->month = interval2->month;
} }
else if (INTERVAL_IS_INVALID(*interval2)) else if (INTERVAL_IS_INVALID(*interval2))
{ {
result->time = interval1->time; result->time = interval1->time;
result->month = interval1->month; result->month = interval1->month;
} }
else else
{ {
...@@ -1175,7 +1080,6 @@ interval_smaller(Interval *interval1, Interval *interval2) ...@@ -1175,7 +1080,6 @@ interval_smaller(Interval *interval1, Interval *interval2)
{ {
result->time = interval2->time; result->time = interval2->time;
result->month = interval2->month; result->month = interval2->month;
} }
else else
{ {
...@@ -1184,33 +1088,29 @@ interval_smaller(Interval *interval1, Interval *interval2) ...@@ -1184,33 +1088,29 @@ interval_smaller(Interval *interval1, Interval *interval2)
} }
} }
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_smaller() */ }
Interval * Datum
interval_larger(Interval *interval1, Interval *interval2) interval_larger(PG_FUNCTION_ARGS)
{ {
Interval *interval1 = PG_GETARG_INTERVAL_P(0);
Interval *interval2 = PG_GETARG_INTERVAL_P(1);
Interval *result; Interval *result;
double span1, double span1,
span2; span2;
if (!PointerIsValid(interval1) || !PointerIsValid(interval2)) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
if (INTERVAL_IS_INVALID(*interval1)) if (INTERVAL_IS_INVALID(*interval1))
{ {
result->time = interval2->time; result->time = interval2->time;
result->month = interval2->month; result->month = interval2->month;
} }
else if (INTERVAL_IS_INVALID(*interval2)) else if (INTERVAL_IS_INVALID(*interval2))
{ {
result->time = interval1->time; result->time = interval1->time;
result->month = interval1->month; result->month = interval1->month;
} }
else else
{ {
...@@ -1225,7 +1125,6 @@ interval_larger(Interval *interval1, Interval *interval2) ...@@ -1225,7 +1125,6 @@ interval_larger(Interval *interval1, Interval *interval2)
{ {
result->time = interval2->time; result->time = interval2->time;
result->month = interval2->month; result->month = interval2->month;
} }
else else
{ {
...@@ -1234,92 +1133,90 @@ interval_larger(Interval *interval1, Interval *interval2) ...@@ -1234,92 +1133,90 @@ interval_larger(Interval *interval1, Interval *interval2)
} }
} }
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_larger() */ }
Interval * Datum
interval_pl(Interval *span1, Interval *span2) interval_pl(PG_FUNCTION_ARGS)
{ {
Interval *span1 = PG_GETARG_INTERVAL_P(0);
Interval *span2 = PG_GETARG_INTERVAL_P(1);
Interval *result; Interval *result;
if ((!PointerIsValid(span1)) || (!PointerIsValid(span2))) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
result->month = (span1->month + span2->month); result->month = (span1->month + span2->month);
result->time = JROUND(span1->time + span2->time); result->time = JROUND(span1->time + span2->time);
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_pl() */ }
Interval * Datum
interval_mi(Interval *span1, Interval *span2) interval_mi(PG_FUNCTION_ARGS)
{ {
Interval *span1 = PG_GETARG_INTERVAL_P(0);
Interval *span2 = PG_GETARG_INTERVAL_P(1);
Interval *result; Interval *result;
if ((!PointerIsValid(span1)) || (!PointerIsValid(span2))) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
result->month = (span1->month - span2->month); result->month = (span1->month - span2->month);
result->time = JROUND(span1->time - span2->time); result->time = JROUND(span1->time - span2->time);
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_mi() */ }
Interval * Datum
interval_mul(Interval *span1, float8 *factor) interval_mul(PG_FUNCTION_ARGS)
{ {
Interval *span1 = PG_GETARG_INTERVAL_P(0);
float8 factor = PG_GETARG_FLOAT8(1);
Interval *result; Interval *result;
double months; double months;
if ((!PointerIsValid(span1)) || (!PointerIsValid(factor))) result = (Interval *) palloc(sizeof(Interval));
return NULL;
if (!PointerIsValid(result = palloc(sizeof(Interval)))) months = (span1->month * factor);
elog(ERROR, "Memory allocation failed, can't multiply interval");
months = (span1->month * *factor);
result->month = rint(months); result->month = rint(months);
result->time = JROUND(span1->time * *factor); result->time = JROUND(span1->time * factor);
/* evaluate fractional months as 30 days */ /* evaluate fractional months as 30 days */
result->time += JROUND((months - result->month) * 30 * 86400); result->time += JROUND((months - result->month) * 30 * 86400);
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_mul() */ }
Interval * Datum
mul_d_interval(float8 *factor, Interval *span1) mul_d_interval(PG_FUNCTION_ARGS)
{ {
return interval_mul(span1, factor); /* Args are float8 and Interval *, but leave them as generic Datum */
} /* mul_d_interval() */ Datum factor = PG_GETARG_DATUM(0);
Datum span1 = PG_GETARG_DATUM(1);
Interval * return DirectFunctionCall2(interval_mul, span1, factor);
interval_div(Interval *span1, float8 *factor) }
Datum
interval_div(PG_FUNCTION_ARGS)
{ {
Interval *span1 = PG_GETARG_INTERVAL_P(0);
float8 factor = PG_GETARG_FLOAT8(1);
Interval *result; Interval *result;
double months; double months;
if ((!PointerIsValid(span1)) || (!PointerIsValid(factor))) result = (Interval *) palloc(sizeof(Interval));
return NULL;
if (!PointerIsValid(result = palloc(sizeof(Interval))))
elog(ERROR, "Memory allocation failed, can't divide interval");
if (*factor == 0.0) if (factor == 0.0)
elog(ERROR, "interval_div: divide by 0.0 error"); elog(ERROR, "interval_div: divide by 0.0 error");
months = (span1->month / *factor); months = (span1->month / factor);
result->month = rint(months); result->month = rint(months);
result->time = JROUND(span1->time / *factor); result->time = JROUND(span1->time / factor);
/* evaluate fractional months as 30 days */ /* evaluate fractional months as 30 days */
result->time += JROUND((months - result->month) * 30 * 86400); result->time += JROUND((months - result->month) * 30 * 86400);
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_div() */ }
/* timestamp_age() /* timestamp_age()
* Calculate time difference while retaining year/month fields. * Calculate time difference while retaining year/month fields.
...@@ -1327,13 +1224,12 @@ interval_div(Interval *span1, float8 *factor) ...@@ -1327,13 +1224,12 @@ interval_div(Interval *span1, float8 *factor)
* since year and month are out of context once the arithmetic * since year and month are out of context once the arithmetic
* is done. * is done.
*/ */
Interval * Datum
timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2) timestamp_age(PG_FUNCTION_ARGS)
{ {
Timestamp dt1 = PG_GETARG_TIMESTAMP(0);
Timestamp dt2 = PG_GETARG_TIMESTAMP(1);
Interval *result; Interval *result;
Timestamp dt1,
dt2;
double fsec, double fsec,
fsec1, fsec1,
fsec2; fsec2;
...@@ -1344,13 +1240,7 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -1344,13 +1240,7 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2)
struct tm tt2, struct tm tt2,
*tm2 = &tt2; *tm2 = &tt2;
if (!PointerIsValid(timestamp1) || !PointerIsValid(timestamp2)) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
dt1 = *timestamp1;
dt2 = *timestamp2;
if (TIMESTAMP_IS_RELATIVE(dt1)) if (TIMESTAMP_IS_RELATIVE(dt1))
dt1 = SetTimestamp(dt1); dt1 = SetTimestamp(dt1);
...@@ -1361,7 +1251,6 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -1361,7 +1251,6 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2)
|| TIMESTAMP_IS_INVALID(dt2)) || TIMESTAMP_IS_INVALID(dt2))
{ {
TIMESTAMP_INVALID(result->time); TIMESTAMP_INVALID(result->time);
} }
else if ((timestamp2tm(dt1, NULL, tm1, &fsec1, NULL) == 0) else if ((timestamp2tm(dt1, NULL, tm1, &fsec1, NULL) == 0)
&& (timestamp2tm(dt2, NULL, tm2, &fsec2, NULL) == 0)) && (timestamp2tm(dt2, NULL, tm2, &fsec2, NULL) == 0))
...@@ -1438,13 +1327,12 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -1438,13 +1327,12 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2)
if (tm2interval(tm, fsec, result) != 0) if (tm2interval(tm, fsec, result) != 0)
elog(ERROR, "Unable to decode timestamp"); elog(ERROR, "Unable to decode timestamp");
} }
else else
elog(ERROR, "Unable to decode timestamp"); elog(ERROR, "Unable to decode timestamp");
return result; PG_RETURN_INTERVAL_P(result);
} /* timestamp_age() */ }
/*---------------------------------------------------------- /*----------------------------------------------------------
...@@ -1455,20 +1343,16 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2) ...@@ -1455,20 +1343,16 @@ timestamp_age(Timestamp *timestamp1, Timestamp *timestamp2)
/* timestamp_text() /* timestamp_text()
* Convert timestamp to text data type. * Convert timestamp to text data type.
*/ */
text * Datum
timestamp_text(Timestamp *timestamp) timestamp_text(PG_FUNCTION_ARGS)
{ {
/* Input is a Timestamp, but may as well leave it in Datum form */
Datum timestamp = PG_GETARG_DATUM(0);
text *result; text *result;
char *str; char *str;
int len; int len;
if (!PointerIsValid(timestamp)) str = DatumGetCString(DirectFunctionCall1(timestamp_out, timestamp));
return NULL;
str = timestamp_out(timestamp);
if (!PointerIsValid(str))
return NULL;
len = (strlen(str) + VARHDRSZ); len = (strlen(str) + VARHDRSZ);
...@@ -1479,8 +1363,8 @@ timestamp_text(Timestamp *timestamp) ...@@ -1479,8 +1363,8 @@ timestamp_text(Timestamp *timestamp)
pfree(str); pfree(str);
return result; PG_RETURN_TEXT_P(result);
} /* timestamp_text() */ }
/* text_timestamp() /* text_timestamp()
...@@ -1488,17 +1372,17 @@ timestamp_text(Timestamp *timestamp) ...@@ -1488,17 +1372,17 @@ timestamp_text(Timestamp *timestamp)
* Text type is not null terminated, so use temporary string * Text type is not null terminated, so use temporary string
* then call the standard input routine. * then call the standard input routine.
*/ */
Timestamp * Datum
text_timestamp(text *str) text_timestamp(PG_FUNCTION_ARGS)
{ {
Timestamp *result; text *str = PG_GETARG_TEXT_P(0);
int i; int i;
char *sp, char *sp,
*dp, *dp,
dstr[MAXDATELEN + 1]; dstr[MAXDATELEN + 1];
if (!PointerIsValid(str)) if (VARSIZE(str) - VARHDRSZ > MAXDATELEN)
return NULL; elog(ERROR, "Bad timestamp external representation (too long)");
sp = VARDATA(str); sp = VARDATA(str);
dp = dstr; dp = dstr;
...@@ -1506,29 +1390,24 @@ text_timestamp(text *str) ...@@ -1506,29 +1390,24 @@ text_timestamp(text *str)
*dp++ = *sp++; *dp++ = *sp++;
*dp = '\0'; *dp = '\0';
result = timestamp_in(dstr); return DirectFunctionCall1(timestamp_in,
CStringGetDatum(dstr));
return result; }
} /* text_timestamp() */
/* interval_text() /* interval_text()
* Convert interval to text data type. * Convert interval to text data type.
*/ */
text * Datum
interval_text(Interval *interval) interval_text(PG_FUNCTION_ARGS)
{ {
Interval *interval = PG_GETARG_INTERVAL_P(0);
text *result; text *result;
char *str; char *str;
int len; int len;
if (!PointerIsValid(interval)) str = DatumGetCString(DirectFunctionCall1(interval_out,
return NULL; IntervalPGetDatum(interval)));
str = interval_out(interval);
if (!PointerIsValid(str))
return NULL;
len = (strlen(str) + VARHDRSZ); len = (strlen(str) + VARHDRSZ);
...@@ -1539,8 +1418,8 @@ interval_text(Interval *interval) ...@@ -1539,8 +1418,8 @@ interval_text(Interval *interval)
pfree(str); pfree(str);
return result; PG_RETURN_TEXT_P(result);
} /* interval_text() */ }
/* text_interval() /* text_interval()
...@@ -1548,37 +1427,35 @@ interval_text(Interval *interval) ...@@ -1548,37 +1427,35 @@ interval_text(Interval *interval)
* Text type may not be null terminated, so copy to temporary string * Text type may not be null terminated, so copy to temporary string
* then call the standard input routine. * then call the standard input routine.
*/ */
Interval * Datum
text_interval(text *str) text_interval(PG_FUNCTION_ARGS)
{ {
Interval *result; text *str = PG_GETARG_TEXT_P(0);
int i; int i;
char *sp, char *sp,
*dp, *dp,
dstr[MAXDATELEN + 1]; dstr[MAXDATELEN + 1];
if (!PointerIsValid(str)) if (VARSIZE(str) - VARHDRSZ > MAXDATELEN)
return NULL; elog(ERROR, "Bad interval external representation (too long)");
sp = VARDATA(str); sp = VARDATA(str);
dp = dstr; dp = dstr;
for (i = 0; i < (VARSIZE(str) - VARHDRSZ); i++) for (i = 0; i < (VARSIZE(str) - VARHDRSZ); i++)
*dp++ = *sp++; *dp++ = *sp++;
*dp = '\0'; *dp = '\0';
result = interval_in(dstr); return DirectFunctionCall1(interval_in, CStringGetDatum(dstr));
}
return result;
} /* text_interval() */
/* timestamp_trunc() /* timestamp_trunc()
* Extract specified field from timestamp. * Extract specified field from timestamp.
*/ */
Timestamp * Datum
timestamp_trunc(text *units, Timestamp *timestamp) timestamp_trunc(PG_FUNCTION_ARGS)
{ {
Timestamp *result; text *units = PG_GETARG_TEXT_P(0);
Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
Timestamp result;
Timestamp dt; Timestamp dt;
int tz; int tz;
int type, int type,
...@@ -1592,11 +1469,8 @@ timestamp_trunc(text *units, Timestamp *timestamp) ...@@ -1592,11 +1469,8 @@ timestamp_trunc(text *units, Timestamp *timestamp)
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
if ((!PointerIsValid(units)) || (!PointerIsValid(timestamp))) if (VARSIZE(units) - VARHDRSZ > MAXDATELEN)
return NULL; elog(ERROR, "Interval units '%s' not recognized", textout(units));
result = palloc(sizeof(Timestamp));
up = VARDATA(units); up = VARDATA(units);
lp = lowunits; lp = lowunits;
for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++) for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++)
...@@ -1605,18 +1479,18 @@ timestamp_trunc(text *units, Timestamp *timestamp) ...@@ -1605,18 +1479,18 @@ timestamp_trunc(text *units, Timestamp *timestamp)
type = DecodeUnits(0, lowunits, &val); type = DecodeUnits(0, lowunits, &val);
if (TIMESTAMP_NOT_FINITE(*timestamp)) if (TIMESTAMP_NOT_FINITE(timestamp))
{ {
#if NOT_USED #if NOT_USED
/* should return null but Postgres doesn't like that currently. - tgl 97/06/12 */ /* should return null but Postgres doesn't like that currently. - tgl 97/06/12 */
elog(ERROR, "Timestamp is not finite", NULL); elog(ERROR, "Timestamp is not finite");
#endif #endif
*result = 0; result = 0;
} }
else else
{ {
dt = (TIMESTAMP_IS_RELATIVE(*timestamp) ? SetTimestamp(*timestamp) : *timestamp); dt = (TIMESTAMP_IS_RELATIVE(timestamp) ? SetTimestamp(timestamp) : timestamp);
if ((type == UNITS) && (timestamp2tm(dt, &tz, tm, &fsec, &tzn) == 0)) if ((type == UNITS) && (timestamp2tm(dt, &tz, tm, &fsec, &tzn) == 0))
{ {
...@@ -1654,7 +1528,7 @@ timestamp_trunc(text *units, Timestamp *timestamp) ...@@ -1654,7 +1528,7 @@ timestamp_trunc(text *units, Timestamp *timestamp)
default: default:
elog(ERROR, "Timestamp units '%s' not supported", lowunits); elog(ERROR, "Timestamp units '%s' not supported", lowunits);
result = NULL; result = 0;
} }
if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday)) if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday))
...@@ -1692,36 +1566,35 @@ timestamp_trunc(text *units, Timestamp *timestamp) ...@@ -1692,36 +1566,35 @@ timestamp_trunc(text *units, Timestamp *timestamp)
tz = 0; tz = 0;
} }
if (tm2timestamp(tm, fsec, &tz, result) != 0) if (tm2timestamp(tm, fsec, &tz, &result) != 0)
elog(ERROR, "Unable to truncate timestamp to '%s'", lowunits); elog(ERROR, "Unable to truncate timestamp to '%s'", lowunits);
#if NOT_USED
} }
#if NOT_USED
else if ((type == RESERV) && (val == DTK_EPOCH)) else if ((type == RESERV) && (val == DTK_EPOCH))
{ {
TIMESTAMP_EPOCH(*result); TIMESTAMP_EPOCH(result);
*result = dt - SetTimestamp(*result); result = dt - SetTimestamp(result);
#endif
} }
#endif
else else
{ {
elog(ERROR, "Timestamp units '%s' not recognized", lowunits); elog(ERROR, "Timestamp units '%s' not recognized", lowunits);
result = NULL; result = 0;
} }
} }
return result; PG_RETURN_TIMESTAMP(result);
} /* timestamp_trunc() */ }
/* interval_trunc() /* interval_trunc()
* Extract specified field from interval. * Extract specified field from interval.
*/ */
Interval * Datum
interval_trunc(text *units, Interval *interval) interval_trunc(PG_FUNCTION_ARGS)
{ {
text *units = PG_GETARG_TEXT_P(0);
Interval *interval = PG_GETARG_INTERVAL_P(1);
Interval *result; Interval *result;
int type, int type,
val; val;
int i; int i;
...@@ -1732,11 +1605,10 @@ interval_trunc(text *units, Interval *interval) ...@@ -1732,11 +1605,10 @@ interval_trunc(text *units, Interval *interval)
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
if ((!PointerIsValid(units)) || (!PointerIsValid(interval))) result = (Interval *) palloc(sizeof(Interval));
return NULL;
result = palloc(sizeof(Interval));
if (VARSIZE(units) - VARHDRSZ > MAXDATELEN)
elog(ERROR, "Interval units '%s' not recognized", textout(units));
up = VARDATA(units); up = VARDATA(units);
lp = lowunits; lp = lowunits;
for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++) for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++)
...@@ -1748,14 +1620,12 @@ interval_trunc(text *units, Interval *interval) ...@@ -1748,14 +1620,12 @@ interval_trunc(text *units, Interval *interval)
if (INTERVAL_IS_INVALID(*interval)) if (INTERVAL_IS_INVALID(*interval))
{ {
#if NOT_USED #if NOT_USED
elog(ERROR, "Interval is not finite", NULL); elog(ERROR, "Interval is not finite");
#endif #endif
result = NULL; PG_RETURN_NULL();
} }
else if (type == UNITS) else if (type == UNITS)
{ {
if (interval2tm(*interval, tm, &fsec) == 0) if (interval2tm(*interval, tm, &fsec) == 0)
{ {
switch (val) switch (val)
...@@ -1792,7 +1662,7 @@ interval_trunc(text *units, Interval *interval) ...@@ -1792,7 +1662,7 @@ interval_trunc(text *units, Interval *interval)
default: default:
elog(ERROR, "Interval units '%s' not supported", lowunits); elog(ERROR, "Interval units '%s' not supported", lowunits);
result = NULL; PG_RETURN_NULL();
} }
if (tm2interval(tm, fsec, result) != 0) if (tm2interval(tm, fsec, result) != 0)
...@@ -1802,11 +1672,11 @@ interval_trunc(text *units, Interval *interval) ...@@ -1802,11 +1672,11 @@ interval_trunc(text *units, Interval *interval)
else else
{ {
elog(NOTICE, "Interval out of range"); elog(NOTICE, "Interval out of range");
result = NULL; PG_RETURN_NULL();
} }
#if NOT_USED
} }
#if NOT_USED
else if ((type == RESERV) && (val == DTK_EPOCH)) else if ((type == RESERV) && (val == DTK_EPOCH))
{ {
*result = interval->time; *result = interval->time;
...@@ -1815,27 +1685,27 @@ interval_trunc(text *units, Interval *interval) ...@@ -1815,27 +1685,27 @@ interval_trunc(text *units, Interval *interval)
*result += ((365.25 * 86400) * (interval->month / 12)); *result += ((365.25 * 86400) * (interval->month / 12));
*result += ((30 * 86400) * (interval->month % 12)); *result += ((30 * 86400) * (interval->month % 12));
} }
#endif
} }
#endif
else else
{ {
elog(ERROR, "Interval units '%s' not recognized", textout(units)); elog(ERROR, "Interval units '%s' not recognized", textout(units));
result = NULL; PG_RETURN_NULL();
} }
return result; PG_RETURN_INTERVAL_P(result);
} /* interval_trunc() */ }
/* timestamp_part() /* timestamp_part()
* Extract specified field from timestamp. * Extract specified field from timestamp.
*/ */
float64 Datum
timestamp_part(text *units, Timestamp *timestamp) timestamp_part(PG_FUNCTION_ARGS)
{ {
float64 result; text *units = PG_GETARG_TEXT_P(0);
Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
float8 result;
Timestamp dt; Timestamp dt;
int tz; int tz;
int type, int type,
...@@ -1850,11 +1720,8 @@ timestamp_part(text *units, Timestamp *timestamp) ...@@ -1850,11 +1720,8 @@ timestamp_part(text *units, Timestamp *timestamp)
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
if ((!PointerIsValid(units)) || (!PointerIsValid(timestamp))) if (VARSIZE(units) - VARHDRSZ > MAXDATELEN)
return NULL; elog(ERROR, "Interval units '%s' not recognized", textout(units));
result = palloc(sizeof(float64data));
up = VARDATA(units); up = VARDATA(units);
lp = lowunits; lp = lowunits;
for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++) for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++)
...@@ -1865,67 +1732,66 @@ timestamp_part(text *units, Timestamp *timestamp) ...@@ -1865,67 +1732,66 @@ timestamp_part(text *units, Timestamp *timestamp)
if (type == IGNORE) if (type == IGNORE)
type = DecodeSpecial(0, lowunits, &val); type = DecodeSpecial(0, lowunits, &val);
if (TIMESTAMP_NOT_FINITE(*timestamp)) if (TIMESTAMP_NOT_FINITE(timestamp))
{ {
#if NOT_USED #if NOT_USED
/* should return null but Postgres doesn't like that currently. - tgl 97/06/12 */ /* should return null but Postgres doesn't like that currently. - tgl 97/06/12 */
elog(ERROR, "Timestamp is not finite", NULL); elog(ERROR, "Timestamp is not finite", NULL);
#endif #endif
*result = 0; PG_RETURN_NULL();
} }
else else
{ {
dt = (TIMESTAMP_IS_RELATIVE(*timestamp) ? SetTimestamp(*timestamp) : *timestamp); dt = (TIMESTAMP_IS_RELATIVE(timestamp) ? SetTimestamp(timestamp) : timestamp);
if ((type == UNITS) && (timestamp2tm(dt, &tz, tm, &fsec, &tzn) == 0)) if ((type == UNITS) && (timestamp2tm(dt, &tz, tm, &fsec, &tzn) == 0))
{ {
switch (val) switch (val)
{ {
case DTK_TZ: case DTK_TZ:
*result = tz; result = tz;
break; break;
case DTK_TZ_MINUTE: case DTK_TZ_MINUTE:
*result = tz / 60; result = tz / 60;
TMODULO(*result, dummy, 60e0); TMODULO(result, dummy, 60e0);
break; break;
case DTK_TZ_HOUR: case DTK_TZ_HOUR:
dummy = tz; dummy = tz;
TMODULO(dummy, *result, 3600e0); TMODULO(dummy, result, 3600e0);
break; break;
case DTK_MICROSEC: case DTK_MICROSEC:
*result = (fsec * 1000000); result = (fsec * 1000000);
break; break;
case DTK_MILLISEC: case DTK_MILLISEC:
*result = (fsec * 1000); result = (fsec * 1000);
break; break;
case DTK_SECOND: case DTK_SECOND:
*result = (tm->tm_sec + fsec); result = (tm->tm_sec + fsec);
break; break;
case DTK_MINUTE: case DTK_MINUTE:
*result = tm->tm_min; result = tm->tm_min;
break; break;
case DTK_HOUR: case DTK_HOUR:
*result = tm->tm_hour; result = tm->tm_hour;
break; break;
case DTK_DAY: case DTK_DAY:
*result = tm->tm_mday; result = tm->tm_mday;
break; break;
case DTK_MONTH: case DTK_MONTH:
*result = tm->tm_mon; result = tm->tm_mon;
break; break;
case DTK_QUARTER: case DTK_QUARTER:
*result = (tm->tm_mon / 4) + 1; result = (tm->tm_mon / 4) + 1;
break; break;
case DTK_WEEK: case DTK_WEEK:
...@@ -1945,40 +1811,40 @@ timestamp_part(text *units, Timestamp *timestamp) ...@@ -1945,40 +1811,40 @@ timestamp_part(text *units, Timestamp *timestamp)
/* day0 == offset to first day of week (Monday) */ /* day0 == offset to first day of week (Monday) */
day0 = (j2day(day4 - 1) % 7); day0 = (j2day(day4 - 1) % 7);
} }
*result = (((dayn - (day4 - day0)) / 7) + 1); result = (((dayn - (day4 - day0)) / 7) + 1);
/* Sometimes the last few days in a year will fall into /* Sometimes the last few days in a year will fall into
* the first week of the next year, so check for this. * the first week of the next year, so check for this.
*/ */
if (*result >= 53) if (result >= 53)
{ {
day4 = date2j((tm->tm_year + 1), 1, 4); day4 = date2j((tm->tm_year + 1), 1, 4);
/* day0 == offset to first day of week (Monday) */ /* day0 == offset to first day of week (Monday) */
day0 = (j2day(day4 - 1) % 7); day0 = (j2day(day4 - 1) % 7);
if (dayn >= (day4 - day0)) if (dayn >= (day4 - day0))
*result = (((dayn - (day4 - day0)) / 7) + 1); result = (((dayn - (day4 - day0)) / 7) + 1);
} }
} }
break; break;
case DTK_YEAR: case DTK_YEAR:
*result = tm->tm_year; result = tm->tm_year;
break; break;
case DTK_DECADE: case DTK_DECADE:
*result = (tm->tm_year / 10); result = (tm->tm_year / 10);
break; break;
case DTK_CENTURY: case DTK_CENTURY:
*result = (tm->tm_year / 100); result = (tm->tm_year / 100);
break; break;
case DTK_MILLENNIUM: case DTK_MILLENNIUM:
*result = (tm->tm_year / 1000); result = (tm->tm_year / 1000);
break; break;
default: default:
elog(ERROR, "Timestamp units '%s' not supported", lowunits); elog(ERROR, "Timestamp units '%s' not supported", lowunits);
*result = 0; result = 0;
} }
} }
...@@ -1987,50 +1853,51 @@ timestamp_part(text *units, Timestamp *timestamp) ...@@ -1987,50 +1853,51 @@ timestamp_part(text *units, Timestamp *timestamp)
switch (val) switch (val)
{ {
case DTK_EPOCH: case DTK_EPOCH:
TIMESTAMP_EPOCH(*result); TIMESTAMP_EPOCH(result);
*result = dt - SetTimestamp(*result); result = dt - SetTimestamp(result);
break; break;
case DTK_DOW: case DTK_DOW:
if (timestamp2tm(dt, &tz, tm, &fsec, &tzn) != 0) if (timestamp2tm(dt, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to encode timestamp"); elog(ERROR, "Unable to encode timestamp");
*result = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)); result = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
break; break;
case DTK_DOY: case DTK_DOY:
if (timestamp2tm(dt, &tz, tm, &fsec, &tzn) != 0) if (timestamp2tm(dt, &tz, tm, &fsec, &tzn) != 0)
elog(ERROR, "Unable to encode timestamp"); elog(ERROR, "Unable to encode timestamp");
*result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
- date2j(tm->tm_year, 1, 1) + 1); - date2j(tm->tm_year, 1, 1) + 1);
break; break;
default: default:
elog(ERROR, "Timestamp units '%s' not supported", lowunits); elog(ERROR, "Timestamp units '%s' not supported", lowunits);
*result = 0; result = 0;
} }
} }
else else
{ {
elog(ERROR, "Timestamp units '%s' not recognized", lowunits); elog(ERROR, "Timestamp units '%s' not recognized", lowunits);
*result = 0; result = 0;
} }
} }
return result; PG_RETURN_FLOAT8(result);
} /* timestamp_part() */ }
/* interval_part() /* interval_part()
* Extract specified field from interval. * Extract specified field from interval.
*/ */
float64 Datum
interval_part(text *units, Interval *interval) interval_part(PG_FUNCTION_ARGS)
{ {
float64 result; text *units = PG_GETARG_TEXT_P(0);
Interval *interval = PG_GETARG_INTERVAL_P(1);
float8 result;
int type, int type,
val; val;
int i; int i;
...@@ -2041,11 +1908,8 @@ interval_part(text *units, Interval *interval) ...@@ -2041,11 +1908,8 @@ interval_part(text *units, Interval *interval)
struct tm tt, struct tm tt,
*tm = &tt; *tm = &tt;
if ((!PointerIsValid(units)) || (!PointerIsValid(interval))) if (VARSIZE(units) - VARHDRSZ > MAXDATELEN)
return NULL; elog(ERROR, "Interval units '%s' not recognized", textout(units));
result = palloc(sizeof(float64data));
up = VARDATA(units); up = VARDATA(units);
lp = lowunits; lp = lowunits;
for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++) for (i = 0; i < (VARSIZE(units) - VARHDRSZ); i++)
...@@ -2061,105 +1925,103 @@ interval_part(text *units, Interval *interval) ...@@ -2061,105 +1925,103 @@ interval_part(text *units, Interval *interval)
#if NOT_USED #if NOT_USED
elog(ERROR, "Interval is not finite"); elog(ERROR, "Interval is not finite");
#endif #endif
*result = 0; result = 0;
} }
else if (type == UNITS) else if (type == UNITS)
{ {
if (interval2tm(*interval, tm, &fsec) == 0) if (interval2tm(*interval, tm, &fsec) == 0)
{ {
switch (val) switch (val)
{ {
case DTK_MICROSEC: case DTK_MICROSEC:
*result = (fsec * 1000000); result = (fsec * 1000000);
break; break;
case DTK_MILLISEC: case DTK_MILLISEC:
*result = (fsec * 1000); result = (fsec * 1000);
break; break;
case DTK_SECOND: case DTK_SECOND:
*result = (tm->tm_sec + fsec); result = (tm->tm_sec + fsec);
break; break;
case DTK_MINUTE: case DTK_MINUTE:
*result = tm->tm_min; result = tm->tm_min;
break; break;
case DTK_HOUR: case DTK_HOUR:
*result = tm->tm_hour; result = tm->tm_hour;
break; break;
case DTK_DAY: case DTK_DAY:
*result = tm->tm_mday; result = tm->tm_mday;
break; break;
case DTK_MONTH: case DTK_MONTH:
*result = tm->tm_mon; result = tm->tm_mon;
break; break;
case DTK_QUARTER: case DTK_QUARTER:
*result = (tm->tm_mon / 4) + 1; result = (tm->tm_mon / 4) + 1;
break; break;
case DTK_YEAR: case DTK_YEAR:
*result = tm->tm_year; result = tm->tm_year;
break; break;
case DTK_DECADE: case DTK_DECADE:
*result = (tm->tm_year / 10); result = (tm->tm_year / 10);
break; break;
case DTK_CENTURY: case DTK_CENTURY:
*result = (tm->tm_year / 100); result = (tm->tm_year / 100);
break; break;
case DTK_MILLENNIUM: case DTK_MILLENNIUM:
*result = (tm->tm_year / 1000); result = (tm->tm_year / 1000);
break; break;
default: default:
elog(ERROR, "Interval units '%s' not yet supported", textout(units)); elog(ERROR, "Interval units '%s' not yet supported",
result = NULL; textout(units));
result = 0;
} }
} }
else else
{ {
elog(NOTICE, "Interval out of range"); elog(NOTICE, "Interval out of range");
*result = 0; result = 0;
} }
} }
else if ((type == RESERV) && (val == DTK_EPOCH)) else if ((type == RESERV) && (val == DTK_EPOCH))
{ {
*result = interval->time; result = interval->time;
if (interval->month != 0) if (interval->month != 0)
{ {
*result += ((365.25 * 86400) * (interval->month / 12)); result += ((365.25 * 86400) * (interval->month / 12));
*result += ((30 * 86400) * (interval->month % 12)); result += ((30 * 86400) * (interval->month % 12));
} }
} }
else else
{ {
elog(ERROR, "Interval units '%s' not recognized", textout(units)); elog(ERROR, "Interval units '%s' not recognized", textout(units));
*result = 0; result = 0;
} }
return result; PG_RETURN_FLOAT8(result);
} /* interval_part() */ }
/* timestamp_zone() /* timestamp_zone()
* Encode timestamp type with specified time zone. * Encode timestamp type with specified time zone.
*/ */
text * Datum
timestamp_zone(text *zone, Timestamp *timestamp) timestamp_zone(PG_FUNCTION_ARGS)
{ {
text *zone = PG_GETARG_TEXT_P(0);
Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
text *result; text *result;
Timestamp dt; Timestamp dt;
int tz; int tz;
int type, int type,
...@@ -2176,9 +2038,8 @@ timestamp_zone(text *zone, Timestamp *timestamp) ...@@ -2176,9 +2038,8 @@ timestamp_zone(text *zone, Timestamp *timestamp)
char buf[MAXDATELEN + 1]; char buf[MAXDATELEN + 1];
int len; int len;
if ((!PointerIsValid(zone)) || (!PointerIsValid(timestamp))) if (VARSIZE(zone) - VARHDRSZ > MAXDATELEN)
return NULL; elog(ERROR, "Time zone '%s' not recognized", textout(zone));
up = VARDATA(zone); up = VARDATA(zone);
lp = lowzone; lp = lowzone;
for (i = 0; i < (VARSIZE(zone) - VARHDRSZ); i++) for (i = 0; i < (VARSIZE(zone) - VARHDRSZ); i++)
...@@ -2187,23 +2048,24 @@ timestamp_zone(text *zone, Timestamp *timestamp) ...@@ -2187,23 +2048,24 @@ timestamp_zone(text *zone, Timestamp *timestamp)
type = DecodeSpecial(0, lowzone, &val); type = DecodeSpecial(0, lowzone, &val);
if (TIMESTAMP_NOT_FINITE(*timestamp)) if (TIMESTAMP_NOT_FINITE(timestamp))
{ {
/* /*
* could return null but Postgres doesn't like that currently. - * could return null but Postgres doesn't like that currently. -
* tgl 97/06/12 * tgl 97/06/12
*
* Could do it now if you wanted ... the other tgl 2000/06/08
*/ */
elog(ERROR, "Timestamp is not finite"); elog(ERROR, "Timestamp is not finite");
result = NULL; result = NULL;
} }
else if ((type == TZ) || (type == DTZ)) else if ((type == TZ) || (type == DTZ))
{ {
tm->tm_isdst = ((type == DTZ) ? 1 : 0); tm->tm_isdst = ((type == DTZ) ? 1 : 0);
tz = val * 60; tz = val * 60;
dt = (TIMESTAMP_IS_RELATIVE(*timestamp) ? SetTimestamp(*timestamp) : *timestamp); dt = (TIMESTAMP_IS_RELATIVE(timestamp) ? SetTimestamp(timestamp) : timestamp);
dt = dt2local(dt, tz); dt = dt2local(dt, tz);
if (timestamp2tm(dt, NULL, tm, &fsec, NULL) != 0) if (timestamp2tm(dt, NULL, tm, &fsec, NULL) != 0)
...@@ -2224,7 +2086,6 @@ timestamp_zone(text *zone, Timestamp *timestamp) ...@@ -2224,7 +2086,6 @@ timestamp_zone(text *zone, Timestamp *timestamp)
VARSIZE(result) = len; VARSIZE(result) = len;
memmove(VARDATA(result), buf, (len - VARHDRSZ)); memmove(VARDATA(result), buf, (len - VARHDRSZ));
} }
else else
{ {
...@@ -2232,5 +2093,5 @@ timestamp_zone(text *zone, Timestamp *timestamp) ...@@ -2232,5 +2093,5 @@ timestamp_zone(text *zone, Timestamp *timestamp)
result = NULL; result = NULL;
} }
return result; PG_RETURN_TEXT_P(result);
} /* timestamp_zone() */ }
...@@ -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.26 2000/06/07 04:09:44 momjian Exp $ * $Id: catversion.h,v 1.27 2000/06/09 01:11:10 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200006071 #define CATALOG_VERSION_NO 200006081
#endif #endif
...@@ -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: pg_proc.h,v 1.136 2000/06/05 07:28:59 tgl Exp $ * $Id: pg_proc.h,v 1.137 2000/06/09 01:11:10 tgl Exp $
* *
* NOTES * NOTES
* The script catalog/genbki.sh reads this file and generates .bki * The script catalog/genbki.sh reads this file and generates .bki
...@@ -500,77 +500,77 @@ DESCR("convert float4 to int2"); ...@@ -500,77 +500,77 @@ DESCR("convert float4 to int2");
DATA(insert OID = 239 ( line_distance PGUID 11 f t t t 2 f 701 "628 628" 100 0 0 100 line_distance - )); DATA(insert OID = 239 ( line_distance PGUID 11 f t t t 2 f 701 "628 628" 100 0 0 100 line_distance - ));
DESCR("distance between"); DESCR("distance between");
DATA(insert OID = 240 ( nabstimein PGUID 11 f t f t 1 f 702 "0" 100 0 0 100 nabstimein - )); DATA(insert OID = 240 ( nabstimein PGUID 12 f t f t 1 f 702 "0" 100 0 0 100 nabstimein - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 241 ( nabstimeout PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 nabstimeout - )); DATA(insert OID = 241 ( nabstimeout PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 nabstimeout - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 242 ( reltimein PGUID 11 f t f t 1 f 703 "0" 100 0 0 100 reltimein - )); DATA(insert OID = 242 ( reltimein PGUID 12 f t f t 1 f 703 "0" 100 0 0 100 reltimein - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 243 ( reltimeout PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 reltimeout - )); DATA(insert OID = 243 ( reltimeout PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 reltimeout - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 244 ( timepl PGUID 11 f t f t 2 f 702 "702 703" 100 0 0 100 timepl - )); DATA(insert OID = 244 ( timepl PGUID 12 f t f t 2 f 702 "702 703" 100 0 0 100 timepl - ));
DESCR("addition"); DESCR("addition");
DATA(insert OID = 245 ( timemi PGUID 11 f t f t 2 f 702 "702 703" 100 0 0 100 timemi - )); DATA(insert OID = 245 ( timemi PGUID 12 f t f t 2 f 702 "702 703" 100 0 0 100 timemi - ));
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 246 ( tintervalin PGUID 11 f t f t 1 f 704 "0" 100 0 0 100 tintervalin - )); DATA(insert OID = 246 ( tintervalin PGUID 12 f t f t 1 f 704 "0" 100 0 0 100 tintervalin - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 247 ( tintervalout PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 tintervalout - )); DATA(insert OID = 247 ( tintervalout PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 tintervalout - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 248 ( intinterval PGUID 11 f t f t 2 f 16 "702 704" 100 0 0 100 intinterval - )); DATA(insert OID = 248 ( intinterval PGUID 12 f t f t 2 f 16 "702 704" 100 0 0 100 intinterval - ));
DESCR("abstime in tinterval"); DESCR("abstime in tinterval");
DATA(insert OID = 249 ( tintervalrel PGUID 11 f t f t 1 f 703 "704" 100 0 0 100 tintervalrel - )); DATA(insert OID = 249 ( tintervalrel PGUID 12 f t f t 1 f 703 "704" 100 0 0 100 tintervalrel - ));
DESCR(""); DESCR("");
DATA(insert OID = 250 ( timenow PGUID 11 f t f t 0 f 702 "0" 100 0 0 100 timenow - )); DATA(insert OID = 250 ( timenow PGUID 12 f t f t 0 f 702 "0" 100 0 0 100 timenow - ));
DESCR("Current date and time (abstime)"); DESCR("Current date and time (abstime)");
DATA(insert OID = 251 ( abstimeeq PGUID 11 f t f t 2 f 16 "702 702" 100 0 0 100 abstimeeq - )); DATA(insert OID = 251 ( abstimeeq PGUID 12 f t f t 2 f 16 "702 702" 100 0 0 100 abstimeeq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 252 ( abstimene PGUID 11 f t f t 2 f 16 "702 702" 100 0 0 100 abstimene - )); DATA(insert OID = 252 ( abstimene PGUID 12 f t f t 2 f 16 "702 702" 100 0 0 100 abstimene - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 253 ( abstimelt PGUID 11 f t f t 2 f 16 "702 702" 100 0 0 100 abstimelt - )); DATA(insert OID = 253 ( abstimelt PGUID 12 f t f t 2 f 16 "702 702" 100 0 0 100 abstimelt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 254 ( abstimegt PGUID 11 f t f t 2 f 16 "702 702" 100 0 0 100 abstimegt - )); DATA(insert OID = 254 ( abstimegt PGUID 12 f t f t 2 f 16 "702 702" 100 0 0 100 abstimegt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 255 ( abstimele PGUID 11 f t f t 2 f 16 "702 702" 100 0 0 100 abstimele - )); DATA(insert OID = 255 ( abstimele PGUID 12 f t f t 2 f 16 "702 702" 100 0 0 100 abstimele - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 256 ( abstimege PGUID 11 f t f t 2 f 16 "702 702" 100 0 0 100 abstimege - )); DATA(insert OID = 256 ( abstimege PGUID 12 f t f t 2 f 16 "702 702" 100 0 0 100 abstimege - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 257 ( reltimeeq PGUID 11 f t t t 2 f 16 "703 703" 100 0 0 100 reltimeeq - )); DATA(insert OID = 257 ( reltimeeq PGUID 12 f t t t 2 f 16 "703 703" 100 0 0 100 reltimeeq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 258 ( reltimene PGUID 11 f t t t 2 f 16 "703 703" 100 0 0 100 reltimene - )); DATA(insert OID = 258 ( reltimene PGUID 12 f t t t 2 f 16 "703 703" 100 0 0 100 reltimene - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 259 ( reltimelt PGUID 11 f t t t 2 f 16 "703 703" 100 0 0 100 reltimelt - )); DATA(insert OID = 259 ( reltimelt PGUID 12 f t t t 2 f 16 "703 703" 100 0 0 100 reltimelt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 260 ( reltimegt PGUID 11 f t t t 2 f 16 "703 703" 100 0 0 100 reltimegt - )); DATA(insert OID = 260 ( reltimegt PGUID 12 f t t t 2 f 16 "703 703" 100 0 0 100 reltimegt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 261 ( reltimele PGUID 11 f t t t 2 f 16 "703 703" 100 0 0 100 reltimele - )); DATA(insert OID = 261 ( reltimele PGUID 12 f t t t 2 f 16 "703 703" 100 0 0 100 reltimele - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 262 ( reltimege PGUID 11 f t t t 2 f 16 "703 703" 100 0 0 100 reltimege - )); DATA(insert OID = 262 ( reltimege PGUID 12 f t t t 2 f 16 "703 703" 100 0 0 100 reltimege - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 263 ( tintervalsame PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalsame - )); DATA(insert OID = 263 ( tintervalsame PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalsame - ));
DESCR("same as"); DESCR("same as");
DATA(insert OID = 264 ( tintervalct PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalct - )); DATA(insert OID = 264 ( tintervalct PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalct - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 265 ( tintervalov PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalov - )); DATA(insert OID = 265 ( tintervalov PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalov - ));
DESCR("overlaps"); DESCR("overlaps");
DATA(insert OID = 266 ( tintervalleneq PGUID 11 f t f t 2 f 16 "704 703" 100 0 0 100 tintervalleneq - )); DATA(insert OID = 266 ( tintervalleneq PGUID 12 f t f t 2 f 16 "704 703" 100 0 0 100 tintervalleneq - ));
DESCR("length equal"); DESCR("length equal");
DATA(insert OID = 267 ( tintervallenne PGUID 11 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenne - )); DATA(insert OID = 267 ( tintervallenne PGUID 12 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenne - ));
DESCR("length not equal to"); DESCR("length not equal to");
DATA(insert OID = 268 ( tintervallenlt PGUID 11 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenlt - )); DATA(insert OID = 268 ( tintervallenlt PGUID 12 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenlt - ));
DESCR("length less-than"); DESCR("length less-than");
DATA(insert OID = 269 ( tintervallengt PGUID 11 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallengt - )); DATA(insert OID = 269 ( tintervallengt PGUID 12 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallengt - ));
DESCR("length greater-than"); DESCR("length greater-than");
DATA(insert OID = 270 ( tintervallenle PGUID 11 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenle - )); DATA(insert OID = 270 ( tintervallenle PGUID 12 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenle - ));
DESCR("length less-than-or-equal"); DESCR("length less-than-or-equal");
DATA(insert OID = 271 ( tintervallenge PGUID 11 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenge - )); DATA(insert OID = 271 ( tintervallenge PGUID 12 f t f t 2 f 16 "704 703" 100 0 0 100 tintervallenge - ));
DESCR("length greater-than-or-equal"); DESCR("length greater-than-or-equal");
DATA(insert OID = 272 ( tintervalstart PGUID 11 f t f t 1 f 702 "704" 100 0 0 100 tintervalstart - )); DATA(insert OID = 272 ( tintervalstart PGUID 12 f t f t 1 f 702 "704" 100 0 0 100 tintervalstart - ));
DESCR("start of interval"); DESCR("start of interval");
DATA(insert OID = 273 ( tintervalend PGUID 11 f t f t 1 f 702 "704" 100 0 0 100 tintervalend - )); DATA(insert OID = 273 ( tintervalend PGUID 12 f t f t 1 f 702 "704" 100 0 0 100 tintervalend - ));
DESCR(""); DESCR("");
DATA(insert OID = 274 ( timeofday PGUID 11 f t f t 0 f 25 "0" 100 0 0 100 timeofday - )); DATA(insert OID = 274 ( timeofday PGUID 12 f t f t 0 f 25 "0" 100 0 0 100 timeofday - ));
DESCR("Current date and time with microseconds"); DESCR("Current date and time with microseconds");
DATA(insert OID = 275 ( isfinite PGUID 11 f t f t 1 f 16 "702" 100 0 0 100 abstime_finite - )); DATA(insert OID = 275 ( isfinite PGUID 12 f t f t 1 f 16 "702" 100 0 0 100 abstime_finite - ));
DESCR(""); DESCR("");
DATA(insert OID = 276 ( int2fac PGUID 12 f t t t 1 f 23 "21" 100 0 0 100 int2fac - )); DATA(insert OID = 276 ( int2fac PGUID 12 f t t t 1 f 23 "21" 100 0 0 100 int2fac - ));
...@@ -748,7 +748,7 @@ DATA(insert OID = 356 ( btoidcmp PGUID 12 f t t t 2 f 23 "26 26" 100 0 0 10 ...@@ -748,7 +748,7 @@ DATA(insert OID = 356 ( btoidcmp PGUID 12 f t t t 2 f 23 "26 26" 100 0 0 10
DESCR("btree less-equal-greater"); DESCR("btree less-equal-greater");
DATA(insert OID = 404 ( btoidvectorcmp PGUID 12 f t t t 2 f 23 "30 30" 100 0 0 100 btoidvectorcmp - )); DATA(insert OID = 404 ( btoidvectorcmp PGUID 12 f t t t 2 f 23 "30 30" 100 0 0 100 btoidvectorcmp - ));
DESCR("btree less-equal-greater"); DESCR("btree less-equal-greater");
DATA(insert OID = 357 ( btabstimecmp PGUID 11 f t f t 2 f 23 "702 702" 100 0 0 100 btabstimecmp - )); DATA(insert OID = 357 ( btabstimecmp PGUID 12 f t f t 2 f 23 "702 702" 100 0 0 100 btabstimecmp - ));
DESCR("btree less-equal-greater"); DESCR("btree less-equal-greater");
DATA(insert OID = 358 ( btcharcmp PGUID 12 f t t t 2 f 23 "18 18" 100 0 0 100 btcharcmp - )); DATA(insert OID = 358 ( btcharcmp PGUID 12 f t t t 2 f 23 "18 18" 100 0 0 100 btcharcmp - ));
DESCR("btree less-equal-greater"); DESCR("btree less-equal-greater");
...@@ -894,9 +894,9 @@ DESCR("convert float8 to int8"); ...@@ -894,9 +894,9 @@ DESCR("convert float8 to int8");
/* OIDS 600 - 699 */ /* OIDS 600 - 699 */
DATA(insert OID = 1285 ( int4notin PGUID 11 f t f t 2 f 16 "23 0" 100 0 0 100 int4notin - )); DATA(insert OID = 1285 ( int4notin PGUID 12 f t f t 2 f 16 "23 25" 100 0 0 100 int4notin - ));
DESCR("not in"); DESCR("not in");
DATA(insert OID = 1286 ( oidnotin PGUID 11 f t f t 2 f 16 "26 0" 100 0 0 100 oidnotin - )); DATA(insert OID = 1286 ( oidnotin PGUID 12 f t f t 2 f 16 "26 25" 100 0 0 100 oidnotin - ));
DESCR("not in"); DESCR("not in");
DATA(insert OID = 1287 ( int44in PGUID 12 f t t t 1 f 22 "0" 100 0 0 100 int44in - )); DATA(insert OID = 1287 ( int44in PGUID 12 f t t t 1 f 22 "0" 100 0 0 100 int44in - ));
DESCR("(internal)"); DESCR("(internal)");
...@@ -918,7 +918,7 @@ DESCR("truncate char()"); ...@@ -918,7 +918,7 @@ DESCR("truncate char()");
DATA(insert OID = 669 ( varchar PGUID 11 f t t t 2 f 1043 "1043 23" 100 0 0 100 varchar - )); DATA(insert OID = 669 ( varchar PGUID 11 f t t t 2 f 1043 "1043 23" 100 0 0 100 varchar - ));
DESCR("truncate varchar()"); DESCR("truncate varchar()");
DATA(insert OID = 676 ( mktinterval PGUID 11 f t f t 2 f 704 "702 702" 100 0 0 100 mktinterval - )); DATA(insert OID = 676 ( mktinterval PGUID 12 f t f t 2 f 704 "702 702" 100 0 0 100 mktinterval - ));
DESCR("convert to tinterval"); DESCR("convert to tinterval");
DATA(insert OID = 619 ( oidvectorne PGUID 12 f t t t 2 f 16 "30 30" 100 0 0 100 oidvectorne - )); DATA(insert OID = 619 ( oidvectorne PGUID 12 f t t t 2 f 16 "30 30" 100 0 0 100 oidvectorne - ));
DESCR("less-than"); DESCR("less-than");
...@@ -1012,9 +1012,9 @@ DESCR("storage manager"); ...@@ -1012,9 +1012,9 @@ DESCR("storage manager");
DATA(insert OID = 763 ( smgrne PGUID 12 f t f t 2 f 16 "210 210" 100 0 0 100 smgrne - )); DATA(insert OID = 763 ( smgrne PGUID 12 f t f t 2 f 16 "210 210" 100 0 0 100 smgrne - ));
DESCR("storage manager"); DESCR("storage manager");
DATA(insert OID = 764 ( lo_import PGUID 11 f t f t 1 f 26 "25" 100 0 0 100 lo_import - )); DATA(insert OID = 764 ( lo_import PGUID 12 f t f t 1 f 26 "25" 100 0 0 100 lo_import - ));
DESCR("large object import"); DESCR("large object import");
DATA(insert OID = 765 ( lo_export PGUID 11 f t f t 2 f 23 "26 25" 100 0 0 100 lo_export - )); DATA(insert OID = 765 ( lo_export PGUID 12 f t f t 2 f 23 "26 25" 100 0 0 100 lo_export - ));
DESCR("large object export"); DESCR("large object export");
DATA(insert OID = 766 ( int4inc PGUID 12 f t t t 1 f 23 "23" 100 0 0 100 int4inc - )); DATA(insert OID = 766 ( int4inc PGUID 12 f t t t 1 f 23 "23" 100 0 0 100 int4inc - ));
...@@ -1051,17 +1051,17 @@ DESCR("gist(internal)"); ...@@ -1051,17 +1051,17 @@ DESCR("gist(internal)");
DATA(insert OID = 782 ( gistbuild PGUID 11 f t f t 9 f 23 "0" 100 0 0 100 gistbuild - )); DATA(insert OID = 782 ( gistbuild PGUID 11 f t f t 9 f 23 "0" 100 0 0 100 gistbuild - ));
DESCR("gist(internal)"); DESCR("gist(internal)");
DATA(insert OID = 784 ( tintervaleq PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervaleq - )); DATA(insert OID = 784 ( tintervaleq PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervaleq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 785 ( tintervalne PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalne - )); DATA(insert OID = 785 ( tintervalne PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalne - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 786 ( tintervallt PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervallt - )); DATA(insert OID = 786 ( tintervallt PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervallt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 787 ( tintervalgt PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalgt - )); DATA(insert OID = 787 ( tintervalgt PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalgt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 788 ( tintervalle PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalle - )); DATA(insert OID = 788 ( tintervalle PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalle - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 789 ( tintervalge PGUID 11 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalge - )); DATA(insert OID = 789 ( tintervalge PGUID 12 f t f t 2 f 16 "704 704" 100 0 0 100 tintervalge - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
/* OIDS 800 - 899 */ /* OIDS 800 - 899 */
...@@ -1204,19 +1204,19 @@ DESCR("bool is true (not false or unknown)"); ...@@ -1204,19 +1204,19 @@ DESCR("bool is true (not false or unknown)");
DATA(insert OID = 951 ( isfalse PGUID 12 f t t f 1 f 16 "16" 100 0 0 100 isfalse - )); DATA(insert OID = 951 ( isfalse PGUID 12 f t t f 1 f 16 "16" 100 0 0 100 isfalse - ));
DESCR("bool is false (not true or unknown)"); DESCR("bool is false (not true or unknown)");
DATA(insert OID = 952 ( lo_open PGUID 11 f t f t 2 f 23 "26 23" 100 0 0 100 lo_open - )); DATA(insert OID = 952 ( lo_open PGUID 12 f t f t 2 f 23 "26 23" 100 0 0 100 lo_open - ));
DESCR("large object open"); DESCR("large object open");
DATA(insert OID = 953 ( lo_close PGUID 11 f t f t 1 f 23 "23" 100 0 0 100 lo_close - )); DATA(insert OID = 953 ( lo_close PGUID 12 f t f t 1 f 23 "23" 100 0 0 100 lo_close - ));
DESCR("large object close"); DESCR("large object close");
DATA(insert OID = 954 ( loread PGUID 11 f t f t 2 f 17 "23 23" 100 0 0 100 loread - )); DATA(insert OID = 954 ( loread PGUID 12 f t f t 2 f 17 "23 23" 100 0 0 100 loread - ));
DESCR("large object read"); DESCR("large object read");
DATA(insert OID = 955 ( lowrite PGUID 11 f t f t 2 f 23 "23 17" 100 0 0 100 lowrite - )); DATA(insert OID = 955 ( lowrite PGUID 12 f t f t 2 f 23 "23 17" 100 0 0 100 lowrite - ));
DESCR("large object write"); DESCR("large object write");
DATA(insert OID = 956 ( lo_lseek PGUID 11 f t f t 3 f 23 "23 23 23" 100 0 0 100 lo_lseek - )); DATA(insert OID = 956 ( lo_lseek PGUID 12 f t f t 3 f 23 "23 23 23" 100 0 0 100 lo_lseek - ));
DESCR("large object seek"); DESCR("large object seek");
DATA(insert OID = 957 ( lo_creat PGUID 11 f t f t 1 f 26 "23" 100 0 0 100 lo_creat - )); DATA(insert OID = 957 ( lo_creat PGUID 12 f t f t 1 f 26 "23" 100 0 0 100 lo_creat - ));
DESCR("large object create"); DESCR("large object create");
DATA(insert OID = 958 ( lo_tell PGUID 11 f t f t 1 f 23 "23" 100 0 0 100 lo_tell - )); DATA(insert OID = 958 ( lo_tell PGUID 12 f t f t 1 f 23 "23" 100 0 0 100 lo_tell - ));
DESCR("large object position"); DESCR("large object position");
DATA(insert OID = 959 ( on_pl PGUID 11 f t t t 2 f 16 "600 628" 100 0 10 100 on_pl - )); DATA(insert OID = 959 ( on_pl PGUID 11 f t t t 2 f 16 "600 628" 100 0 10 100 on_pl - ));
...@@ -1230,7 +1230,7 @@ DESCR("closest point to line segment on line"); ...@@ -1230,7 +1230,7 @@ DESCR("closest point to line segment on line");
DATA(insert OID = 963 ( close_lb PGUID 11 f t t t 2 f 600 "628 603" 100 0 10 100 close_lb - )); DATA(insert OID = 963 ( close_lb PGUID 11 f t t t 2 f 600 "628 603" 100 0 10 100 close_lb - ));
DESCR("closest point to line on box"); DESCR("closest point to line on box");
DATA(insert OID = 964 ( lo_unlink PGUID 11 f t f t 1 f 23 "26" 100 0 0 100 lo_unlink - )); DATA(insert OID = 964 ( lo_unlink PGUID 12 f t f t 1 f 23 "26" 100 0 0 100 lo_unlink - ));
DESCR("large object unlink(delete)"); DESCR("large object unlink(delete)");
DATA(insert OID = 972 ( regproctooid PGUID 12 f t t t 1 f 26 "24" 100 0 0 100 regproctooid - )); DATA(insert OID = 972 ( regproctooid PGUID 12 f t t t 1 f 26 "24" 100 0 0 100 regproctooid - ));
DESCR("get oid for regproc"); DESCR("get oid for regproc");
...@@ -1302,7 +1302,7 @@ DATA(insert OID = 1036 ( aclremove PGUID 11 f t f t 2 f 1034 "1034 1033" 10 ...@@ -1302,7 +1302,7 @@ DATA(insert OID = 1036 ( aclremove PGUID 11 f t f t 2 f 1034 "1034 1033" 10
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 1037 ( aclcontains PGUID 11 f t f t 2 f 16 "1034 1033" 100 0 0 100 aclcontains - )); DATA(insert OID = 1037 ( aclcontains PGUID 11 f t f t 2 f 16 "1034 1033" 100 0 0 100 aclcontains - ));
DESCR("matches regex., case-sensitive"); DESCR("matches regex., case-sensitive");
DATA(insert OID = 1038 ( seteval PGUID 11 f t f t 1 f 23 "26" 100 0 0 100 seteval - )); DATA(insert OID = 1038 ( seteval PGUID 12 f t f t 1 f 23 "26" 100 0 0 100 seteval - ));
DESCR(""); DESCR("");
DATA(insert OID = 1044 ( bpcharin PGUID 11 f t t t 3 f 1042 "0 0 23" 100 0 0 100 bpcharin - )); DATA(insert OID = 1044 ( bpcharin PGUID 11 f t t t 3 f 1042 "0 0 23" 100 0 0 100 bpcharin - ));
DESCR("(internal)"); DESCR("(internal)");
...@@ -1345,54 +1345,54 @@ DESCR("hash"); ...@@ -1345,54 +1345,54 @@ DESCR("hash");
DATA(insert OID = 1081 ( hashvarchar PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 hashvarchar - )); DATA(insert OID = 1081 ( hashvarchar PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 hashvarchar - ));
DESCR("hash"); DESCR("hash");
DATA(insert OID = 1084 ( date_in PGUID 11 f t f t 1 f 1082 "0" 100 0 0 100 date_in - )); DATA(insert OID = 1084 ( date_in PGUID 12 f t f t 1 f 1082 "0" 100 0 0 100 date_in - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1085 ( date_out PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 date_out - )); DATA(insert OID = 1085 ( date_out PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 date_out - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1086 ( date_eq PGUID 11 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_eq - )); DATA(insert OID = 1086 ( date_eq PGUID 12 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_eq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 1087 ( date_lt PGUID 11 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_lt - )); DATA(insert OID = 1087 ( date_lt PGUID 12 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_lt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 1088 ( date_le PGUID 11 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_le - )); DATA(insert OID = 1088 ( date_le PGUID 12 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_le - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 1089 ( date_gt PGUID 11 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_gt - )); DATA(insert OID = 1089 ( date_gt PGUID 12 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_gt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 1090 ( date_ge PGUID 11 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_ge - )); DATA(insert OID = 1090 ( date_ge PGUID 12 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_ge - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 1091 ( date_ne PGUID 11 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_ne - )); DATA(insert OID = 1091 ( date_ne PGUID 12 f t t t 2 f 16 "1082 1082" 100 0 0 100 date_ne - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 1092 ( date_cmp PGUID 11 f t t t 2 f 23 "1082 1082" 100 0 0 100 date_cmp - )); DATA(insert OID = 1092 ( date_cmp PGUID 12 f t t t 2 f 23 "1082 1082" 100 0 0 100 date_cmp - ));
DESCR("less-equal-greater"); DESCR("less-equal-greater");
/* OIDS 1100 - 1199 */ /* OIDS 1100 - 1199 */
DATA(insert OID = 1102 ( time_lt PGUID 11 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_lt - )); DATA(insert OID = 1102 ( time_lt PGUID 12 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_lt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 1103 ( time_le PGUID 11 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_le - )); DATA(insert OID = 1103 ( time_le PGUID 12 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_le - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 1104 ( time_gt PGUID 11 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_gt - )); DATA(insert OID = 1104 ( time_gt PGUID 12 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_gt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 1105 ( time_ge PGUID 11 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_ge - )); DATA(insert OID = 1105 ( time_ge PGUID 12 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_ge - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 1106 ( time_ne PGUID 11 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_ne - )); DATA(insert OID = 1106 ( time_ne PGUID 12 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_ne - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 1107 ( time_cmp PGUID 11 f t t t 2 f 23 "1083 1083" 100 0 0 100 time_cmp - )); DATA(insert OID = 1107 ( time_cmp PGUID 12 f t t t 2 f 23 "1083 1083" 100 0 0 100 time_cmp - ));
DESCR("less-equal-greater"); DESCR("less-equal-greater");
DATA(insert OID = 1138 ( date_larger PGUID 11 f t t t 2 f 1082 "1082 1082" 100 0 0 100 date_larger - )); DATA(insert OID = 1138 ( date_larger PGUID 12 f t t t 2 f 1082 "1082 1082" 100 0 0 100 date_larger - ));
DESCR("larger of two"); DESCR("larger of two");
DATA(insert OID = 1139 ( date_smaller PGUID 11 f t t t 2 f 1082 "1082 1082" 100 0 0 100 date_smaller - )); DATA(insert OID = 1139 ( date_smaller PGUID 12 f t t t 2 f 1082 "1082 1082" 100 0 0 100 date_smaller - ));
DESCR("smaller of two"); DESCR("smaller of two");
DATA(insert OID = 1140 ( date_mi PGUID 11 f t t t 2 f 23 "1082 1082" 100 0 0 100 date_mi - )); DATA(insert OID = 1140 ( date_mi PGUID 12 f t t t 2 f 23 "1082 1082" 100 0 0 100 date_mi - ));
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 1141 ( date_pli PGUID 11 f t t t 2 f 1082 "1082 23" 100 0 0 100 date_pli - )); DATA(insert OID = 1141 ( date_pli PGUID 12 f t t t 2 f 1082 "1082 23" 100 0 0 100 date_pli - ));
DESCR("addition"); DESCR("addition");
DATA(insert OID = 1142 ( date_mii PGUID 11 f t t t 2 f 1082 "1082 23" 100 0 0 100 date_mii - )); DATA(insert OID = 1142 ( date_mii PGUID 12 f t t t 2 f 1082 "1082 23" 100 0 0 100 date_mii - ));
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 1143 ( time_in PGUID 11 f t f t 1 f 1083 "0" 100 0 0 100 time_in - )); DATA(insert OID = 1143 ( time_in PGUID 12 f t f t 1 f 1083 "0" 100 0 0 100 time_in - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1144 ( time_out PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 time_out - )); DATA(insert OID = 1144 ( time_out PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 time_out - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1145 ( time_eq PGUID 11 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_eq - )); DATA(insert OID = 1145 ( time_eq PGUID 12 f t t t 2 f 16 "1083 1083" 100 0 0 100 time_eq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 1146 ( circle_add_pt PGUID 11 f t t t 2 f 718 "718 600" 100 0 0 100 circle_add_pt - )); DATA(insert OID = 1146 ( circle_add_pt PGUID 11 f t t t 2 f 718 "718 600" 100 0 0 100 circle_add_pt - ));
...@@ -1404,100 +1404,100 @@ DESCR("multiply"); ...@@ -1404,100 +1404,100 @@ DESCR("multiply");
DATA(insert OID = 1149 ( circle_div_pt PGUID 11 f t t t 2 f 718 "718 600" 100 0 0 100 circle_div_pt - )); DATA(insert OID = 1149 ( circle_div_pt PGUID 11 f t t t 2 f 718 "718 600" 100 0 0 100 circle_div_pt - ));
DESCR("divide"); DESCR("divide");
DATA(insert OID = 1150 ( timestamp_in PGUID 11 f t f t 1 f 1184 "0" 100 0 0 100 timestamp_in - )); DATA(insert OID = 1150 ( timestamp_in PGUID 12 f t f t 1 f 1184 "0" 100 0 0 100 timestamp_in - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1151 ( timestamp_out PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 timestamp_out - )); DATA(insert OID = 1151 ( timestamp_out PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 timestamp_out - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1152 ( timestamp_eq PGUID 11 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_eq - )); DATA(insert OID = 1152 ( timestamp_eq PGUID 12 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_eq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 1153 ( timestamp_ne PGUID 11 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_ne - )); DATA(insert OID = 1153 ( timestamp_ne PGUID 12 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_ne - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 1154 ( timestamp_lt PGUID 11 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_lt - )); DATA(insert OID = 1154 ( timestamp_lt PGUID 12 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_lt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 1155 ( timestamp_le PGUID 11 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_le - )); DATA(insert OID = 1155 ( timestamp_le PGUID 12 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_le - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 1156 ( timestamp_ge PGUID 11 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_ge - )); DATA(insert OID = 1156 ( timestamp_ge PGUID 12 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_ge - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 1157 ( timestamp_gt PGUID 11 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_gt - )); DATA(insert OID = 1157 ( timestamp_gt PGUID 12 f t f t 2 f 16 "1184 1184" 100 0 0 100 timestamp_gt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 1159 ( timezone PGUID 11 f t f t 2 f 25 "25 1184" 100 0 0 100 timestamp_zone - )); DATA(insert OID = 1159 ( timezone PGUID 12 f t f t 2 f 25 "25 1184" 100 0 0 100 timestamp_zone - ));
DESCR("time zone"); DESCR("time zone");
DATA(insert OID = 1160 ( interval_in PGUID 11 f t f t 1 f 1186 "0" 100 0 0 100 interval_in - )); DATA(insert OID = 1160 ( interval_in PGUID 12 f t f t 1 f 1186 "0" 100 0 0 100 interval_in - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1161 ( interval_out PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 interval_out - )); DATA(insert OID = 1161 ( interval_out PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 interval_out - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1162 ( interval_eq PGUID 11 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_eq - )); DATA(insert OID = 1162 ( interval_eq PGUID 12 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_eq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 1163 ( interval_ne PGUID 11 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_ne - )); DATA(insert OID = 1163 ( interval_ne PGUID 12 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_ne - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 1164 ( interval_lt PGUID 11 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_lt - )); DATA(insert OID = 1164 ( interval_lt PGUID 12 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_lt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 1165 ( interval_le PGUID 11 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_le - )); DATA(insert OID = 1165 ( interval_le PGUID 12 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_le - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 1166 ( interval_ge PGUID 11 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_ge - )); DATA(insert OID = 1166 ( interval_ge PGUID 12 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_ge - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 1167 ( interval_gt PGUID 11 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_gt - )); DATA(insert OID = 1167 ( interval_gt PGUID 12 f t f t 2 f 16 "1186 1186" 100 0 0 100 interval_gt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 1168 ( interval_um PGUID 11 f t f t 1 f 1186 "1186" 100 0 0 100 interval_um - )); DATA(insert OID = 1168 ( interval_um PGUID 12 f t f t 1 f 1186 "1186" 100 0 0 100 interval_um - ));
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 1169 ( interval_pl PGUID 11 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_pl - )); DATA(insert OID = 1169 ( interval_pl PGUID 12 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_pl - ));
DESCR("addition"); DESCR("addition");
DATA(insert OID = 1170 ( interval_mi PGUID 11 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_mi - )); DATA(insert OID = 1170 ( interval_mi PGUID 12 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_mi - ));
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 1171 ( date_part PGUID 11 f t f t 2 f 701 "25 1184" 100 0 0 100 timestamp_part - )); DATA(insert OID = 1171 ( date_part PGUID 12 f t f t 2 f 701 "25 1184" 100 0 0 100 timestamp_part - ));
DESCR("extract field from timestamp"); DESCR("extract field from timestamp");
DATA(insert OID = 1172 ( date_part PGUID 11 f t f t 2 f 701 "25 1186" 100 0 0 100 interval_part - )); DATA(insert OID = 1172 ( date_part PGUID 12 f t f t 2 f 701 "25 1186" 100 0 0 100 interval_part - ));
DESCR("extract field from interval"); DESCR("extract field from interval");
DATA(insert OID = 1173 ( timestamp PGUID 11 f t f t 1 f 1184 "702" 100 0 0 100 abstime_timestamp - )); DATA(insert OID = 1173 ( timestamp PGUID 12 f t f t 1 f 1184 "702" 100 0 0 100 abstime_timestamp - ));
DESCR("convert abstime to timestamp"); DESCR("convert abstime to timestamp");
DATA(insert OID = 1174 ( timestamp PGUID 11 f t f t 1 f 1184 "1082" 100 0 0 100 date_timestamp - )); DATA(insert OID = 1174 ( timestamp PGUID 12 f t f t 1 f 1184 "1082" 100 0 0 100 date_timestamp - ));
DESCR("convert date to timestamp"); DESCR("convert date to timestamp");
DATA(insert OID = 1176 ( timestamp PGUID 11 f t f t 2 f 1184 "1082 1083" 100 0 0 100 datetime_timestamp - )); DATA(insert OID = 1176 ( timestamp PGUID 12 f t f t 2 f 1184 "1082 1083" 100 0 0 100 datetime_timestamp - ));
DESCR("convert date and time to timestamp"); DESCR("convert date and time to timestamp");
DATA(insert OID = 1177 ( interval PGUID 11 f t f t 1 f 1186 "703" 100 0 0 100 reltime_interval - )); DATA(insert OID = 1177 ( interval PGUID 12 f t f t 1 f 1186 "703" 100 0 0 100 reltime_interval - ));
DESCR("convert reltime to interval"); DESCR("convert reltime to interval");
DATA(insert OID = 1178 ( date PGUID 11 f t f t 1 f 1082 "1184" 100 0 0 100 timestamp_date - )); DATA(insert OID = 1178 ( date PGUID 12 f t f t 1 f 1082 "1184" 100 0 0 100 timestamp_date - ));
DESCR("convert timestamp to date"); DESCR("convert timestamp to date");
DATA(insert OID = 1179 ( date PGUID 11 f t f t 1 f 1082 "702" 100 0 0 100 abstime_date - )); DATA(insert OID = 1179 ( date PGUID 12 f t f t 1 f 1082 "702" 100 0 0 100 abstime_date - ));
DESCR("convert abstime to date"); DESCR("convert abstime to date");
DATA(insert OID = 1180 ( abstime PGUID 11 f t f t 1 f 702 "1184" 100 0 0 100 timestamp_abstime - )); DATA(insert OID = 1180 ( abstime PGUID 12 f t f t 1 f 702 "1184" 100 0 0 100 timestamp_abstime - ));
DESCR("convert timestamp to abstime"); DESCR("convert timestamp to abstime");
DATA(insert OID = 1188 ( timestamp_mi PGUID 11 f t f t 2 f 1186 "1184 1184" 100 0 0 100 timestamp_mi - )); DATA(insert OID = 1188 ( timestamp_mi PGUID 12 f t f t 2 f 1186 "1184 1184" 100 0 0 100 timestamp_mi - ));
DESCR("subtract"); DESCR("subtract");
DATA(insert OID = 1189 ( timestamp_pl_span PGUID 11 f t f t 2 f 1184 "1184 1186" 100 0 0 100 timestamp_pl_span - )); DATA(insert OID = 1189 ( timestamp_pl_span PGUID 12 f t f t 2 f 1184 "1184 1186" 100 0 0 100 timestamp_pl_span - ));
DESCR("plus"); DESCR("plus");
DATA(insert OID = 1190 ( timestamp_mi_span PGUID 11 f t f t 2 f 1184 "1184 1186" 100 0 0 100 timestamp_mi_span - )); DATA(insert OID = 1190 ( timestamp_mi_span PGUID 12 f t f t 2 f 1184 "1184 1186" 100 0 0 100 timestamp_mi_span - ));
DESCR("minus"); DESCR("minus");
DATA(insert OID = 1191 ( timestamp PGUID 11 f t f t 1 f 1184 "25" 100 0 0 100 text_timestamp - )); DATA(insert OID = 1191 ( timestamp PGUID 12 f t f t 1 f 1184 "25" 100 0 0 100 text_timestamp - ));
DESCR("convert text to timestamp"); DESCR("convert text to timestamp");
DATA(insert OID = 1192 ( text PGUID 11 f t f t 1 f 25 "1184" 100 0 0 100 timestamp_text - )); DATA(insert OID = 1192 ( text PGUID 12 f t f t 1 f 25 "1184" 100 0 0 100 timestamp_text - ));
DESCR("convert timestamp to text"); DESCR("convert timestamp to text");
DATA(insert OID = 1193 ( text PGUID 11 f t f t 1 f 25 "1186" 100 0 0 100 interval_text - )); DATA(insert OID = 1193 ( text PGUID 12 f t f t 1 f 25 "1186" 100 0 0 100 interval_text - ));
DESCR("convert interval to text"); DESCR("convert interval to text");
DATA(insert OID = 1194 ( reltime PGUID 11 f t f t 1 f 703 "1186" 100 0 0 100 interval_reltime - )); DATA(insert OID = 1194 ( reltime PGUID 12 f t f t 1 f 703 "1186" 100 0 0 100 interval_reltime - ));
DESCR("convert interval to reltime"); DESCR("convert interval to reltime");
DATA(insert OID = 1195 ( timestamp_smaller PGUID 11 f t f t 2 f 1184 "1184 1184" 100 0 0 100 timestamp_smaller - )); DATA(insert OID = 1195 ( timestamp_smaller PGUID 12 f t f t 2 f 1184 "1184 1184" 100 0 0 100 timestamp_smaller - ));
DESCR("smaller of two"); DESCR("smaller of two");
DATA(insert OID = 1196 ( timestamp_larger PGUID 11 f t f t 2 f 1184 "1184 1184" 100 0 0 100 timestamp_larger - )); DATA(insert OID = 1196 ( timestamp_larger PGUID 12 f t f t 2 f 1184 "1184 1184" 100 0 0 100 timestamp_larger - ));
DESCR("larger of two"); DESCR("larger of two");
DATA(insert OID = 1197 ( interval_smaller PGUID 11 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_smaller - )); DATA(insert OID = 1197 ( interval_smaller PGUID 12 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_smaller - ));
DESCR("smaller of two"); DESCR("smaller of two");
DATA(insert OID = 1198 ( interval_larger PGUID 11 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_larger - )); DATA(insert OID = 1198 ( interval_larger PGUID 12 f t f t 2 f 1186 "1186 1186" 100 0 0 100 interval_larger - ));
DESCR("larger of two"); DESCR("larger of two");
DATA(insert OID = 1199 ( age PGUID 11 f t f t 2 f 1186 "1184 1184" 100 0 0 100 timestamp_age - )); DATA(insert OID = 1199 ( age PGUID 12 f t f t 2 f 1186 "1184 1184" 100 0 0 100 timestamp_age - ));
DESCR("date difference preserving months and years"); DESCR("date difference preserving months and years");
/* OIDS 1200 - 1299 */ /* OIDS 1200 - 1299 */
DATA(insert OID = 1200 ( reltime PGUID 11 f t t t 1 f 703 "23" 100 0 0 100 int4reltime - )); DATA(insert OID = 1200 ( reltime PGUID 12 f t t t 1 f 703 "23" 100 0 0 100 int4reltime - ));
DESCR("convert int4 to reltime"); DESCR("convert int4 to reltime");
DATA(insert OID = 1217 ( date_trunc PGUID 11 f t f t 2 f 1184 "25 1184" 100 0 0 100 timestamp_trunc - )); DATA(insert OID = 1217 ( date_trunc PGUID 12 f t f t 2 f 1184 "25 1184" 100 0 0 100 timestamp_trunc - ));
DESCR("truncate timestamp to specified units"); DESCR("truncate timestamp to specified units");
DATA(insert OID = 1218 ( date_trunc PGUID 11 f t f t 2 f 1186 "25 1186" 100 0 0 100 interval_trunc - )); DATA(insert OID = 1218 ( date_trunc PGUID 12 f t f t 2 f 1186 "25 1186" 100 0 0 100 interval_trunc - ));
DESCR("truncate interval to specified units"); DESCR("truncate interval to specified units");
DATA(insert OID = 1230 ( int8abs PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8abs - )); DATA(insert OID = 1230 ( int8abs PGUID 11 f t t t 1 f 20 "20" 100 0 0 100 int8abs - ));
...@@ -1522,12 +1522,12 @@ DESCR("absolute value"); ...@@ -1522,12 +1522,12 @@ DESCR("absolute value");
DATA(insert OID = 1253 ( int2abs PGUID 12 f t t t 1 f 21 "21" 100 0 0 100 int2abs - )); DATA(insert OID = 1253 ( int2abs PGUID 12 f t t t 1 f 21 "21" 100 0 0 100 int2abs - ));
DESCR("absolute value"); DESCR("absolute value");
DATA(insert OID = 1263 ( interval PGUID 11 f t f t 1 f 1186 "25" 100 0 0 100 text_interval - )); DATA(insert OID = 1263 ( interval PGUID 12 f t f t 1 f 1186 "25" 100 0 0 100 text_interval - ));
DESCR("convert text to interval"); DESCR("convert text to interval");
DATA(insert OID = 1271 ( overlaps PGUID 11 f t t t 4 f 16 "1266 1266 1266 1266" 100 0 1 0 overlaps_timetz - )); DATA(insert OID = 1271 ( overlaps PGUID 12 f t t t 4 f 16 "1266 1266 1266 1266" 100 0 1 0 overlaps_timetz - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
DATA(insert OID = 1272 ( datetime_pl PGUID 11 f t f t 2 f 1184 "1082 1083" 100 0 0 100 datetime_timestamp - )); DATA(insert OID = 1272 ( datetime_pl PGUID 12 f t f t 2 f 1184 "1082 1083" 100 0 0 100 datetime_timestamp - ));
DESCR("convert date and time to timestamp"); DESCR("convert date and time to timestamp");
DATA(insert OID = 1274 ( int84pl PGUID 11 f t t t 2 f 20 "20 23" 100 0 0 100 int84pl - )); DATA(insert OID = 1274 ( int84pl PGUID 11 f t t t 2 f 20 "20 23" 100 0 0 100 int84pl - ));
...@@ -1559,18 +1559,18 @@ DESCR("truncate _varchar()"); ...@@ -1559,18 +1559,18 @@ DESCR("truncate _varchar()");
DATA(insert OID = 1292 ( tideq PGUID 11 f t f t 2 f 16 "27 27" 100 0 0 100 tideq - )); DATA(insert OID = 1292 ( tideq PGUID 11 f t f t 2 f 16 "27 27" 100 0 0 100 tideq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 1293 ( currtid PGUID 11 f t f t 2 f 27 "26 27" 100 0 0 100 currtid_byreloid - )); DATA(insert OID = 1293 ( currtid PGUID 12 f t f t 2 f 27 "26 27" 100 0 0 100 currtid_byreloid - ));
DESCR("latest tid of a tuple"); DESCR("latest tid of a tuple");
DATA(insert OID = 1294 ( currtid2 PGUID 11 f t f t 2 f 27 "25 27" 100 0 0 100 currtid_byrelname - )); DATA(insert OID = 1294 ( currtid2 PGUID 12 f t f t 2 f 27 "25 27" 100 0 0 100 currtid_byrelname - ));
DESCR("latest tid of a tuple"); DESCR("latest tid of a tuple");
DATA(insert OID = 1296 ( timedate_pl PGUID 14 f t f t 2 f 1184 "1083 1082" 100 0 0 100 "select datetime_pl($2, $1)" - )); DATA(insert OID = 1296 ( timedate_pl PGUID 14 f t f t 2 f 1184 "1083 1082" 100 0 0 100 "select datetime_pl($2, $1)" - ));
DESCR("convert time and date to timestamp"); DESCR("convert time and date to timestamp");
DATA(insert OID = 1297 ( datetimetz_pl PGUID 11 f t f t 2 f 1184 "1082 1266" 100 0 0 100 datetimetz_timestamp - )); DATA(insert OID = 1297 ( datetimetz_pl PGUID 12 f t f t 2 f 1184 "1082 1266" 100 0 0 100 datetimetz_timestamp - ));
DESCR("convert date and time with time zone to timestamp"); DESCR("convert date and time with time zone to timestamp");
DATA(insert OID = 1298 ( timetzdate_pl PGUID 14 f t f t 2 f 1184 "1266 1082" 100 0 0 100 "select datetimetz_pl($2, $1)" - )); DATA(insert OID = 1298 ( timetzdate_pl PGUID 14 f t f t 2 f 1184 "1266 1082" 100 0 0 100 "select datetimetz_pl($2, $1)" - ));
DESCR("convert time with time zone and date to timestamp"); DESCR("convert time with time zone and date to timestamp");
DATA(insert OID = 1299 ( now PGUID 11 f t f t 0 f 1184 "0" 100 0 0 100 now - )); DATA(insert OID = 1299 ( now PGUID 12 f t f t 0 f 1184 "0" 100 0 0 100 now - ));
DESCR("current transaction time"); DESCR("current transaction time");
/* OIDS 1300 - 1399 */ /* OIDS 1300 - 1399 */
...@@ -1584,7 +1584,7 @@ DESCR("restriction selectivity for containment comparison operators"); ...@@ -1584,7 +1584,7 @@ DESCR("restriction selectivity for containment comparison operators");
DATA(insert OID = 1303 ( contjoinsel PGUID 12 f t f t 5 f 701 "26 26 21 26 21" 100 0 0 100 contjoinsel - )); DATA(insert OID = 1303 ( contjoinsel PGUID 12 f t f t 5 f 701 "26 26 21 26 21" 100 0 0 100 contjoinsel - ));
DESCR("join selectivity for containment comparison operators"); DESCR("join selectivity for containment comparison operators");
DATA(insert OID = 1304 ( overlaps PGUID 11 f t t t 4 f 16 "1184 1184 1184 1184" 100 0 1 0 overlaps_timestamp - )); DATA(insert OID = 1304 ( overlaps PGUID 12 f t t t 4 f 16 "1184 1184 1184 1184" 100 0 1 0 overlaps_timestamp - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
DATA(insert OID = 1305 ( overlaps PGUID 14 f t t t 4 f 16 "1184 1186 1184 1186" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, ($3 + $4))" - )); DATA(insert OID = 1305 ( overlaps PGUID 14 f t t t 4 f 16 "1184 1186 1184 1186" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, ($3 + $4))" - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
...@@ -1593,7 +1593,7 @@ DESCR("SQL92 interval comparison"); ...@@ -1593,7 +1593,7 @@ DESCR("SQL92 interval comparison");
DATA(insert OID = 1307 ( overlaps PGUID 14 f t t t 4 f 16 "1184 1186 1184 1184" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, $4)" - )); DATA(insert OID = 1307 ( overlaps PGUID 14 f t t t 4 f 16 "1184 1186 1184 1184" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, $4)" - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
DATA(insert OID = 1308 ( overlaps PGUID 11 f t t t 4 f 16 "1083 1083 1083 1083" 100 0 1 0 overlaps_time - )); DATA(insert OID = 1308 ( overlaps PGUID 12 f t t t 4 f 16 "1083 1083 1083 1083" 100 0 1 0 overlaps_time - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
DATA(insert OID = 1309 ( overlaps PGUID 14 f t t t 4 f 16 "1083 1186 1083 1186" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, ($3 + $4))" - )); DATA(insert OID = 1309 ( overlaps PGUID 14 f t t t 4 f 16 "1083 1186 1083 1186" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, ($3 + $4))" - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
...@@ -1602,11 +1602,11 @@ DESCR("SQL92 interval comparison"); ...@@ -1602,11 +1602,11 @@ DESCR("SQL92 interval comparison");
DATA(insert OID = 1311 ( overlaps PGUID 14 f t t t 4 f 16 "1083 1186 1083 1083" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, $4)" - )); DATA(insert OID = 1311 ( overlaps PGUID 14 f t t t 4 f 16 "1083 1186 1083 1083" 100 0 1 0 "select overlaps($1, ($1 + $2), $3, $4)" - ));
DESCR("SQL92 interval comparison"); DESCR("SQL92 interval comparison");
DATA(insert OID = 1314 ( timestamp_cmp PGUID 11 f t f t 2 f 23 "1184 1184" 100 0 0 100 timestamp_cmp - )); DATA(insert OID = 1314 ( timestamp_cmp PGUID 12 f t f t 2 f 23 "1184 1184" 100 0 0 100 timestamp_cmp - ));
DESCR("less-equal-greater"); DESCR("less-equal-greater");
DATA(insert OID = 1315 ( interval_cmp PGUID 11 f t f t 2 f 23 "1186 1186" 100 0 0 100 interval_cmp - )); DATA(insert OID = 1315 ( interval_cmp PGUID 12 f t f t 2 f 23 "1186 1186" 100 0 0 100 interval_cmp - ));
DESCR("less-equal-greater"); DESCR("less-equal-greater");
DATA(insert OID = 1316 ( time PGUID 11 f t f t 1 f 1083 "1184" 100 0 0 100 timestamp_time - )); DATA(insert OID = 1316 ( time PGUID 12 f t f t 1 f 1083 "1184" 100 0 0 100 timestamp_time - ));
DESCR("convert timestamp to time"); DESCR("convert timestamp to time");
DATA(insert OID = 1317 ( length PGUID 11 f t t t 1 f 23 "25" 100 0 1 0 textlen - )); DATA(insert OID = 1317 ( length PGUID 11 f t t t 1 f 23 "25" 100 0 1 0 textlen - ));
...@@ -1616,7 +1616,7 @@ DESCR("character length"); ...@@ -1616,7 +1616,7 @@ DESCR("character length");
DATA(insert OID = 1319 ( length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharlen - )); DATA(insert OID = 1319 ( length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharlen - ));
DESCR("character length"); DESCR("character length");
DATA(insert OID = 1326 ( interval_div PGUID 11 f t f t 2 f 1186 "1186 701" 100 0 0 100 interval_div - )); DATA(insert OID = 1326 ( interval_div PGUID 12 f t f t 2 f 1186 "1186 701" 100 0 0 100 interval_div - ));
DESCR("divide"); DESCR("divide");
DATA(insert OID = 1339 ( dlog10 PGUID 11 f t t t 1 f 701 "701" 100 0 0 100 dlog10 - )); DATA(insert OID = 1339 ( dlog10 PGUID 11 f t t t 1 f 701 "701" 100 0 0 100 dlog10 - ));
...@@ -1644,25 +1644,25 @@ DATA(insert OID = 1349 ( oidvectortypes PGUID 12 f t f t 1 f 25 "30" 100 0 0 ...@@ -1644,25 +1644,25 @@ DATA(insert OID = 1349 ( oidvectortypes PGUID 12 f t f t 1 f 25 "30" 100 0 0
DESCR("print type names of oidvector field"); DESCR("print type names of oidvector field");
DATA(insert OID = 1350 ( timetz_in PGUID 11 f t f t 1 f 1266 "0" 100 0 0 100 timetz_in - )); DATA(insert OID = 1350 ( timetz_in PGUID 12 f t f t 1 f 1266 "0" 100 0 0 100 timetz_in - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1351 ( timetz_out PGUID 11 f t f t 1 f 23 "0" 100 0 0 100 timetz_out - )); DATA(insert OID = 1351 ( timetz_out PGUID 12 f t f t 1 f 23 "0" 100 0 0 100 timetz_out - ));
DESCR("(internal)"); DESCR("(internal)");
DATA(insert OID = 1352 ( timetz_eq PGUID 11 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_eq - )); DATA(insert OID = 1352 ( timetz_eq PGUID 12 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_eq - ));
DESCR("equal"); DESCR("equal");
DATA(insert OID = 1353 ( timetz_ne PGUID 11 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_ne - )); DATA(insert OID = 1353 ( timetz_ne PGUID 12 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_ne - ));
DESCR("not equal"); DESCR("not equal");
DATA(insert OID = 1354 ( timetz_lt PGUID 11 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_lt - )); DATA(insert OID = 1354 ( timetz_lt PGUID 12 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_lt - ));
DESCR("less-than"); DESCR("less-than");
DATA(insert OID = 1355 ( timetz_le PGUID 11 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_le - )); DATA(insert OID = 1355 ( timetz_le PGUID 12 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_le - ));
DESCR("less-than-or-equal"); DESCR("less-than-or-equal");
DATA(insert OID = 1356 ( timetz_ge PGUID 11 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_ge - )); DATA(insert OID = 1356 ( timetz_ge PGUID 12 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_ge - ));
DESCR("greater-than-or-equal"); DESCR("greater-than-or-equal");
DATA(insert OID = 1357 ( timetz_gt PGUID 11 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_gt - )); DATA(insert OID = 1357 ( timetz_gt PGUID 12 f t t t 2 f 16 "1266 1266" 100 0 0 100 timetz_gt - ));
DESCR("greater-than"); DESCR("greater-than");
DATA(insert OID = 1358 ( timetz_cmp PGUID 11 f t t t 2 f 23 "1266 1266" 100 0 0 100 timetz_cmp - )); DATA(insert OID = 1358 ( timetz_cmp PGUID 12 f t t t 2 f 23 "1266 1266" 100 0 0 100 timetz_cmp - ));
DESCR("less-equal-greater"); DESCR("less-equal-greater");
DATA(insert OID = 1359 ( timestamp PGUID 11 f t f t 2 f 1184 "1082 1266" 100 0 0 100 datetimetz_timestamp - )); DATA(insert OID = 1359 ( timestamp PGUID 12 f t f t 2 f 1184 "1082 1266" 100 0 0 100 datetimetz_timestamp - ));
DESCR("convert date and time with time zone to timestamp"); DESCR("convert date and time with time zone to timestamp");
DATA(insert OID = 1362 ( time PGUID 14 f t t t 1 f 1083 "1083" 100 0 0 100 "select $1" - )); DATA(insert OID = 1362 ( time PGUID 14 f t t t 1 f 1083 "1083" 100 0 0 100 "select $1" - ));
...@@ -1677,7 +1677,7 @@ DATA(insert OID = 1368 ( timestamp PGUID 14 f t f t 1 f 1184 "1184" 100 0 0 ...@@ -1677,7 +1677,7 @@ DATA(insert OID = 1368 ( timestamp PGUID 14 f t f t 1 f 1184 "1184" 100 0 0
DESCR("convert (noop)"); DESCR("convert (noop)");
DATA(insert OID = 1369 ( interval PGUID 14 f t t t 1 f 1186 "1186" 100 0 0 100 "select $1" - )); DATA(insert OID = 1369 ( interval PGUID 14 f t t t 1 f 1186 "1186" 100 0 0 100 "select $1" - ));
DESCR("convert (noop)"); DESCR("convert (noop)");
DATA(insert OID = 1370 ( interval PGUID 11 f t f t 1 f 1186 "1083" 100 0 0 100 time_interval - )); DATA(insert OID = 1370 ( interval PGUID 12 f t f t 1 f 1186 "1083" 100 0 0 100 time_interval - ));
DESCR("convert time to interval"); DESCR("convert time to interval");
DATA(insert OID = 1371 ( date PGUID 14 f t t t 1 f 1082 "1082" 100 0 0 100 "select $1" - )); DATA(insert OID = 1371 ( date PGUID 14 f t t t 1 f 1082 "1082" 100 0 0 100 "select $1" - ));
DESCR("convert (noop)"); DESCR("convert (noop)");
...@@ -1693,13 +1693,13 @@ DESCR("octet length"); ...@@ -1693,13 +1693,13 @@ DESCR("octet length");
DATA(insert OID = 1376 ( octet_length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharoctetlen - )); DATA(insert OID = 1376 ( octet_length PGUID 11 f t t t 1 f 23 "1043" 100 0 0 100 varcharoctetlen - ));
DESCR("octet length"); DESCR("octet length");
DATA(insert OID = 1377 ( time_larger PGUID 11 f t t t 2 f 1083 "1083 1083" 100 0 0 100 time_larger - )); DATA(insert OID = 1377 ( time_larger PGUID 12 f t t t 2 f 1083 "1083 1083" 100 0 0 100 time_larger - ));
DESCR("larger of two"); DESCR("larger of two");
DATA(insert OID = 1378 ( time_smaller PGUID 11 f t t t 2 f 1083 "1083 1083" 100 0 0 100 time_smaller - )); DATA(insert OID = 1378 ( time_smaller PGUID 12 f t t t 2 f 1083 "1083 1083" 100 0 0 100 time_smaller - ));
DESCR("smaller of two"); DESCR("smaller of two");
DATA(insert OID = 1379 ( timetz_larger PGUID 11 f t t t 2 f 1083 "1266 1266" 100 0 0 100 timetz_larger - )); DATA(insert OID = 1379 ( timetz_larger PGUID 12 f t t t 2 f 1266 "1266 1266" 100 0 0 100 timetz_larger - ));
DESCR("larger of two"); DESCR("larger of two");
DATA(insert OID = 1380 ( timetz_smaller PGUID 11 f t t t 2 f 1083 "1266 1266" 100 0 0 100 timetz_smaller - )); DATA(insert OID = 1380 ( timetz_smaller PGUID 12 f t t t 2 f 1266 "1266 1266" 100 0 0 100 timetz_smaller - ));
DESCR("smaller of two"); DESCR("smaller of two");
DATA(insert OID = 1381 ( char_length PGUID 11 f t t t 1 f 23 "25" 100 0 1 0 textlen - )); DATA(insert OID = 1381 ( char_length PGUID 11 f t t t 1 f 23 "25" 100 0 1 0 textlen - ));
...@@ -1718,12 +1718,12 @@ DESCR("date difference from today preserving months and years"); ...@@ -1718,12 +1718,12 @@ DESCR("date difference from today preserving months and years");
DATA(insert OID = 1387 ( timetz PGUID 14 f t f t 1 f 1266 "1266" 100 0 0 100 "select $1" - )); DATA(insert OID = 1387 ( timetz PGUID 14 f t f t 1 f 1266 "1266" 100 0 0 100 "select $1" - ));
DESCR("noop conversion"); DESCR("noop conversion");
DATA(insert OID = 1388 ( timetz PGUID 11 f t f t 1 f 1266 "1184" 100 0 0 100 timestamp_timetz - )); DATA(insert OID = 1388 ( timetz PGUID 12 f t f t 1 f 1266 "1184" 100 0 0 100 timestamp_timetz - ));
DESCR("convert timestamp to time"); DESCR("convert timestamp to timetz");
DATA(insert OID = 1389 ( isfinite PGUID 11 f t f t 1 f 16 "1184" 100 0 0 100 timestamp_finite - )); DATA(insert OID = 1389 ( isfinite PGUID 12 f t f t 1 f 16 "1184" 100 0 0 100 timestamp_finite - ));
DESCR("boolean test"); DESCR("boolean test");
DATA(insert OID = 1390 ( isfinite PGUID 11 f t f t 1 f 16 "1186" 100 0 0 100 interval_finite - )); DATA(insert OID = 1390 ( isfinite PGUID 12 f t f t 1 f 16 "1186" 100 0 0 100 interval_finite - ));
DESCR("boolean test"); DESCR("boolean test");
...@@ -1915,7 +1915,7 @@ DATA(insert OID = 1479 ( circle PGUID 11 f t t t 1 f 718 "603" 100 0 1 0 box_ ...@@ -1915,7 +1915,7 @@ DATA(insert OID = 1479 ( circle PGUID 11 f t t t 1 f 718 "603" 100 0 1 0 box_
DESCR("convert box to circle"); DESCR("convert box to circle");
DATA(insert OID = 1480 ( box PGUID 11 f t t t 1 f 603 "718" 100 0 1 0 circle_box - )); DATA(insert OID = 1480 ( box PGUID 11 f t t t 1 f 603 "718" 100 0 1 0 circle_box - ));
DESCR("convert circle to box"); DESCR("convert circle to box");
DATA(insert OID = 1481 ( tinterval PGUID 11 f t f t 2 f 704 "702 702" 100 0 0 100 mktinterval - )); DATA(insert OID = 1481 ( tinterval PGUID 12 f t f t 2 f 704 "702 702" 100 0 0 100 mktinterval - ));
DESCR("convert to tinterval"); DESCR("convert to tinterval");
DATA(insert OID = 1482 ( lseg_ne PGUID 11 f t t t 2 f 16 "601 601" 100 0 0 100 lseg_ne - )); DATA(insert OID = 1482 ( lseg_ne PGUID 11 f t t t 2 f 16 "601 601" 100 0 0 100 lseg_ne - ));
...@@ -2060,7 +2060,7 @@ DESCR("radians to degrees"); ...@@ -2060,7 +2060,7 @@ DESCR("radians to degrees");
DATA(insert OID = 1610 ( pi PGUID 11 f t t t 0 f 701 "0" 100 0 0 100 dpi - )); DATA(insert OID = 1610 ( pi PGUID 11 f t t t 0 f 701 "0" 100 0 0 100 dpi - ));
DESCR("PI"); DESCR("PI");
DATA(insert OID = 1618 ( interval_mul PGUID 11 f t t t 2 f 1186 "1186 701" 100 0 0 100 interval_mul - )); DATA(insert OID = 1618 ( interval_mul PGUID 12 f t t t 2 f 1186 "1186 701" 100 0 0 100 interval_mul - ));
DESCR("multiply interval"); DESCR("multiply interval");
DATA(insert OID = 1619 ( varchar PGUID 12 f t t t 1 f 1043 "23" 100 0 0 100 int4_text - )); DATA(insert OID = 1619 ( varchar PGUID 12 f t t t 1 f 1043 "23" 100 0 0 100 int4_text - ));
DESCR("convert int4 to varchar"); DESCR("convert int4 to varchar");
...@@ -2074,7 +2074,7 @@ DESCR("replicate string int4 times"); ...@@ -2074,7 +2074,7 @@ DESCR("replicate string int4 times");
DATA(insert OID = 1623 ( varchar PGUID 11 f t t t 1 f 1043 "20" 100 0 0 100 int8_text - )); DATA(insert OID = 1623 ( varchar PGUID 11 f t t t 1 f 1043 "20" 100 0 0 100 int8_text - ));
DESCR("convert int8 to varchar"); DESCR("convert int8 to varchar");
DATA(insert OID = 1624 ( mul_d_interval PGUID 11 f t t t 2 f 1186 "701 1186" 100 0 0 100 mul_d_interval - )); DATA(insert OID = 1624 ( mul_d_interval PGUID 12 f t t t 2 f 1186 "701 1186" 100 0 0 100 mul_d_interval - ));
/* OID's 1625 - 1639 LZTEXT data type */ /* OID's 1625 - 1639 LZTEXT data type */
DATA(insert OID = 1626 ( lztextin PGUID 11 f t t t 1 f 1625 "0" 100 0 0 100 lztextin - )); DATA(insert OID = 1626 ( lztextin PGUID 11 f t t t 1 f 1625 "0" 100 0 0 100 lztextin - ));
...@@ -2164,7 +2164,7 @@ DATA(insert OID = 1641 ( pg_get_viewdef PGUID 11 f t f t 1 f 25 "19" 100 0 0 ...@@ -2164,7 +2164,7 @@ DATA(insert OID = 1641 ( pg_get_viewdef PGUID 11 f t f t 1 f 25 "19" 100 0 0
DESCR("select statement of a view"); DESCR("select statement of a view");
DATA(insert OID = 1642 ( pg_get_userbyid PGUID 11 f t f t 1 f 19 "23" 100 0 0 100 pg_get_userbyid - )); DATA(insert OID = 1642 ( pg_get_userbyid PGUID 11 f t f t 1 f 19 "23" 100 0 0 100 pg_get_userbyid - ));
DESCR("user name by UID (with fallback)"); DESCR("user name by UID (with fallback)");
DATA(insert OID = 1643 ( pg_get_indexdef PGUID 11 f t f t 1 f 25 "26" 100 0 0 100 pg_get_indexdef - )); DATA(insert OID = 1643 ( pg_get_indexdef PGUID 12 f t f t 1 f 25 "26" 100 0 0 100 pg_get_indexdef - ));
DESCR("index description"); DESCR("index description");
/* Generic referential integrity constraint triggers */ /* Generic referential integrity constraint triggers */
...@@ -2425,7 +2425,7 @@ DATA(insert OID = 1783 ( int2 PGUID 12 f t t t 1 f 21 "1700" 100 0 0 100 nu ...@@ -2425,7 +2425,7 @@ DATA(insert OID = 1783 ( int2 PGUID 12 f t t t 1 f 21 "1700" 100 0 0 100 nu
DESCR("(internal)"); DESCR("(internal)");
/* formatting */ /* formatting */
DATA(insert OID = 1770 ( to_char PGUID 11 f t f t 2 f 25 "1184 25" 100 0 0 100 timestamp_to_char - )); DATA(insert OID = 1770 ( to_char PGUID 12 f t f t 2 f 25 "1184 25" 100 0 0 100 timestamp_to_char - ));
DESCR("format timestamp to text"); DESCR("format timestamp to text");
DATA(insert OID = 1772 ( to_char PGUID 11 f t f t 2 f 25 "1700 25" 100 0 0 100 numeric_to_char - )); DATA(insert OID = 1772 ( to_char PGUID 11 f t f t 2 f 25 "1700 25" 100 0 0 100 numeric_to_char - ));
DESCR("format numeric to text"); DESCR("format numeric to text");
...@@ -2439,9 +2439,9 @@ DATA(insert OID = 1776 ( to_char PGUID 11 f t f t 2 f 25 "701 25" 100 0 0 100 ...@@ -2439,9 +2439,9 @@ DATA(insert OID = 1776 ( to_char PGUID 11 f t f t 2 f 25 "701 25" 100 0 0 100
DESCR("format float8 to text"); DESCR("format float8 to text");
DATA(insert OID = 1777 ( to_number PGUID 11 f t f t 2 f 1700 "25 25" 100 0 0 100 numeric_to_number - )); DATA(insert OID = 1777 ( to_number PGUID 11 f t f t 2 f 1700 "25 25" 100 0 0 100 numeric_to_number - ));
DESCR("convert text to numeric"); DESCR("convert text to numeric");
DATA(insert OID = 1778 ( to_timestamp PGUID 11 f t f t 2 f 1184 "25 25" 100 0 0 100 to_timestamp - )); DATA(insert OID = 1778 ( to_timestamp PGUID 12 f t f t 2 f 1184 "25 25" 100 0 0 100 to_timestamp - ));
DESCR("convert text to timestamp"); DESCR("convert text to timestamp");
DATA(insert OID = 1780 ( to_date PGUID 11 f t f t 2 f 1082 "25 25" 100 0 0 100 to_date - )); DATA(insert OID = 1780 ( to_date PGUID 12 f t f t 2 f 1082 "25 25" 100 0 0 100 to_date - ));
DESCR("convert text to date"); DESCR("convert text to date");
DATA(insert OID = 1798 ( oidin PGUID 12 f t t t 1 f 26 "0" 100 0 0 100 oidin - )); DATA(insert OID = 1798 ( oidin PGUID 12 f t t t 1 f 26 "0" 100 0 0 100 oidin - ));
......
...@@ -7,39 +7,43 @@ ...@@ -7,39 +7,43 @@
* 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: be-fsstubs.h,v 1.10 2000/01/26 05:58:12 momjian Exp $ * $Id: be-fsstubs.h,v 1.11 2000/06/09 01:11:12 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#ifndef BE_FSSTUBS_H #ifndef BE_FSSTUBS_H
#define BE_FSSTUBS_H #define BE_FSSTUBS_H
/* Redefine names LOread() and LOwrite() to be lowercase to allow calling #include "fmgr.h"
* using the new v6.1 case-insensitive SQL parser. Define macros to allow
* the existing code to stay the same. - tgl 97/05/03 /*
* LO functions available via pg_proc entries
*/ */
extern Datum lo_import(PG_FUNCTION_ARGS);
extern Datum lo_export(PG_FUNCTION_ARGS);
extern Datum lo_creat(PG_FUNCTION_ARGS);
#define LOread(f,l) loread(f,l) extern Datum lo_open(PG_FUNCTION_ARGS);
#define LOwrite(f,b) lowrite(f,b) extern Datum lo_close(PG_FUNCTION_ARGS);
extern Oid lo_import(text *filename); extern Datum loread(PG_FUNCTION_ARGS);
extern int4 lo_export(Oid lobjId, text *filename); extern Datum lowrite(PG_FUNCTION_ARGS);
extern Oid lo_creat(int mode); extern Datum lo_lseek(PG_FUNCTION_ARGS);
extern Datum lo_tell(PG_FUNCTION_ARGS);
extern Datum lo_unlink(PG_FUNCTION_ARGS);
extern int lo_open(Oid lobjId, int mode); /*
extern int lo_close(int fd); * These are not fmgr-callable, but are available to C code.
* Probably these should have had the underscore-free names,
* but too late now...
*/
extern int lo_read(int fd, char *buf, int len); extern int lo_read(int fd, char *buf, int len);
extern int lo_write(int fd, char *buf, int len); extern int lo_write(int fd, char *buf, int len);
extern int lo_lseek(int fd, int offset, int whence);
extern int lo_tell(int fd);
extern int lo_unlink(Oid lobjId);
extern struct varlena *loread(int fd, int len);
extern int lowrite(int fd, struct varlena * wbuf);
/* /*
* Added for buffer leak prevention [ Pascal Andr <andre@via.ecp.fr> ] * Cleanup LOs at xact commit/abort [ Pascal Andr <andre@via.ecp.fr> ]
*/ */
extern void lo_commit(bool isCommit); extern void lo_commit(bool isCommit);
......
...@@ -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: builtins.h,v 1.114 2000/06/08 22:37:58 momjian Exp $ * $Id: builtins.h,v 1.115 2000/06/09 01:11:14 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -180,7 +180,7 @@ extern Datum btfloat4cmp(PG_FUNCTION_ARGS); ...@@ -180,7 +180,7 @@ extern Datum btfloat4cmp(PG_FUNCTION_ARGS);
extern Datum btfloat8cmp(PG_FUNCTION_ARGS); extern Datum btfloat8cmp(PG_FUNCTION_ARGS);
extern Datum btoidcmp(PG_FUNCTION_ARGS); extern Datum btoidcmp(PG_FUNCTION_ARGS);
extern Datum btoidvectorcmp(PG_FUNCTION_ARGS); extern Datum btoidvectorcmp(PG_FUNCTION_ARGS);
extern int32 btabstimecmp(AbsoluteTime a, AbsoluteTime b); extern Datum btabstimecmp(PG_FUNCTION_ARGS);
extern Datum btcharcmp(PG_FUNCTION_ARGS); extern Datum btcharcmp(PG_FUNCTION_ARGS);
extern Datum btnamecmp(PG_FUNCTION_ARGS); extern Datum btnamecmp(PG_FUNCTION_ARGS);
extern Datum bttextcmp(PG_FUNCTION_ARGS); extern Datum bttextcmp(PG_FUNCTION_ARGS);
...@@ -309,8 +309,8 @@ extern Datum oidsrand(PG_FUNCTION_ARGS); ...@@ -309,8 +309,8 @@ extern Datum oidsrand(PG_FUNCTION_ARGS);
extern Datum userfntest(PG_FUNCTION_ARGS); extern Datum userfntest(PG_FUNCTION_ARGS);
/* not_in.c */ /* not_in.c */
extern bool int4notin(int32 not_in_arg, char *relation_and_attr); extern Datum int4notin(PG_FUNCTION_ARGS);
extern bool oidnotin(Oid the_oid, char *compare); extern Datum oidnotin(PG_FUNCTION_ARGS);
/* oid.c */ /* oid.c */
extern Datum oidvectorin(PG_FUNCTION_ARGS); extern Datum oidvectorin(PG_FUNCTION_ARGS);
...@@ -353,7 +353,7 @@ extern Datum regproctooid(PG_FUNCTION_ARGS); ...@@ -353,7 +353,7 @@ extern Datum regproctooid(PG_FUNCTION_ARGS);
/* ruleutils.c */ /* ruleutils.c */
extern text *pg_get_ruledef(NameData *rname); extern text *pg_get_ruledef(NameData *rname);
extern text *pg_get_viewdef(NameData *rname); extern text *pg_get_viewdef(NameData *rname);
extern text *pg_get_indexdef(Oid indexrelid); extern Datum pg_get_indexdef(PG_FUNCTION_ARGS);
extern NameData *pg_get_userbyid(int32 uid); extern NameData *pg_get_userbyid(int32 uid);
extern char *deparse_expression(Node *expr, List *rangetables, extern char *deparse_expression(Node *expr, List *rangetables,
bool forceprefix); bool forceprefix);
...@@ -407,8 +407,8 @@ extern char *make_greater_string(const char *str, Oid datatype); ...@@ -407,8 +407,8 @@ extern char *make_greater_string(const char *str, Oid datatype);
extern ItemPointer tidin(const char *str); extern ItemPointer tidin(const char *str);
extern char *tidout(ItemPointer itemPtr); extern char *tidout(ItemPointer itemPtr);
extern bool tideq(ItemPointer, ItemPointer); extern bool tideq(ItemPointer, ItemPointer);
extern ItemPointer currtid_byreloid(Oid relOid, ItemPointer); extern Datum currtid_byreloid(PG_FUNCTION_ARGS);
extern ItemPointer currtid_byrelname(const text *relName, ItemPointer); extern Datum currtid_byrelname(PG_FUNCTION_ARGS);
/* varchar.c */ /* varchar.c */
......
...@@ -7,13 +7,16 @@ ...@@ -7,13 +7,16 @@
* 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: date.h,v 1.3 2000/04/12 17:16:54 momjian Exp $ * $Id: date.h,v 1.4 2000/06/09 01:11:15 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#ifndef DATE_H #ifndef DATE_H
#define DATE_H #define DATE_H
#include "fmgr.h"
typedef int32 DateADT; typedef int32 DateADT;
typedef float8 TimeADT; typedef float8 TimeADT;
...@@ -25,56 +28,77 @@ typedef struct ...@@ -25,56 +28,77 @@ typedef struct
int4 zone; /* numeric time zone, in seconds */ int4 zone; /* numeric time zone, in seconds */
} TimeTzADT; } TimeTzADT;
/*
* Macros for fmgr-callable functions.
*
* For TimeADT, we make use of the same support routines as for float8.
* Therefore TimeADT is pass-by-reference if and only if float8 is!
*/
#define DatumGetDateADT(X) ((DateADT) DatumGetInt32(X))
#define DatumGetTimeADT(X) ((TimeADT) DatumGetFloat8(X))
#define DatumGetTimeTzADTP(X) ((TimeTzADT *) DatumGetPointer(X))
#define DateADTGetDatum(X) Int32GetDatum(X)
#define TimeADTGetDatum(X) Float8GetDatum(X)
#define TimeTzADTPGetDatum(X) PointerGetDatum(X)
#define PG_GETARG_DATEADT(n) DatumGetDateADT(PG_GETARG_DATUM(n))
#define PG_GETARG_TIMEADT(n) DatumGetTimeADT(PG_GETARG_DATUM(n))
#define PG_GETARG_TIMETZADT_P(n) DatumGetTimeTzADTP(PG_GETARG_DATUM(n))
#define PG_RETURN_DATEADT(x) return DateADTGetDatum(x)
#define PG_RETURN_TIMEADT(x) return TimeADTGetDatum(x)
#define PG_RETURN_TIMETZADT_P(x) return TimeTzADTPGetDatum(x)
/* date.c */ /* date.c */
extern DateADT date_in(char *datestr); extern Datum date_in(PG_FUNCTION_ARGS);
extern char *date_out(DateADT dateVal); extern Datum date_out(PG_FUNCTION_ARGS);
extern bool date_eq(DateADT dateVal1, DateADT dateVal2); extern Datum date_eq(PG_FUNCTION_ARGS);
extern bool date_ne(DateADT dateVal1, DateADT dateVal2); extern Datum date_ne(PG_FUNCTION_ARGS);
extern bool date_lt(DateADT dateVal1, DateADT dateVal2); extern Datum date_lt(PG_FUNCTION_ARGS);
extern bool date_le(DateADT dateVal1, DateADT dateVal2); extern Datum date_le(PG_FUNCTION_ARGS);
extern bool date_gt(DateADT dateVal1, DateADT dateVal2); extern Datum date_gt(PG_FUNCTION_ARGS);
extern bool date_ge(DateADT dateVal1, DateADT dateVal2); extern Datum date_ge(PG_FUNCTION_ARGS);
extern int date_cmp(DateADT dateVal1, DateADT dateVal2); extern Datum date_cmp(PG_FUNCTION_ARGS);
extern DateADT date_larger(DateADT dateVal1, DateADT dateVal2); extern Datum date_larger(PG_FUNCTION_ARGS);
extern DateADT date_smaller(DateADT dateVal1, DateADT dateVal2); extern Datum date_smaller(PG_FUNCTION_ARGS);
extern int32 date_mi(DateADT dateVal1, DateADT dateVal2); extern Datum date_mi(PG_FUNCTION_ARGS);
extern DateADT date_pli(DateADT dateVal, int32 days); extern Datum date_pli(PG_FUNCTION_ARGS);
extern DateADT date_mii(DateADT dateVal, int32 days); extern Datum date_mii(PG_FUNCTION_ARGS);
extern Timestamp *date_timestamp(DateADT date); extern Datum date_timestamp(PG_FUNCTION_ARGS);
extern DateADT timestamp_date(Timestamp *timestamp); extern Datum timestamp_date(PG_FUNCTION_ARGS);
extern Timestamp *datetime_timestamp(DateADT date, TimeADT *time); extern Datum datetime_timestamp(PG_FUNCTION_ARGS);
extern DateADT abstime_date(AbsoluteTime abstime); extern Datum abstime_date(PG_FUNCTION_ARGS);
extern TimeADT *time_in(char *timestr); extern Datum time_in(PG_FUNCTION_ARGS);
extern char *time_out(TimeADT *time); extern Datum time_out(PG_FUNCTION_ARGS);
extern bool time_eq(TimeADT *time1, TimeADT *time2); extern Datum time_eq(PG_FUNCTION_ARGS);
extern bool time_ne(TimeADT *time1, TimeADT *time2); extern Datum time_ne(PG_FUNCTION_ARGS);
extern bool time_lt(TimeADT *time1, TimeADT *time2); extern Datum time_lt(PG_FUNCTION_ARGS);
extern bool time_le(TimeADT *time1, TimeADT *time2); extern Datum time_le(PG_FUNCTION_ARGS);
extern bool time_gt(TimeADT *time1, TimeADT *time2); extern Datum time_gt(PG_FUNCTION_ARGS);
extern bool time_ge(TimeADT *time1, TimeADT *time2); extern Datum time_ge(PG_FUNCTION_ARGS);
extern int time_cmp(TimeADT *time1, TimeADT *time2); extern Datum time_cmp(PG_FUNCTION_ARGS);
extern bool overlaps_time(TimeADT *time1, TimeADT *time2, extern Datum overlaps_time(PG_FUNCTION_ARGS);
TimeADT *time3, TimeADT *time4); extern Datum time_larger(PG_FUNCTION_ARGS);
extern TimeADT *time_larger(TimeADT *time1, TimeADT *time2); extern Datum time_smaller(PG_FUNCTION_ARGS);
extern TimeADT *time_smaller(TimeADT *time1, TimeADT *time2); extern Datum timestamp_time(PG_FUNCTION_ARGS);
extern TimeADT *timestamp_time(Timestamp *timestamp); extern Datum time_interval(PG_FUNCTION_ARGS);
extern Interval *time_interval(TimeADT *time);
extern TimeTzADT *timetz_in(char *timestr); extern Datum timetz_in(PG_FUNCTION_ARGS);
extern char *timetz_out(TimeTzADT *time); extern Datum timetz_out(PG_FUNCTION_ARGS);
extern bool timetz_eq(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_eq(PG_FUNCTION_ARGS);
extern bool timetz_ne(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_ne(PG_FUNCTION_ARGS);
extern bool timetz_lt(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_lt(PG_FUNCTION_ARGS);
extern bool timetz_le(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_le(PG_FUNCTION_ARGS);
extern bool timetz_gt(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_gt(PG_FUNCTION_ARGS);
extern bool timetz_ge(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_ge(PG_FUNCTION_ARGS);
extern int timetz_cmp(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_cmp(PG_FUNCTION_ARGS);
extern bool overlaps_timetz(TimeTzADT *time1, TimeTzADT *time2, extern Datum overlaps_timetz(PG_FUNCTION_ARGS);
TimeTzADT *time3, TimeTzADT *time4); extern Datum timetz_larger(PG_FUNCTION_ARGS);
extern TimeTzADT *timetz_larger(TimeTzADT *time1, TimeTzADT *time2); extern Datum timetz_smaller(PG_FUNCTION_ARGS);
extern TimeTzADT *timetz_smaller(TimeTzADT *time1, TimeTzADT *time2); extern Datum timestamp_timetz(PG_FUNCTION_ARGS);
extern TimeTzADT *timestamp_timetz(Timestamp *timestamp); extern Datum datetimetz_timestamp(PG_FUNCTION_ARGS);
extern Timestamp *datetimetz_timestamp(DateADT date, TimeTzADT *time);
#endif /* DATE_H */ #endif /* DATE_H */
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.h * formatting.h
* *
* $Id: formatting.h,v 1.4 2000/04/12 17:16:55 momjian Exp $ * $Id: formatting.h,v 1.5 2000/06/09 01:11:15 tgl Exp $
* *
* *
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
...@@ -18,9 +18,12 @@ ...@@ -18,9 +18,12 @@
#ifndef _FORMATTING_H_ #ifndef _FORMATTING_H_
#define _FORMATTING_H_ #define _FORMATTING_H_
extern text *timestamp_to_char(Timestamp *dt, text *fmt); #include "fmgr.h"
extern Timestamp *to_timestamp(text *date_str, text *fmt);
extern DateADT to_date(text *date_str, text *fmt);
extern Datum timestamp_to_char(PG_FUNCTION_ARGS);
extern Datum to_timestamp(PG_FUNCTION_ARGS);
extern Datum to_date(PG_FUNCTION_ARGS);
extern Numeric numeric_to_number(text *value, text *fmt); extern Numeric numeric_to_number(text *value, text *fmt);
extern text *numeric_to_char(Numeric value, text *fmt); extern text *numeric_to_char(Numeric value, text *fmt);
extern text *int4_to_char(int32 value, text *fmt); extern text *int4_to_char(int32 value, text *fmt);
......
...@@ -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: nabstime.h,v 1.25 2000/04/12 17:16:55 momjian Exp $ * $Id: nabstime.h,v 1.26 2000/06/09 01:11:15 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -15,13 +15,15 @@ ...@@ -15,13 +15,15 @@
#define NABSTIME_H #define NABSTIME_H
#include <time.h> #include <time.h>
#include "fmgr.h"
#include "utils/timestamp.h" #include "utils/timestamp.h"
#include "utils/datetime.h" #include "utils/datetime.h"
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* time types + support macros
* *
* time types + support macros
* *
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
...@@ -39,8 +41,28 @@ typedef struct ...@@ -39,8 +41,28 @@ typedef struct
int32 status; int32 status;
AbsoluteTime data[2]; AbsoluteTime data[2];
} TimeIntervalData; } TimeIntervalData;
typedef TimeIntervalData *TimeInterval; typedef TimeIntervalData *TimeInterval;
/*
* Macros for fmgr-callable functions.
*/
#define DatumGetAbsoluteTime(X) ((AbsoluteTime) DatumGetInt32(X))
#define DatumGetRelativeTime(X) ((RelativeTime) DatumGetInt32(X))
#define DatumGetTimeInterval(X) ((TimeInterval) DatumGetPointer(X))
#define AbsoluteTimeGetDatum(X) Int32GetDatum(X)
#define RelativeTimeGetDatum(X) Int32GetDatum(X)
#define TimeIntervalGetDatum(X) PointerGetDatum(X)
#define PG_GETARG_ABSOLUTETIME(n) DatumGetAbsoluteTime(PG_GETARG_DATUM(n))
#define PG_GETARG_RELATIVETIME(n) DatumGetRelativeTime(PG_GETARG_DATUM(n))
#define PG_GETARG_TIMEINTERVAL(n) DatumGetTimeInterval(PG_GETARG_DATUM(n))
#define PG_RETURN_ABSOLUTETIME(x) return AbsoluteTimeGetDatum(x)
#define PG_RETURN_RELATIVETIME(x) return RelativeTimeGetDatum(x)
#define PG_RETURN_TIMEINTERVAL(x) return TimeIntervalGetDatum(x)
/* /*
* Reserved values * Reserved values
* Epoch is Unix system time zero, but needs to be kept as a reserved * Epoch is Unix system time zero, but needs to be kept as a reserved
...@@ -78,21 +100,9 @@ typedef TimeIntervalData *TimeInterval; ...@@ -78,21 +100,9 @@ typedef TimeIntervalData *TimeInterval;
((bool) (((AbsoluteTime) time) < NOEND_ABSTIME && \ ((bool) (((AbsoluteTime) time) < NOEND_ABSTIME && \
((AbsoluteTime) time) > NOSTART_ABSTIME)) ((AbsoluteTime) time) > NOSTART_ABSTIME))
/* have to include this because EPOCH_ABSTIME used to be invalid - yuk */
#define AbsoluteTimeIsBackwardCompatiblyValid(time) \
((bool) (((AbsoluteTime) time) != INVALID_ABSTIME && \
((AbsoluteTime) time) > EPOCH_ABSTIME))
#define AbsoluteTimeIsBackwardCompatiblyReal(time) \
((bool) (((AbsoluteTime) time) < NOEND_ABSTIME && \
((AbsoluteTime) time) > NOSTART_ABSTIME && \
((AbsoluteTime) time) > EPOCH_ABSTIME))
#define RelativeTimeIsValid(time) \ #define RelativeTimeIsValid(time) \
((bool) (((RelativeTime) time) != INVALID_RELTIME)) ((bool) (((RelativeTime) time) != INVALID_RELTIME))
extern AbsoluteTime GetCurrentAbsoluteTime(void);
/* /*
* getSystemTime * getSystemTime
* Returns system time. * Returns system time.
...@@ -104,62 +114,62 @@ extern AbsoluteTime GetCurrentAbsoluteTime(void); ...@@ -104,62 +114,62 @@ extern AbsoluteTime GetCurrentAbsoluteTime(void);
/* /*
* nabstime.c prototypes * nabstime.c prototypes
*/ */
extern AbsoluteTime nabstimein(char *timestr); extern Datum nabstimein(PG_FUNCTION_ARGS);
extern char *nabstimeout(AbsoluteTime time); extern Datum nabstimeout(PG_FUNCTION_ARGS);
extern bool abstimeeq(AbsoluteTime t1, AbsoluteTime t2); extern Datum abstimeeq(PG_FUNCTION_ARGS);
extern bool abstimene(AbsoluteTime t1, AbsoluteTime t2); extern Datum abstimene(PG_FUNCTION_ARGS);
extern bool abstimelt(AbsoluteTime t1, AbsoluteTime t2); extern Datum abstimelt(PG_FUNCTION_ARGS);
extern bool abstimegt(AbsoluteTime t1, AbsoluteTime t2); extern Datum abstimegt(PG_FUNCTION_ARGS);
extern bool abstimele(AbsoluteTime t1, AbsoluteTime t2); extern Datum abstimele(PG_FUNCTION_ARGS);
extern bool abstimege(AbsoluteTime t1, AbsoluteTime t2); extern Datum abstimege(PG_FUNCTION_ARGS);
extern bool abstime_finite(AbsoluteTime time); extern Datum abstime_finite(PG_FUNCTION_ARGS);
extern AbsoluteTime timestamp_abstime(Timestamp *timestamp); extern Datum timestamp_abstime(PG_FUNCTION_ARGS);
extern Timestamp *abstime_timestamp(AbsoluteTime abstime); extern Datum abstime_timestamp(PG_FUNCTION_ARGS);
extern Datum reltimein(PG_FUNCTION_ARGS);
extern Datum reltimeout(PG_FUNCTION_ARGS);
extern Datum tintervalin(PG_FUNCTION_ARGS);
extern Datum tintervalout(PG_FUNCTION_ARGS);
extern Datum interval_reltime(PG_FUNCTION_ARGS);
extern Datum reltime_interval(PG_FUNCTION_ARGS);
extern Datum mktinterval(PG_FUNCTION_ARGS);
extern Datum timepl(PG_FUNCTION_ARGS);
extern Datum timemi(PG_FUNCTION_ARGS);
extern Datum intinterval(PG_FUNCTION_ARGS);
extern Datum tintervalrel(PG_FUNCTION_ARGS);
extern Datum timenow(PG_FUNCTION_ARGS);
extern Datum reltimeeq(PG_FUNCTION_ARGS);
extern Datum reltimene(PG_FUNCTION_ARGS);
extern Datum reltimelt(PG_FUNCTION_ARGS);
extern Datum reltimegt(PG_FUNCTION_ARGS);
extern Datum reltimele(PG_FUNCTION_ARGS);
extern Datum reltimege(PG_FUNCTION_ARGS);
extern Datum tintervalsame(PG_FUNCTION_ARGS);
extern Datum tintervaleq(PG_FUNCTION_ARGS);
extern Datum tintervalne(PG_FUNCTION_ARGS);
extern Datum tintervallt(PG_FUNCTION_ARGS);
extern Datum tintervalgt(PG_FUNCTION_ARGS);
extern Datum tintervalle(PG_FUNCTION_ARGS);
extern Datum tintervalge(PG_FUNCTION_ARGS);
extern Datum tintervalleneq(PG_FUNCTION_ARGS);
extern Datum tintervallenne(PG_FUNCTION_ARGS);
extern Datum tintervallenlt(PG_FUNCTION_ARGS);
extern Datum tintervallengt(PG_FUNCTION_ARGS);
extern Datum tintervallenle(PG_FUNCTION_ARGS);
extern Datum tintervallenge(PG_FUNCTION_ARGS);
extern Datum tintervalct(PG_FUNCTION_ARGS);
extern Datum tintervalov(PG_FUNCTION_ARGS);
extern Datum tintervalstart(PG_FUNCTION_ARGS);
extern Datum tintervalend(PG_FUNCTION_ARGS);
extern Datum int4reltime(PG_FUNCTION_ARGS);
extern Datum timeofday(PG_FUNCTION_ARGS);
/* non-fmgr-callable support routines */
extern AbsoluteTime GetCurrentAbsoluteTime(void);
extern bool AbsoluteTimeIsBefore(AbsoluteTime time1, AbsoluteTime time2); extern bool AbsoluteTimeIsBefore(AbsoluteTime time1, AbsoluteTime time2);
extern void abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char *tzn); extern void abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char *tzn);
extern RelativeTime reltimein(char *timestring);
extern char *reltimeout(RelativeTime timevalue);
extern TimeInterval tintervalin(char *intervalstr);
extern char *tintervalout(TimeInterval interval);
extern RelativeTime interval_reltime(Interval *interval);
extern Interval *reltime_interval(RelativeTime reltime);
extern TimeInterval mktinterval(AbsoluteTime t1, AbsoluteTime t2);
extern AbsoluteTime timepl(AbsoluteTime t1, RelativeTime t2);
extern AbsoluteTime timemi(AbsoluteTime t1, RelativeTime t2);
/* extern RelativeTime abstimemi(AbsoluteTime t1, AbsoluteTime t2); static*/
extern int intinterval(AbsoluteTime t, TimeInterval interval);
extern RelativeTime tintervalrel(TimeInterval interval);
extern AbsoluteTime timenow(void);
extern bool reltimeeq(RelativeTime t1, RelativeTime t2);
extern bool reltimene(RelativeTime t1, RelativeTime t2);
extern bool reltimelt(RelativeTime t1, RelativeTime t2);
extern bool reltimegt(RelativeTime t1, RelativeTime t2);
extern bool reltimele(RelativeTime t1, RelativeTime t2);
extern bool reltimege(RelativeTime t1, RelativeTime t2);
extern bool tintervalsame(TimeInterval i1, TimeInterval i2);
extern bool tintervaleq(TimeInterval i1, TimeInterval i2);
extern bool tintervalne(TimeInterval i1, TimeInterval i2);
extern bool tintervallt(TimeInterval i1, TimeInterval i2);
extern bool tintervalgt(TimeInterval i1, TimeInterval i2);
extern bool tintervalle(TimeInterval i1, TimeInterval i2);
extern bool tintervalge(TimeInterval i1, TimeInterval i2);
extern bool tintervalleneq(TimeInterval i, RelativeTime t);
extern bool tintervallenne(TimeInterval i, RelativeTime t);
extern bool tintervallenlt(TimeInterval i, RelativeTime t);
extern bool tintervallengt(TimeInterval i, RelativeTime t);
extern bool tintervallenle(TimeInterval i, RelativeTime t);
extern bool tintervallenge(TimeInterval i, RelativeTime t);
extern bool tintervalct(TimeInterval i1, TimeInterval i2);
extern bool tintervalov(TimeInterval i1, TimeInterval i2);
extern AbsoluteTime tintervalstart(TimeInterval i);
extern AbsoluteTime tintervalend(TimeInterval i);
extern int32 int4reltime(int32 timevalue);
extern text *timeofday(void);
#endif /* NABSTIME_H */ #endif /* NABSTIME_H */
...@@ -7,17 +7,20 @@ ...@@ -7,17 +7,20 @@
* 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: sets.h,v 1.6 2000/01/26 05:58:38 momjian Exp $ * $Id: sets.h,v 1.7 2000/06/09 01:11:15 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#ifndef SETS_H #ifndef SETS_H
#define SETS_H #define SETS_H
#include "fmgr.h"
/* Temporary name of set, before SetDefine changes it. */ /* Temporary name of set, before SetDefine changes it. */
#define GENERICSETNAME "zyxset" #define GENERICSETNAME "zyxset"
extern Oid SetDefine(char *querystr, char *typename); extern Oid SetDefine(char *querystr, char *typename);
extern int seteval(Oid funcoid); extern Datum seteval(PG_FUNCTION_ARGS);
#endif /* SETS_H */ #endif /* SETS_H */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,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: timestamp.h,v 1.5 2000/06/08 22:37:58 momjian Exp $ * $Id: timestamp.h,v 1.6 2000/06/09 01:11:15 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -17,6 +17,9 @@ ...@@ -17,6 +17,9 @@
#include <math.h> #include <math.h>
#include <limits.h> #include <limits.h>
#include "fmgr.h"
/* /*
* Timestamp represents absolute time. * Timestamp represents absolute time.
* Interval represents delta time. Keep track of months (and years) * Interval represents delta time. Keep track of months (and years)
...@@ -38,6 +41,25 @@ typedef struct ...@@ -38,6 +41,25 @@ typedef struct
} Interval; } Interval;
/*
* Macros for fmgr-callable functions.
*
* For Timestamp, we make use of the same support routines as for float8.
* Therefore Timestamp is pass-by-reference if and only if float8 is!
*/
#define DatumGetTimestamp(X) ((Timestamp) DatumGetFloat8(X))
#define DatumGetIntervalP(X) ((Interval *) DatumGetPointer(X))
#define TimestampGetDatum(X) Float8GetDatum(X)
#define IntervalPGetDatum(X) PointerGetDatum(X)
#define PG_GETARG_TIMESTAMP(n) DatumGetTimestamp(PG_GETARG_DATUM(n))
#define PG_GETARG_INTERVAL_P(n) DatumGetIntervalP(PG_GETARG_DATUM(n))
#define PG_RETURN_TIMESTAMP(x) return TimestampGetDatum(x)
#define PG_RETURN_INTERVAL_P(x) return IntervalPGetDatum(x)
#ifdef NAN #ifdef NAN
#define DT_INVALID (NAN) #define DT_INVALID (NAN)
#else #else
...@@ -105,59 +127,63 @@ extern int timestamp_is_epoch(double j); ...@@ -105,59 +127,63 @@ extern int timestamp_is_epoch(double j);
* timestamp.c prototypes * timestamp.c prototypes
*/ */
extern Timestamp *timestamp_in(char *str); extern Datum timestamp_in(PG_FUNCTION_ARGS);
extern char *timestamp_out(Timestamp *dt); extern Datum timestamp_out(PG_FUNCTION_ARGS);
extern bool timestamp_eq(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_eq(PG_FUNCTION_ARGS);
extern bool timestamp_ne(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_ne(PG_FUNCTION_ARGS);
extern bool timestamp_lt(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_lt(PG_FUNCTION_ARGS);
extern bool timestamp_le(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_le(PG_FUNCTION_ARGS);
extern bool timestamp_ge(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_ge(PG_FUNCTION_ARGS);
extern bool timestamp_gt(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_gt(PG_FUNCTION_ARGS);
extern bool timestamp_finite(Timestamp *timestamp); extern Datum timestamp_finite(PG_FUNCTION_ARGS);
extern int timestamp_cmp(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_cmp(PG_FUNCTION_ARGS);
extern Timestamp *timestamp_smaller(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_smaller(PG_FUNCTION_ARGS);
extern Timestamp *timestamp_larger(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_larger(PG_FUNCTION_ARGS);
extern Interval *interval_in(char *str); extern Datum interval_in(PG_FUNCTION_ARGS);
extern char *interval_out(Interval *span); extern Datum interval_out(PG_FUNCTION_ARGS);
extern bool interval_eq(Interval *span1, Interval *span2); extern Datum interval_eq(PG_FUNCTION_ARGS);
extern bool interval_ne(Interval *span1, Interval *span2); extern Datum interval_ne(PG_FUNCTION_ARGS);
extern bool interval_lt(Interval *span1, Interval *span2); extern Datum interval_lt(PG_FUNCTION_ARGS);
extern bool interval_le(Interval *span1, Interval *span2); extern Datum interval_le(PG_FUNCTION_ARGS);
extern bool interval_ge(Interval *span1, Interval *span2); extern Datum interval_ge(PG_FUNCTION_ARGS);
extern bool interval_gt(Interval *span1, Interval *span2); extern Datum interval_gt(PG_FUNCTION_ARGS);
extern bool interval_finite(Interval *span); extern Datum interval_finite(PG_FUNCTION_ARGS);
extern int interval_cmp(Interval *span1, Interval *span2); extern Datum interval_cmp(PG_FUNCTION_ARGS);
extern Interval *interval_smaller(Interval *span1, Interval *span2); extern Datum interval_smaller(PG_FUNCTION_ARGS);
extern Interval *interval_larger(Interval *span1, Interval *span2); extern Datum interval_larger(PG_FUNCTION_ARGS);
extern text *timestamp_text(Timestamp *timestamp); extern Datum timestamp_text(PG_FUNCTION_ARGS);
extern Timestamp *text_timestamp(text *str); extern Datum text_timestamp(PG_FUNCTION_ARGS);
extern text *interval_text(Interval *interval); extern Datum interval_text(PG_FUNCTION_ARGS);
extern Interval *text_interval(text *str); extern Datum text_interval(PG_FUNCTION_ARGS);
extern Timestamp *timestamp_trunc(text *units, Timestamp *timestamp); extern Datum timestamp_trunc(PG_FUNCTION_ARGS);
extern Interval *interval_trunc(text *units, Interval *interval); extern Datum interval_trunc(PG_FUNCTION_ARGS);
extern float64 timestamp_part(text *units, Timestamp *timestamp); extern Datum timestamp_part(PG_FUNCTION_ARGS);
extern float64 interval_part(text *units, Interval *interval); extern Datum interval_part(PG_FUNCTION_ARGS);
extern text *timestamp_zone(text *zone, Timestamp *timestamp); extern Datum timestamp_zone(PG_FUNCTION_ARGS);
extern Interval *interval_um(Interval *span); extern Datum interval_um(PG_FUNCTION_ARGS);
extern Interval *interval_pl(Interval *span1, Interval *span2); extern Datum interval_pl(PG_FUNCTION_ARGS);
extern Interval *interval_mi(Interval *span1, Interval *span2); extern Datum interval_mi(PG_FUNCTION_ARGS);
extern Interval *interval_mul(Interval *span1, float8 *factor); extern Datum interval_mul(PG_FUNCTION_ARGS);
extern Interval *mul_d_interval(float8 *factor, Interval *span1); extern Datum mul_d_interval(PG_FUNCTION_ARGS);
extern Interval *interval_div(Interval *span1, float8 *factor); extern Datum interval_div(PG_FUNCTION_ARGS);
extern Interval *timestamp_mi(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_mi(PG_FUNCTION_ARGS);
extern Timestamp *timestamp_pl_span(Timestamp *dt, Interval *span); extern Datum timestamp_pl_span(PG_FUNCTION_ARGS);
extern Timestamp *timestamp_mi_span(Timestamp *dt, Interval *span); extern Datum timestamp_mi_span(PG_FUNCTION_ARGS);
extern Interval *timestamp_age(Timestamp *dt1, Timestamp *dt2); extern Datum timestamp_age(PG_FUNCTION_ARGS);
extern bool overlaps_timestamp(Timestamp *dt1, Timestamp *dt2, Timestamp *dt3, Timestamp *dt4); extern Datum overlaps_timestamp(PG_FUNCTION_ARGS);
extern Datum now(PG_FUNCTION_ARGS);
/* Internal routines (not fmgr-callable) */
extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt); extern int tm2timestamp(struct tm * tm, double fsec, int *tzp, Timestamp *dt);
extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, double *fsec, char **tzn); extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm,
double *fsec, char **tzn);
extern Timestamp SetTimestamp(Timestamp timestamp); extern Timestamp SetTimestamp(Timestamp timestamp);
extern Timestamp *now(void);
#endif /* TIMESTAMP_H */ #endif /* TIMESTAMP_H */
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/tutorial/Attic/beard.c,v 1.3 2000/01/26 05:58:51 momjian Exp $ * $Header: /cvsroot/pgsql/src/tutorial/Attic/beard.c,v 1.4 2000/06/09 01:11:16 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -34,7 +34,10 @@ beard(Oid picture) ...@@ -34,7 +34,10 @@ beard(Oid picture)
char buf[BUFSIZE]; char buf[BUFSIZE];
int cc; int cc;
if ((pic_fd = lo_open(picture, INV_READ)) == -1) pic_fd = DatumGetInt32(DirectFunctionCall2(lo_open,
ObjectIdGetDatum(picture),
Int32GetDatum(INV_READ)));
if (pic_fd < 0)
elog(ERROR, "Cannot access picture large object"); elog(ERROR, "Cannot access picture large object");
if (lo_read(pic_fd, (char *) &ihdr, sizeof(ihdr)) != sizeof(ihdr)) if (lo_read(pic_fd, (char *) &ihdr, sizeof(ihdr)) != sizeof(ihdr))
...@@ -45,21 +48,31 @@ beard(Oid picture) ...@@ -45,21 +48,31 @@ beard(Oid picture)
/* /*
* new large object * new large object
*/ */
if ((beard = lo_creat(INV_MD)) == 0) /* ?? is this right? */ beard = DatumGetObjectId(DirectFunctionCall1(lo_creat,
Int32GetDatum(INV_MD)));
if (beard == InvalidOid)
elog(ERROR, "Cannot create new large object"); elog(ERROR, "Cannot create new large object");
if ((beard_fd = lo_open(beard, INV_WRITE)) == -1) beard_fd = DatumGetInt32(DirectFunctionCall2(lo_open,
ObjectIdGetDatum(beard),
Int32GetDatum(INV_WRITE)));
if (beard_fd < 0)
elog(ERROR, "Cannot access beard large object"); elog(ERROR, "Cannot access beard large object");
lo_lseek(pic_fd, beardOffset, SET_CUR); if (DatumGetInt32(DirectFunctionCall3(lo_lseek,
Int32GetDatum(pic_fd),
Int32GetDatum(beardOffset),
Int32GetDatum(SEEK_SET))) < 0)
elog(ERROR, "Cannot seek in picture large object");
while ((cc = lo_read(pic_fd, buf, BUFSIZE)) > 0) while ((cc = lo_read(pic_fd, buf, BUFSIZE)) > 0)
{ {
if (lo_write(beard_fd, buf, cc) != cc) if (lo_write(beard_fd, buf, cc) != cc)
elog(ERROR, "error while writing large object"); elog(ERROR, "error while writing large object");
} }
lo_close(pic_fd); DirectFunctionCall1(lo_close, Int32GetDatum(pic_fd));
lo_close(beard_fd); DirectFunctionCall1(lo_close, Int32GetDatum(beard_fd));
return beard; return beard;
} }
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