Commit 48165ec2 authored by Tom Lane's avatar Tom Lane

Latest round of fmgr updates. All functions with bool,char, or int2

inputs have been converted to newstyle.  This should go a long way towards
fixing our portability problems with platforms where char and short
parameters are passed differently from int-width parameters.  Still
more to do for the Alpha port however.
parent c61db5ba
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.25 2000/04/12 17:14:44 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.26 2000/06/05 07:28:35 tgl Exp $
* *
* NOTES * NOTES
* These functions are stored in pg_amproc. For each operator class * These functions are stored in pg_amproc. For each operator class
...@@ -21,134 +21,132 @@ ...@@ -21,134 +21,132 @@
#include "access/hash.h" #include "access/hash.h"
uint32 Datum
hashint2(int16 key) hashint2(PG_FUNCTION_ARGS)
{ {
return (uint32) ~key; PG_RETURN_UINT32((uint32) ~ PG_GETARG_INT16(0));
} }
uint32 Datum
hashint4(uint32 key) hashint4(PG_FUNCTION_ARGS)
{ {
return ~key; PG_RETURN_UINT32(~ PG_GETARG_UINT32(0));
} }
uint32 Datum
hashint8(int64 *key) hashint8(PG_FUNCTION_ARGS)
{ {
return ~((uint32) *key); /* we just use the low 32 bits... */
PG_RETURN_UINT32(~((uint32) PG_GETARG_INT64(0)));
} }
/* Hash function from Chris Torek. */ /* Hash function from Chris Torek. */
uint32 Datum
hashfloat4(float32 keyp) hashfloat4(PG_FUNCTION_ARGS)
{ {
int len; float4 key = PG_GETARG_FLOAT4(0);
char *kp = (char *) &key;
int len = sizeof(key);
int loop; int loop;
uint32 h; uint32 h;
char *kp = (char *) keyp;
len = sizeof(float32data);
#define HASH4a h = (h << 5) - h + *kp++; #define HASH4a h = (h << 5) - h + *kp++;
#define HASH4b h = (h << 5) + h + *kp++; #define HASH4b h = (h << 5) + h + *kp++;
#define HASH4 HASH4b #define HASH4 HASH4b
h = 0; h = 0;
if (len > 0) /*
{ * This is a tad silly, given that we expect len = 4, but a smart
loop = (len + 8 - 1) >> 3; * compiler should be able to eliminate the redundant code...
*/
loop = (len + 8 - 1) >> 3;
switch (len & (8 - 1)) switch (len & (8 - 1))
{ {
case 0: case 0:
do do
{ /* All fall throughs */ { /* All fall throughs */
HASH4; HASH4;
case 7: case 7:
HASH4; HASH4;
case 6: case 6:
HASH4; HASH4;
case 5: case 5:
HASH4; HASH4;
case 4: case 4:
HASH4; HASH4;
case 3: case 3:
HASH4; HASH4;
case 2: case 2:
HASH4; HASH4;
case 1: case 1:
HASH4; HASH4;
} while (--loop); } while (--loop);
}
} }
return h; PG_RETURN_UINT32(h);
} }
Datum
uint32 hashfloat8(PG_FUNCTION_ARGS)
hashfloat8(float64 keyp)
{ {
int len; float8 key = PG_GETARG_FLOAT8(0);
char *kp = (char *) &key;
int len = sizeof(key);
int loop; int loop;
uint32 h; uint32 h;
char *kp = (char *) keyp;
len = sizeof(float64data);
#define HASH4a h = (h << 5) - h + *kp++; #define HASH4a h = (h << 5) - h + *kp++;
#define HASH4b h = (h << 5) + h + *kp++; #define HASH4b h = (h << 5) + h + *kp++;
#define HASH4 HASH4b #define HASH4 HASH4b
h = 0; h = 0;
if (len > 0) /*
{ * This is a tad silly, given that we expect len = 8, but a smart
loop = (len + 8 - 1) >> 3; * compiler should be able to eliminate the redundant code...
*/
loop = (len + 8 - 1) >> 3;
switch (len & (8 - 1)) switch (len & (8 - 1))
{ {
case 0: case 0:
do do
{ /* All fall throughs */ { /* All fall throughs */
HASH4; HASH4;
case 7: case 7:
HASH4; HASH4;
case 6: case 6:
HASH4; HASH4;
case 5: case 5:
HASH4; HASH4;
case 4: case 4:
HASH4; HASH4;
case 3: case 3:
HASH4; HASH4;
case 2: case 2:
HASH4; HASH4;
case 1: case 1:
HASH4; HASH4;
} while (--loop); } while (--loop);
}
} }
return h; PG_RETURN_UINT32(h);
} }
Datum
uint32 hashoid(PG_FUNCTION_ARGS)
hashoid(Oid key)
{ {
return (uint32) ~key; PG_RETURN_UINT32(~(uint32) PG_GETARG_OID(0));
} }
uint32 Datum
hashoidvector(Oid *key) hashoidvector(PG_FUNCTION_ARGS)
{ {
Oid *key = (Oid *) PG_GETARG_POINTER(0);
int i; int i;
uint32 result = 0; uint32 result = 0;
for (i = INDEX_MAX_KEYS; --i >= 0;) for (i = INDEX_MAX_KEYS; --i >= 0;)
result = (result << 1) ^ (~(uint32) key[i]); result = (result << 1) ^ (~(uint32) key[i]);
return result; PG_RETURN_UINT32(result);
} }
/* /*
...@@ -156,55 +154,50 @@ hashoidvector(Oid *key) ...@@ -156,55 +154,50 @@ hashoidvector(Oid *key)
* hash function, because it has no pg_proc entry. We only need it * hash function, because it has no pg_proc entry. We only need it
* for catcache indexing. * for catcache indexing.
*/ */
uint32 Datum
hashint2vector(int16 *key) hashint2vector(PG_FUNCTION_ARGS)
{ {
int16 *key = (int16 *) PG_GETARG_POINTER(0);
int i; int i;
uint32 result = 0; uint32 result = 0;
for (i = INDEX_MAX_KEYS; --i >= 0;) for (i = INDEX_MAX_KEYS; --i >= 0;)
result = (result << 1) ^ (~(uint32) key[i]); result = (result << 1) ^ (~(uint32) key[i]);
return result; PG_RETURN_UINT32(result);
} }
#define PRIME1 37 #define PRIME1 37
#define PRIME2 1048583 #define PRIME2 1048583
uint32 Datum
hashchar(char key) hashchar(PG_FUNCTION_ARGS)
{ {
uint32 h; uint32 h;
/* Convert char to integer */ /* Convert char to integer */
h = (key - ' '); h = (PG_GETARG_CHAR(0) - ' ');
h %= PRIME2; h %= PRIME2;
return h; PG_RETURN_UINT32(h);
} }
Datum
uint32 hashname(PG_FUNCTION_ARGS)
hashname(NameData *n)
{ {
char *key = NameStr(* PG_GETARG_NAME(0));
int len = NAMEDATALEN;
uint32 h; uint32 h;
int len;
char *key;
key = NameStr(*n);
h = 0; h = 0;
len = NAMEDATALEN;
/* Convert string to integer */ /* Convert string to integer */
while (len--) while (len--)
h = h * PRIME1 ^ (*key++ - ' '); h = h * PRIME1 ^ (*key++ - ' ');
h %= PRIME2; h %= PRIME2;
return h; PG_RETURN_UINT32(h);
} }
/* /*
* (Comment from the original db3 hashing code: ) * (Comment from the original db3 hashing code: )
* *
...@@ -216,19 +209,17 @@ hashname(NameData *n) ...@@ -216,19 +209,17 @@ hashname(NameData *n)
* *
* "OZ's original sdbm hash" * "OZ's original sdbm hash"
*/ */
uint32 Datum
hashtext(struct varlena * key) hashtext(PG_FUNCTION_ARGS)
{ {
text *key = PG_GETARG_TEXT_P(0);
int keylen; int keylen;
char *keydata; char *keydata;
uint32 n; uint32 n;
int loop; int loop;
keydata = VARDATA(key); keydata = VARDATA(key);
keylen = VARSIZE(key); keylen = VARSIZE(key) - VARHDRSZ;
/* keylen includes the four bytes in which string keylength is stored */
keylen -= sizeof(VARSIZE(key));
#define HASHC n = *keydata++ + 65599 * n #define HASHC n = *keydata++ + 65599 * n
...@@ -260,5 +251,5 @@ hashtext(struct varlena * key) ...@@ -260,5 +251,5 @@ hashtext(struct varlena * key)
} while (--loop); } while (--loop);
} }
} }
return n; PG_RETURN_UINT32(n);
} }
...@@ -8,141 +8,203 @@ ...@@ -8,141 +8,203 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.34 2000/04/12 17:14:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.35 2000/06/05 07:28:36 tgl Exp $
* *
* NOTES * NOTES
* These functions are stored in pg_amproc. For each operator class *
* defined on btrees, they compute * These functions are stored in pg_amproc. For each operator class
* defined on btrees, they compute
* *
* compare(a, b): * compare(a, b):
* < 0 if a < b, * < 0 if a < b,
* = 0 if a == b, * = 0 if a == b,
* > 0 if a > b. * > 0 if a > b.
*
* The result is always an int32 regardless of the input datatype.
*
* NOTE: although any negative int32 is acceptable for reporting "<",
* and any positive int32 is acceptable for reporting ">", routines
* that work on 32-bit or wider datatypes can't just return "a - b".
* That could overflow and give the wrong answer.
*
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres.h" #include "postgres.h"
#include "utils/builtins.h" #include "utils/builtins.h"
int32 Datum
btint2cmp(int16 a, int16 b) btboolcmp(PG_FUNCTION_ARGS)
{ {
return (int32) (a - b); bool a = PG_GETARG_BOOL(0);
bool b = PG_GETARG_BOOL(1);
PG_RETURN_INT32((int32) a - (int32) b);
} }
int32 Datum
btint4cmp(int32 a, int32 b) btint2cmp(PG_FUNCTION_ARGS)
{
int16 a = PG_GETARG_INT16(0);
int16 b = PG_GETARG_INT16(1);
PG_RETURN_INT32((int32) a - (int32) b);
}
Datum
btint4cmp(PG_FUNCTION_ARGS)
{ {
int32 a = PG_GETARG_INT32(0);
int32 b = PG_GETARG_INT32(1);
if (a > b) if (a > b)
return 1; PG_RETURN_INT32(1);
else if (a == b) else if (a == b)
return 0; PG_RETURN_INT32(0);
else else
return -1; PG_RETURN_INT32(-1);
} }
int32 Datum
btint8cmp(int64 *a, int64 *b) btint8cmp(PG_FUNCTION_ARGS)
{ {
if (*a > *b) int64 a = PG_GETARG_INT64(0);
return 1; int64 b = PG_GETARG_INT64(1);
else if (*a == *b)
return 0; if (a > b)
PG_RETURN_INT32(1);
else if (a == b)
PG_RETURN_INT32(0);
else else
return -1; PG_RETURN_INT32(-1);
} }
int32 Datum
btint24cmp(int16 a, int32 b) btint24cmp(PG_FUNCTION_ARGS)
{ {
return ((int32) a) - b; int16 a = PG_GETARG_INT16(0);
int32 b = PG_GETARG_INT32(1);
if (a > b)
PG_RETURN_INT32(1);
else if (a == b)
PG_RETURN_INT32(0);
else
PG_RETURN_INT32(-1);
} }
int32 Datum
btint42cmp(int32 a, int16 b) btint42cmp(PG_FUNCTION_ARGS)
{ {
return a - ((int32) b); int32 a = PG_GETARG_INT32(0);
int16 b = PG_GETARG_INT16(1);
if (a > b)
PG_RETURN_INT32(1);
else if (a == b)
PG_RETURN_INT32(0);
else
PG_RETURN_INT32(-1);
} }
int32 Datum
btfloat4cmp(float32 a, float32 b) btfloat4cmp(PG_FUNCTION_ARGS)
{ {
if (*a > *b) float4 a = PG_GETARG_FLOAT4(0);
return 1; float4 b = PG_GETARG_FLOAT4(1);
else if (*a == *b)
return 0; if (a > b)
PG_RETURN_INT32(1);
else if (a == b)
PG_RETURN_INT32(0);
else else
return -1; PG_RETURN_INT32(-1);
} }
int32 Datum
btfloat8cmp(float64 a, float64 b) btfloat8cmp(PG_FUNCTION_ARGS)
{ {
if (*a > *b) float8 a = PG_GETARG_FLOAT8(0);
return 1; float8 b = PG_GETARG_FLOAT8(1);
else if (*a == *b)
return 0; if (a > b)
PG_RETURN_INT32(1);
else if (a == b)
PG_RETURN_INT32(0);
else else
return -1; PG_RETURN_INT32(-1);
} }
int32 Datum
btoidcmp(Oid a, Oid b) btoidcmp(PG_FUNCTION_ARGS)
{ {
Oid a = PG_GETARG_OID(0);
Oid b = PG_GETARG_OID(1);
if (a > b) if (a > b)
return 1; PG_RETURN_INT32(1);
else if (a == b) else if (a == b)
return 0; PG_RETURN_INT32(0);
else else
return -1; PG_RETURN_INT32(-1);
} }
int32 Datum
btoidvectorcmp(Oid *a, Oid *b) btoidvectorcmp(PG_FUNCTION_ARGS)
{ {
Oid *a = (Oid *) PG_GETARG_POINTER(0);
Oid *b = (Oid *) PG_GETARG_POINTER(1);
int i; int i;
for (i = 0; i < INDEX_MAX_KEYS; i++) for (i = 0; i < INDEX_MAX_KEYS; i++)
/* we use this because we need the int4gt, etc */ {
if (!int4eq(a[i], b[i])) if (a[i] != b[i])
{ {
if (int4gt(a[i], b[i])) if (a[i] > b[i])
return 1; PG_RETURN_INT32(1);
else else
return -1; PG_RETURN_INT32(-1);
} }
return 0; }
PG_RETURN_INT32(0);
} }
int32 int32
btabstimecmp(AbsoluteTime a, AbsoluteTime b) btabstimecmp(AbsoluteTime a, AbsoluteTime b)
{ {
if (AbsoluteTimeIsBefore(a, b)) if (AbsoluteTimeIsBefore(a, b))
return -1; PG_RETURN_INT32(-1);
else if (AbsoluteTimeIsBefore(b, a)) else if (AbsoluteTimeIsBefore(b, a))
return 1; PG_RETURN_INT32(1);
else else
return 0; PG_RETURN_INT32(0);
} }
int32 Datum
btcharcmp(char a, char b) btcharcmp(PG_FUNCTION_ARGS)
{ {
return (int32) ((uint8) a - (uint8) b); char a = PG_GETARG_CHAR(0);
char b = PG_GETARG_CHAR(1);
/* Be careful to compare chars as unsigned */
PG_RETURN_INT32((int32) ((uint8) a) - (int32) ((uint8) b));
} }
int32 Datum
btnamecmp(NameData *a, NameData *b) btnamecmp(PG_FUNCTION_ARGS)
{ {
return strncmp(NameStr(*a), NameStr(*b), NAMEDATALEN); Name a = PG_GETARG_NAME(0);
Name b = PG_GETARG_NAME(1);
PG_RETURN_INT32(strncmp(NameStr(*a), NameStr(*b), NAMEDATALEN));
} }
int32 Datum
bttextcmp(struct varlena * a, struct varlena * b) bttextcmp(PG_FUNCTION_ARGS)
{ {
text *a = PG_GETARG_TEXT_P(0);
text *b = PG_GETARG_TEXT_P(1);
int res; int res;
unsigned char *ap, unsigned char *ap,
*bp; *bp;
...@@ -187,7 +249,7 @@ bttextcmp(struct varlena * a, struct varlena * b) ...@@ -187,7 +249,7 @@ bttextcmp(struct varlena * a, struct varlena * b)
{ {
do do
{ {
res = (int) (*ap++ - *bp++); res = (int) *ap++ - (int) *bp++;
len--; len--;
} while (res == 0 && len != 0); } while (res == 0 && len != 0);
} }
...@@ -195,7 +257,7 @@ bttextcmp(struct varlena * a, struct varlena * b) ...@@ -195,7 +257,7 @@ bttextcmp(struct varlena * a, struct varlena * b)
#endif #endif
if (res != 0 || VARSIZE(a) == VARSIZE(b)) if (res != 0 || VARSIZE(a) == VARSIZE(b))
return res; PG_RETURN_INT32(res);
/* /*
* The two strings are the same in the first len bytes, and they are * The two strings are the same in the first len bytes, and they are
...@@ -203,13 +265,7 @@ bttextcmp(struct varlena * a, struct varlena * b) ...@@ -203,13 +265,7 @@ bttextcmp(struct varlena * a, struct varlena * b)
*/ */
if (VARSIZE(a) < VARSIZE(b)) if (VARSIZE(a) < VARSIZE(b))
return -1; PG_RETURN_INT32(-1);
else else
return 1; PG_RETURN_INT32(1);
}
int32
btboolcmp(bool a, bool b)
{
return (int32) ((uint8) a - (uint8) b);
} }
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* xid.c * xid.c
* POSTGRES transaction identifier code. * POSTGRES transaction identifier type.
* *
* 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: xid.c,v 1.27 2000/01/26 05:56:04 momjian Exp $ * $Id: xid.c,v 1.28 2000/06/05 07:28:38 tgl Exp $
* *
* OLD COMMENTS * OLD COMMENTS
* XXX WARNING * XXX WARNING
...@@ -19,33 +19,42 @@ ...@@ -19,33 +19,42 @@
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/xact.h" #include "access/xact.h"
/*
* TransactionId is typedef'd as uint32, so...
*/
#define PG_GETARG_TRANSACTIONID(n) PG_GETARG_UINT32(n)
#define PG_RETURN_TRANSACTIONID(x) PG_RETURN_UINT32(x)
extern TransactionId NullTransactionId; extern TransactionId NullTransactionId;
extern TransactionId DisabledTransactionId; extern TransactionId DisabledTransactionId;
extern TransactionId AmiTransactionId; extern TransactionId AmiTransactionId;
extern TransactionId FirstTransactionId; extern TransactionId FirstTransactionId;
/* XXX name for catalogs */ /* XXX name for catalogs */
TransactionId Datum
xidin(char *representation) xidin(PG_FUNCTION_ARGS)
{ {
return atol(representation); char *representation = PG_GETARG_CSTRING(0);
PG_RETURN_TRANSACTIONID((TransactionId) atol(representation));
} }
/* XXX name for catalogs */ /* XXX name for catalogs */
char * Datum
xidout(TransactionId transactionId) xidout(PG_FUNCTION_ARGS)
{ {
TransactionId transactionId = PG_GETARG_TRANSACTIONID(0);
/* maximum 32 bit unsigned integer representation takes 10 chars */ /* maximum 32 bit unsigned integer representation takes 10 chars */
char *representation = palloc(11); char *representation = palloc(11);
snprintf(representation, 11, "%u", transactionId); snprintf(representation, 11, "%lu", (unsigned long) transactionId);
return representation;
PG_RETURN_CSTRING(representation);
} }
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
...@@ -57,13 +66,14 @@ xidout(TransactionId transactionId) ...@@ -57,13 +66,14 @@ xidout(TransactionId transactionId)
* xideq - returns 1, iff xid1 == xid2 * xideq - returns 1, iff xid1 == xid2
* 0 else; * 0 else;
*/ */
bool Datum
xideq(TransactionId xid1, TransactionId xid2) xideq(PG_FUNCTION_ARGS)
{ {
return (bool) (xid1 == xid2); TransactionId xid1 = PG_GETARG_TRANSACTIONID(0);
} TransactionId xid2 = PG_GETARG_TRANSACTIONID(1);
PG_RETURN_BOOL(xid1 == xid2);
}
/* ---------------------------------------------------------------- /* ----------------------------------------------------------------
* TransactionIdAdd * TransactionIdAdd
...@@ -73,5 +83,4 @@ void ...@@ -73,5 +83,4 @@ void
TransactionIdAdd(TransactionId *xid, int value) TransactionIdAdd(TransactionId *xid, int value)
{ {
*xid += value; *xid += value;
return;
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.84 2000/05/31 00:28:14 petere Exp $ * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.85 2000/06/05 07:28:40 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/portal.h" #include "utils/portal.h"
#define ALLOC(t, c) (t *)calloc((unsigned)(c), sizeof(t)) #define ALLOC(t, c) ((t *) calloc((unsigned)(c), sizeof(t)))
extern void BaseInit(void); extern void BaseInit(void);
extern void StartupXLOG(void); extern void StartupXLOG(void);
...@@ -112,7 +112,7 @@ static struct typinfo Procid[] = { ...@@ -112,7 +112,7 @@ static struct typinfo Procid[] = {
{"int4", INT4OID, 0, 4, F_INT4IN, F_INT4OUT}, {"int4", INT4OID, 0, 4, F_INT4IN, F_INT4OUT},
{"regproc", REGPROCOID, 0, 4, F_REGPROCIN, F_REGPROCOUT}, {"regproc", REGPROCOID, 0, 4, F_REGPROCIN, F_REGPROCOUT},
{"text", TEXTOID, 0, -1, F_TEXTIN, F_TEXTOUT}, {"text", TEXTOID, 0, -1, F_TEXTIN, F_TEXTOUT},
{"oid", OIDOID, 0, 4, F_INT4IN, F_INT4OUT}, {"oid", OIDOID, 0, 4, F_OIDIN, F_OIDOUT},
{"tid", TIDOID, 0, 6, F_TIDIN, F_TIDOUT}, {"tid", TIDOID, 0, 6, F_TIDIN, F_TIDOUT},
{"xid", XIDOID, 0, 4, F_XIDIN, F_XIDOUT}, {"xid", XIDOID, 0, 4, F_XIDIN, F_XIDOUT},
{"cid", CIDOID, 0, 4, F_CIDIN, F_CIDOUT}, {"cid", CIDOID, 0, 4, F_CIDIN, F_CIDOUT},
......
...@@ -772,7 +772,7 @@ CommentOperator(char *opername, List *arguments, char *comment) ...@@ -772,7 +772,7 @@ CommentOperator(char *opername, List *arguments, char *comment)
/*** Get the procedure associated with the operator ***/ /*** Get the procedure associated with the operator ***/
data = (Form_pg_operator) GETSTRUCT(optuple); data = (Form_pg_operator) GETSTRUCT(optuple);
oid = regproctooid(data->oprcode); oid = RegprocToOid(data->oprcode);
if (oid == InvalidOid) if (oid == InvalidOid)
elog(ERROR, "operator '%s' does not have an underlying function", opername); elog(ERROR, "operator '%s' does not have an underlying function", opername);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.110 2000/06/02 15:57:18 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.111 2000/06/05 07:28:42 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -473,7 +473,9 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null_p ...@@ -473,7 +473,9 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null_p
if (oids && !binary) if (oids && !binary)
{ {
CopySendString(oidout(tuple->t_data->t_oid), fp); CopySendString(DatumGetCString(DirectFunctionCall1(oidout,
ObjectIdGetDatum(tuple->t_data->t_oid))),
fp);
CopySendChar(delim[0], fp); CopySendChar(delim[0], fp);
} }
...@@ -782,7 +784,8 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null ...@@ -782,7 +784,8 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim, char *null
done = 1; done = 1;
else else
{ {
loaded_oid = oidin(string); loaded_oid = DatumGetObjectId(DirectFunctionCall1(oidin,
CStringGetDatum(string)));
if (loaded_oid == InvalidOid) if (loaded_oid == InvalidOid)
elog(ERROR, "COPY TEXT: Invalid Oid"); elog(ERROR, "COPY TEXT: Invalid Oid");
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.79 2000/05/30 00:49:50 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.80 2000/06/05 07:28:43 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -892,7 +892,8 @@ parser_typecast_constant(Value *expr, TypeName *typename) ...@@ -892,7 +892,8 @@ parser_typecast_constant(Value *expr, TypeName *typename)
{ {
case T_Integer: case T_Integer:
string_palloced = true; string_palloced = true;
const_string = int4out(expr->val.ival); const_string = DatumGetCString(DirectFunctionCall1(int4out,
Int32GetDatum(expr->val.ival)));
break; break;
case T_Float: case T_Float:
case T_String: case T_String:
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.68 2000/05/28 17:56:03 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.69 2000/06/05 07:28:45 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -174,7 +174,8 @@ inv_create(int flags) ...@@ -174,7 +174,8 @@ inv_create(int flags)
if (!RelationIsValid(indr)) if (!RelationIsValid(indr))
{ {
elog(ERROR, "cannot create index for large obj on %s under inversion", elog(ERROR, "cannot create index for large obj on %s under inversion",
smgrout(DEFAULT_SMGR)); DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(DEFAULT_SMGR))));
} }
retval = (LargeObjectDesc *) palloc(sizeof(LargeObjectDesc)); retval = (LargeObjectDesc *) palloc(sizeof(LargeObjectDesc));
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.35 2000/04/12 17:15:42 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.36 2000/06/05 07:28:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -105,7 +105,9 @@ smgrinit() ...@@ -105,7 +105,9 @@ smgrinit()
if (smgrsw[i].smgr_init) if (smgrsw[i].smgr_init)
{ {
if ((*(smgrsw[i].smgr_init)) () == SM_FAIL) if ((*(smgrsw[i].smgr_init)) () == SM_FAIL)
elog(FATAL, "initialization failed on %s", smgrout(i)); elog(FATAL, "initialization failed on %s",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
} }
} }
...@@ -125,7 +127,9 @@ smgrshutdown(int dummy) ...@@ -125,7 +127,9 @@ smgrshutdown(int dummy)
if (smgrsw[i].smgr_shutdown) if (smgrsw[i].smgr_shutdown)
{ {
if ((*(smgrsw[i].smgr_shutdown)) () == SM_FAIL) if ((*(smgrsw[i].smgr_shutdown)) () == SM_FAIL)
elog(FATAL, "shutdown failed on %s", smgrout(i)); elog(FATAL, "shutdown failed on %s",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
} }
} }
} }
...@@ -445,7 +449,9 @@ smgrcommit() ...@@ -445,7 +449,9 @@ smgrcommit()
if (smgrsw[i].smgr_commit) if (smgrsw[i].smgr_commit)
{ {
if ((*(smgrsw[i].smgr_commit)) () == SM_FAIL) if ((*(smgrsw[i].smgr_commit)) () == SM_FAIL)
elog(FATAL, "transaction commit failed on %s", smgrout(i)); elog(FATAL, "transaction commit failed on %s",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
} }
} }
...@@ -462,7 +468,9 @@ smgrabort() ...@@ -462,7 +468,9 @@ smgrabort()
if (smgrsw[i].smgr_abort) if (smgrsw[i].smgr_abort)
{ {
if ((*(smgrsw[i].smgr_abort)) () == SM_FAIL) if ((*(smgrsw[i].smgr_abort)) () == SM_FAIL)
elog(FATAL, "transaction abort failed on %s", smgrout(i)); elog(FATAL, "transaction abort failed on %s",
DatumGetCString(DirectFunctionCall1(smgrout,
Int16GetDatum(i))));
} }
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgrtype.c,v 1.16 2000/01/26 05:57:05 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgrtype.c,v 1.17 2000/06/05 07:28:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -37,45 +37,48 @@ static smgrid StorageManager[] = { ...@@ -37,45 +37,48 @@ static smgrid StorageManager[] = {
static int NStorageManagers = lengthof(StorageManager); static int NStorageManagers = lengthof(StorageManager);
int2 Datum
smgrin(char *s) smgrin(PG_FUNCTION_ARGS)
{ {
int i; char *s = PG_GETARG_CSTRING(0);
int16 i;
for (i = 0; i < NStorageManagers; i++) for (i = 0; i < NStorageManagers; i++)
{ {
if (strcmp(s, StorageManager[i].smgr_name) == 0) if (strcmp(s, StorageManager[i].smgr_name) == 0)
return (int2) i; PG_RETURN_INT16(i);
} }
elog(ERROR, "smgrin: illegal storage manager name %s", s); elog(ERROR, "smgrin: unknown storage manager name '%s'", s);
return 0; PG_RETURN_INT16(0);
} }
char * Datum
smgrout(int2 i) smgrout(PG_FUNCTION_ARGS)
{ {
int16 i = PG_GETARG_INT16(0);
char *s; char *s;
if (i >= NStorageManagers || i < 0) if (i >= NStorageManagers || i < 0)
elog(ERROR, "Illegal storage manager id %d", i); elog(ERROR, "Illegal storage manager id %d", i);
s = (char *) palloc(strlen(StorageManager[i].smgr_name) + 1); s = pstrdup(StorageManager[i].smgr_name);
strcpy(s, StorageManager[i].smgr_name); PG_RETURN_CSTRING(s);
return s;
} }
bool Datum
smgreq(int2 a, int2 b) smgreq(PG_FUNCTION_ARGS)
{ {
if (a == b) int16 a = PG_GETARG_INT16(0);
return true; int16 b = PG_GETARG_INT16(1);
return false;
PG_RETURN_BOOL(a == b);
} }
bool Datum
smgrne(int2 a, int2 b) smgrne(PG_FUNCTION_ARGS)
{ {
if (a == b) int16 a = PG_GETARG_INT16(0);
return false; int16 b = PG_GETARG_INT16(1);
return true;
PG_RETURN_BOOL(a != b);
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.40 2000/05/30 07:09:23 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.41 2000/06/05 07:28:49 tgl Exp $
* *
* NOTES * NOTES
* This cruft is the server side of PQfn. * This cruft is the server side of PQfn.
...@@ -164,7 +164,7 @@ valid_fp_info(Oid func_id, struct fp_info * fip) ...@@ -164,7 +164,7 @@ valid_fp_info(Oid func_id, struct fp_info * fip)
Assert(fip != (struct fp_info *) NULL); Assert(fip != (struct fp_info *) NULL);
return (OidIsValid(fip->funcid) && return (OidIsValid(fip->funcid) &&
oideq(func_id, fip->funcid) && func_id == fip->funcid &&
TransactionIdIsCurrentTransactionId(fip->xid) && TransactionIdIsCurrentTransactionId(fip->xid) &&
CommandIdIsCurrentCommandId(fip->cid)); CommandIdIsCurrentCommandId(fip->cid));
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/acl.c,v 1.45 2000/04/12 17:15:47 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/acl.c,v 1.46 2000/06/05 07:28:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "lib/stringinfo.h" #include "lib/stringinfo.h"
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/builtins.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/syscache.h" #include "utils/syscache.h"
...@@ -268,7 +269,6 @@ aclitemout(AclItem *aip) ...@@ -268,7 +269,6 @@ aclitemout(AclItem *aip)
static AclItem default_aclitem = {ACL_ID_WORLD, static AclItem default_aclitem = {ACL_ID_WORLD,
ACL_IDTYPE_WORLD, ACL_IDTYPE_WORLD,
ACL_WORLD_DEFAULT}; ACL_WORLD_DEFAULT};
extern char *int2out();
char *tmpname; char *tmpname;
if (!aip) if (!aip)
...@@ -287,20 +287,11 @@ aclitemout(AclItem *aip) ...@@ -287,20 +287,11 @@ aclitemout(AclItem *aip)
0, 0, 0); 0, 0, 0);
if (!HeapTupleIsValid(htup)) if (!HeapTupleIsValid(htup))
{ {
char *tmp = int2out(aip->ai_id); /* Generate numeric UID if we don't find an entry */
char *tmp;
#ifdef NOT_USED
When this elog(NOTICE) goes to the libpq client,
it crashes the
client because the NOTICE protocol is coming right in the middle
of a request for a field value.We skip the NOTICE for now.
elog(NOTICE, "aclitemout: usesysid %d not found",
aip->ai_id);
#endif
tmp = DatumGetCString(DirectFunctionCall1(int4out,
Int32GetDatum((int32) aip->ai_id)));
strcat(p, tmp); strcat(p, tmp);
pfree(tmp); pfree(tmp);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/bool.c,v 1.22 2000/02/10 19:51:39 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/bool.c,v 1.23 2000/06/05 07:28:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -29,43 +29,45 @@ ...@@ -29,43 +29,45 @@
* *
* In the switch statement, check the most-used possibilities first. * In the switch statement, check the most-used possibilities first.
*/ */
bool Datum
boolin(char *b) boolin(PG_FUNCTION_ARGS)
{ {
char *b = PG_GETARG_CSTRING(0);
switch (*b) switch (*b)
{ {
case 't': case 't':
case 'T': case 'T':
if (strncasecmp(b, "true", strlen(b)) == 0) if (strncasecmp(b, "true", strlen(b)) == 0)
return TRUE; PG_RETURN_BOOL(true);
break; break;
case 'f': case 'f':
case 'F': case 'F':
if (strncasecmp(b, "false", strlen(b)) == 0) if (strncasecmp(b, "false", strlen(b)) == 0)
return FALSE; PG_RETURN_BOOL(false);
break; break;
case 'y': case 'y':
case 'Y': case 'Y':
if (strncasecmp(b, "yes", strlen(b)) == 0) if (strncasecmp(b, "yes", strlen(b)) == 0)
return TRUE; PG_RETURN_BOOL(true);
break; break;
case '1': case '1':
if (strncasecmp(b, "1", strlen(b)) == 0) if (strncasecmp(b, "1", strlen(b)) == 0)
return TRUE; PG_RETURN_BOOL(true);
break; break;
case 'n': case 'n':
case 'N': case 'N':
if (strncasecmp(b, "no", strlen(b)) == 0) if (strncasecmp(b, "no", strlen(b)) == 0)
return FALSE; PG_RETURN_BOOL(false);
break; break;
case '0': case '0':
if (strncasecmp(b, "0", strlen(b)) == 0) if (strncasecmp(b, "0", strlen(b)) == 0)
return FALSE; PG_RETURN_BOOL(false);
break; break;
default: default:
...@@ -73,72 +75,143 @@ boolin(char *b) ...@@ -73,72 +75,143 @@ boolin(char *b)
} }
elog(ERROR, "Bad boolean external representation '%s'", b); elog(ERROR, "Bad boolean external representation '%s'", b);
/* not reached */ /* not reached */
return FALSE; PG_RETURN_BOOL(false);
} /* boolin() */ }
/* /*
* boolout - converts 1 or 0 to "t" or "f" * boolout - converts 1 or 0 to "t" or "f"
*/ */
char * Datum
boolout(bool b) boolout(PG_FUNCTION_ARGS)
{ {
bool b = PG_GETARG_BOOL(0);
char *result = (char *) palloc(2); char *result = (char *) palloc(2);
*result = (b) ? 't' : 'f'; result[0] = (b) ? 't' : 'f';
result[1] = '\0'; result[1] = '\0';
return result; PG_RETURN_CSTRING(result);
} /* boolout() */ }
/***************************************************************************** /*****************************************************************************
* PUBLIC ROUTINES * * PUBLIC ROUTINES *
*****************************************************************************/ *****************************************************************************/
bool Datum
booleq(bool arg1, bool arg2) booleq(PG_FUNCTION_ARGS)
{ {
return arg1 == arg2; bool arg1 = PG_GETARG_BOOL(0);
bool arg2 = PG_GETARG_BOOL(1);
PG_RETURN_BOOL(arg1 == arg2);
} }
bool Datum
boolne(bool arg1, bool arg2) boolne(PG_FUNCTION_ARGS)
{ {
return arg1 != arg2; bool arg1 = PG_GETARG_BOOL(0);
bool arg2 = PG_GETARG_BOOL(1);
PG_RETURN_BOOL(arg1 != arg2);
} }
bool Datum
boollt(bool arg1, bool arg2) boollt(PG_FUNCTION_ARGS)
{ {
return arg1 < arg2; bool arg1 = PG_GETARG_BOOL(0);
bool arg2 = PG_GETARG_BOOL(1);
PG_RETURN_BOOL(arg1 < arg2);
} }
bool Datum
boolgt(bool arg1, bool arg2) boolgt(PG_FUNCTION_ARGS)
{ {
return arg1 > arg2; bool arg1 = PG_GETARG_BOOL(0);
bool arg2 = PG_GETARG_BOOL(1);
PG_RETURN_BOOL(arg1 > arg2);
} }
bool Datum
boolle(bool arg1, bool arg2) boolle(PG_FUNCTION_ARGS)
{
bool arg1 = PG_GETARG_BOOL(0);
bool arg2 = PG_GETARG_BOOL(1);
PG_RETURN_BOOL(arg1 <= arg2);
}
Datum
boolge(PG_FUNCTION_ARGS)
{
bool arg1 = PG_GETARG_BOOL(0);
bool arg2 = PG_GETARG_BOOL(1);
PG_RETURN_BOOL(arg1 >= arg2);
}
/*
* Per SQL92, istrue() and isfalse() should return false, not NULL,
* when presented a NULL input (since NULL is our implementation of
* UNKNOWN). Conversely isnottrue() and isnotfalse() should return true.
* Therefore, these routines are all declared not-strict in pg_proc
* and must do their own checking for null inputs.
*
* Note we don't need isunknown() and isnotunknown() functions, since
* nullvalue() and nonnullvalue() will serve.
*/
Datum
istrue(PG_FUNCTION_ARGS)
{ {
return arg1 <= arg2; bool b;
if (PG_ARGISNULL(0))
PG_RETURN_BOOL(false);
b = PG_GETARG_BOOL(0);
PG_RETURN_BOOL(b);
} }
bool Datum
boolge(bool arg1, bool arg2) isfalse(PG_FUNCTION_ARGS)
{ {
return arg1 >= arg2; bool b;
if (PG_ARGISNULL(0))
PG_RETURN_BOOL(false);
b = PG_GETARG_BOOL(0);
PG_RETURN_BOOL(! b);
} }
bool Datum
istrue(bool arg1) isnottrue(PG_FUNCTION_ARGS)
{ {
return arg1 == TRUE; bool b;
} /* istrue() */
bool if (PG_ARGISNULL(0))
isfalse(bool arg1) PG_RETURN_BOOL(true);
b = PG_GETARG_BOOL(0);
PG_RETURN_BOOL(! b);
}
Datum
isnotfalse(PG_FUNCTION_ARGS)
{ {
return arg1 != TRUE; bool b;
} /* isfalse() */
if (PG_ARGISNULL(0))
PG_RETURN_BOOL(true);
b = PG_GETARG_BOOL(0);
PG_RETURN_BOOL(b);
}
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* workings can be found in the book "Software Solutions in C" by * workings can be found in the book "Software Solutions in C" by
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7. * Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
* *
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.36 2000/05/16 20:48:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.37 2000/06/05 07:28:51 tgl Exp $
*/ */
#include <limits.h> #include <limits.h>
...@@ -35,6 +35,24 @@ static struct lconv *lconvert = NULL; ...@@ -35,6 +35,24 @@ static struct lconv *lconvert = NULL;
#endif #endif
/*
* Cash is a pass-by-ref SQL type, so we must pass and return pointers.
* These macros and support routine hide the pass-by-refness.
*/
#define PG_GETARG_CASH(n) (* ((Cash *) DatumGetPointer(fcinfo->arg[n])))
#define PG_RETURN_CASH(x) return CashGetDatum(x)
static Datum
CashGetDatum(Cash value)
{
Cash *result = (Cash *) palloc(sizeof(Cash));
*result = value;
return PointerGetDatum(result);
}
/* cash_in() /* cash_in()
* Convert a string to a cash data type. * Convert a string to a cash data type.
* Format is [$]###[,]###[.##] * Format is [$]###[,]###[.##]
...@@ -573,32 +591,30 @@ cash_div_int4(Cash *c, int4 i) ...@@ -573,32 +591,30 @@ cash_div_int4(Cash *c, int4 i)
/* cash_mul_int2() /* cash_mul_int2()
* Multiply cash by int2. * Multiply cash by int2.
*/ */
Cash * Datum
cash_mul_int2(Cash *c, int2 s) cash_mul_int2(PG_FUNCTION_ARGS)
{ {
Cash *result; Cash c = PG_GETARG_CASH(0);
int16 s = PG_GETARG_INT16(1);
if (!PointerIsValid(c)) Cash result;
return NULL;
if (!PointerIsValid(result = palloc(sizeof(Cash))))
elog(ERROR, "Memory allocation failed, can't multiply cash");
*result = ((s) * (*c));
return result;
} /* cash_mul_int2() */
result = c * s;
PG_RETURN_CASH(result);
}
/* int2_mul_cash() /* int2_mul_cash()
* Multiply int2 by cash. * Multiply int2 by cash.
*/ */
Cash * Datum
int2_mul_cash(int2 s, Cash *c) int2_mul_cash(PG_FUNCTION_ARGS)
{ {
return cash_mul_int2(c, s); int16 s = PG_GETARG_INT16(0);
} /* int2_mul_cash() */ Cash c = PG_GETARG_CASH(1);
Cash result;
result = s * c;
PG_RETURN_CASH(result);
}
/* cash_div_int2() /* cash_div_int2()
* Divide cash by int2. * Divide cash by int2.
...@@ -606,25 +622,19 @@ int2_mul_cash(int2 s, Cash *c) ...@@ -606,25 +622,19 @@ int2_mul_cash(int2 s, Cash *c)
* XXX Don't know if rounding or truncating is correct behavior. * XXX Don't know if rounding or truncating is correct behavior.
* Round for now. - tgl 97/04/15 * Round for now. - tgl 97/04/15
*/ */
Cash * Datum
cash_div_int2(Cash *c, int2 s) cash_div_int2(PG_FUNCTION_ARGS)
{ {
Cash *result; Cash c = PG_GETARG_CASH(0);
int16 s = PG_GETARG_INT16(1);
if (!PointerIsValid(c)) Cash result;
return NULL;
if (!PointerIsValid(result = palloc(sizeof(Cash))))
elog(ERROR, "Memory allocation failed, can't divide cash");
if (s == 0) if (s == 0)
elog(ERROR, "cash_div: divide by 0 error"); elog(ERROR, "cash_div: divide by 0 error");
*result = rint(*c / s); result = rint(c / s);
PG_RETURN_CASH(result);
return result; }
} /* cash_div_int2() */
/* cashlarger() /* cashlarger()
* Return larger of two cash values. * Return larger of two cash values.
......
...@@ -2,18 +2,19 @@ ...@@ -2,18 +2,19 @@
* *
* char.c * char.c
* Functions for the built-in type "char". * Functions for the built-in type "char".
* Functions for the built-in type "cid". * Functions for the built-in type "cid" (what's that doing here?)
* *
* 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
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.27 2000/01/26 05:57:13 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.28 2000/06/05 07:28:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres.h" #include "postgres.h"
#include "utils/builtins.h" #include "utils/builtins.h"
/***************************************************************************** /*****************************************************************************
...@@ -23,149 +24,194 @@ ...@@ -23,149 +24,194 @@
/* /*
* charin - converts "x" to 'x' * charin - converts "x" to 'x'
*/ */
int32 Datum
charin(char *ch) charin(PG_FUNCTION_ARGS)
{ {
if (ch == NULL) char *ch = PG_GETARG_CSTRING(0);
return (int32) '\0';
return (int32) *ch; PG_RETURN_CHAR(ch[0]);
} }
/* /*
* charout - converts 'x' to "x" * charout - converts 'x' to "x"
*/ */
char * Datum
charout(int32 ch) charout(PG_FUNCTION_ARGS)
{ {
char ch = PG_GETARG_CHAR(0);
char *result = (char *) palloc(2); char *result = (char *) palloc(2);
result[0] = (char) ch; result[0] = ch;
result[1] = '\0'; result[1] = '\0';
return result; PG_RETURN_CSTRING(result);
} }
/*****************************************************************************
* PUBLIC ROUTINES *
*****************************************************************************/
/* /*
* cidin - converts "..." to internal representation. * NOTE: comparisons are done as though char is unsigned (uint8).
* Arithmetic is done as though char is signed (int8).
* *
* NOTE: we must not use 'charin' because cid might be a non * You wanted consistency?
* printable character...
*/ */
int32
cidin(char *s)
{
CommandId c;
if (s == NULL) Datum
c = 0; chareq(PG_FUNCTION_ARGS)
else {
c = atoi(s); char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
return (int32) c; PG_RETURN_BOOL(arg1 == arg2);
} }
/* Datum
* cidout - converts a cid to "..." charne(PG_FUNCTION_ARGS)
*
* NOTE: we must no use 'charout' because cid might be a non
* printable character...
*/
char *
cidout(int32 c)
{ {
char *result; char arg1 = PG_GETARG_CHAR(0);
CommandId c2; char arg2 = PG_GETARG_CHAR(1);
result = palloc(12); PG_RETURN_BOOL(arg1 != arg2);
c2 = (CommandId) c;
sprintf(result, "%u", (unsigned) (c2));
return result;
} }
Datum
/***************************************************************************** charlt(PG_FUNCTION_ARGS)
* PUBLIC ROUTINES *
*****************************************************************************/
bool
chareq(int8 arg1, int8 arg2)
{ {
return arg1 == arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_BOOL((uint8) arg1 < (uint8) arg2);
} }
bool Datum
charne(int8 arg1, int8 arg2) charle(PG_FUNCTION_ARGS)
{ {
return arg1 != arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_BOOL((uint8) arg1 <= (uint8) arg2);
} }
bool Datum
charlt(int8 arg1, int8 arg2) chargt(PG_FUNCTION_ARGS)
{ {
return (uint8) arg1 < (uint8) arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_BOOL((uint8) arg1 > (uint8) arg2);
} }
bool Datum
charle(int8 arg1, int8 arg2) charge(PG_FUNCTION_ARGS)
{ {
return (uint8) arg1 <= (uint8) arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_BOOL((uint8) arg1 >= (uint8) arg2);
} }
bool Datum
chargt(int8 arg1, int8 arg2) charpl(PG_FUNCTION_ARGS)
{ {
return (uint8) arg1 > (uint8) arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_CHAR((int8) arg1 + (int8) arg2);
} }
bool Datum
charge(int8 arg1, int8 arg2) charmi(PG_FUNCTION_ARGS)
{ {
return (uint8) arg1 >= (uint8) arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_CHAR((int8) arg1 - (int8) arg2);
} }
int8 Datum
charpl(int8 arg1, int8 arg2) charmul(PG_FUNCTION_ARGS)
{ {
return arg1 + arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_CHAR((int8) arg1 * (int8) arg2);
} }
int8 Datum
charmi(int8 arg1, int8 arg2) chardiv(PG_FUNCTION_ARGS)
{ {
return arg1 - arg2; char arg1 = PG_GETARG_CHAR(0);
char arg2 = PG_GETARG_CHAR(1);
PG_RETURN_CHAR((int8) arg1 / (int8) arg2);
} }
int8 Datum
charmul(int8 arg1, int8 arg2) text_char(PG_FUNCTION_ARGS)
{ {
return arg1 * arg2; text *arg1 = PG_GETARG_TEXT_P(0);
/* XXX what if arg1 has length zero? */
PG_RETURN_CHAR(*(VARDATA(arg1)));
} }
int8 Datum
chardiv(int8 arg1, int8 arg2) char_text(PG_FUNCTION_ARGS)
{ {
return arg1 / arg2; char arg1 = PG_GETARG_CHAR(0);
text *result = palloc(VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1;
*(VARDATA(result)) = arg1;
PG_RETURN_TEXT_P(result);
} }
bool
cideq(int8 arg1, int8 arg2) /*****************************************************************************
* USER I/O ROUTINES *
*****************************************************************************/
/*
* cidin - converts CommandId to internal representation.
*/
Datum
cidin(PG_FUNCTION_ARGS)
{ {
return arg1 == arg2; char *s = PG_GETARG_CSTRING(0);
CommandId c;
c = atoi(s);
/* XXX assume that CommandId is 32 bits... */
PG_RETURN_INT32((int32) c);
} }
int8 /*
text_char(text *arg1) * cidout - converts a cid to external representation.
*/
Datum
cidout(PG_FUNCTION_ARGS)
{ {
return ((int8) *(VARDATA(arg1))); /* XXX assume that CommandId is 32 bits... */
CommandId c = PG_GETARG_INT32(0);
char *result = (char *) palloc(16);
sprintf(result, "%u", (unsigned int) c);
PG_RETURN_CSTRING(result);
} }
text * /*****************************************************************************
char_text(int8 arg1) * PUBLIC ROUTINES *
{ *****************************************************************************/
text *result;
result = palloc(VARHDRSZ + 1); Datum
VARSIZE(result) = VARHDRSZ + 1; cideq(PG_FUNCTION_ARGS)
*(VARDATA(result)) = arg1; {
/* XXX assume that CommandId is 32 bits... */
CommandId arg1 = PG_GETARG_INT32(0);
CommandId arg2 = PG_GETARG_INT32(1);
return result; PG_RETURN_BOOL(arg1 == arg2);
} }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.57 2000/04/12 17:15:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.58 2000/06/05 07:28:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -122,25 +122,6 @@ extern double rint(double x); ...@@ -122,25 +122,6 @@ extern double rint(double x);
#define FLOAT8_MAX DBL_MAX #define FLOAT8_MAX DBL_MAX
#define FLOAT8_MIN DBL_MIN #define FLOAT8_MIN DBL_MIN
/*
* if FLOAT8_MIN and FLOAT8_MAX are the limits of the range a
* double can store, then how are we ever going to wind up
* with something stored in a double that is outside those
* limits? (and similarly for FLOAT4_{MIN,MAX}/float.)
* doesn't make sense to me, and it causes a
* floating point exception on linuxalpha, so UNSAFE_FLOATS
* it is.
* (maybe someone wanted to allow for values other than DBL_MIN/
* DBL_MAX for FLOAT8_MIN/FLOAT8_MAX?)
* --djm 12/12/96
* according to Richard Henderson this is a known bug in gcc on
* the Alpha. might as well leave the workaround in
* until the distributions are updated.
* --djm 12/16/96
*/
#if ( defined(linux) && defined(__alpha__) ) && !defined(UNSAFE_FLOATS)
#define UNSAFE_FLOATS
#endif
/* /*
check to see if a float4 val is outside of check to see if a float4 val is outside of
...@@ -844,19 +825,17 @@ dtoi4(float64 num) ...@@ -844,19 +825,17 @@ dtoi4(float64 num)
/* /*
* dtoi2 - converts a float8 number to an int2 number * dtoi2 - converts a float8 number to an int2 number
*/ */
int16 Datum
dtoi2(float64 num) dtoi2(PG_FUNCTION_ARGS)
{ {
float8 num = PG_GETARG_FLOAT8(0);
int16 result; int16 result;
if (!num) if ((num < SHRT_MIN) || (num > SHRT_MAX))
return 0; /* fmgr will return NULL anyway */
if ((*num < SHRT_MIN) || (*num > SHRT_MAX))
elog(ERROR, "dtoi2: integer out of range"); elog(ERROR, "dtoi2: integer out of range");
result = rint(*num); result = (int16) rint(num);
return result; PG_RETURN_INT16(result);
} }
...@@ -878,15 +857,14 @@ i4tod(int32 num) ...@@ -878,15 +857,14 @@ i4tod(int32 num)
/* /*
* i2tod - converts an int2 number to a float8 number * i2tod - converts an int2 number to a float8 number
*/ */
float64 Datum
i2tod(int16 num) i2tod(PG_FUNCTION_ARGS)
{ {
float64 result; int16 num = PG_GETARG_INT16(0);
float8 result;
result = (float64) palloc(sizeof(float64data)); result = num;
PG_RETURN_FLOAT8(result);
*result = num;
return result;
} }
...@@ -910,21 +888,19 @@ ftoi4(float32 num) ...@@ -910,21 +888,19 @@ ftoi4(float32 num)
/* /*
* ftoi2 - converts a float8 number to an int2 number * ftoi2 - converts a float4 number to an int2 number
*/ */
int16 Datum
ftoi2(float32 num) ftoi2(PG_FUNCTION_ARGS)
{ {
float4 num = PG_GETARG_FLOAT4(0);
int16 result; int16 result;
if (!num) if ((num < SHRT_MIN) || (num > SHRT_MAX))
return 0; /* fmgr will return NULL anyway */
if ((*num < SHRT_MIN) || (*num > SHRT_MAX))
elog(ERROR, "ftoi2: integer out of range"); elog(ERROR, "ftoi2: integer out of range");
result = rint(*num); result = (int16) rint(num);
return result; PG_RETURN_INT16(result);
} }
...@@ -944,17 +920,16 @@ i4tof(int32 num) ...@@ -944,17 +920,16 @@ i4tof(int32 num)
/* /*
* i2tof - converts an int2 number to a float8 number * i2tof - converts an int2 number to a float4 number
*/ */
float32 Datum
i2tof(int16 num) i2tof(PG_FUNCTION_ARGS)
{ {
float32 result; int16 num = PG_GETARG_INT16(0);
float4 result;
result = (float32) palloc(sizeof(float32data));
*result = num; result = num;
return result; PG_RETURN_FLOAT4(result);
} }
......
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.c * formatting.c
* *
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.8 2000/04/12 17:15:49 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.9 2000/06/05 07:28:51 tgl Exp $
* *
* *
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
...@@ -4048,11 +4048,15 @@ int4_to_char(int32 value, text *fmt) ...@@ -4048,11 +4048,15 @@ int4_to_char(int32 value, text *fmt)
{ {
if (IS_MULTI(&Num)) if (IS_MULTI(&Num))
{ {
orgnum = int4out(int4mul(value, (int32) pow((double) 10, (double) Num.multi))); orgnum = DatumGetCString(DirectFunctionCall1(int4out,
Int32GetDatum(value * ((int32) pow((double) 10, (double) Num.multi)))));
Num.pre += Num.multi; Num.pre += Num.multi;
} }
else else
orgnum = int4out(value); {
orgnum = DatumGetCString(DirectFunctionCall1(int4out,
Int32GetDatum(value)));
}
len = strlen(orgnum); len = strlen(orgnum);
if (*orgnum == '-') if (*orgnum == '-')
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_selfuncs.c,v 1.15 2000/05/13 06:04:46 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_selfuncs.c,v 1.16 2000/06/05 07:28:52 tgl Exp $
* *
* XXX These are totally bogus. Perhaps someone will make them do * XXX These are totally bogus. Perhaps someone will make them do
* something reasonable, someday. * something reasonable, someday.
...@@ -44,32 +44,16 @@ ...@@ -44,32 +44,16 @@
* Selectivity for operators that depend on area, such as "overlap". * Selectivity for operators that depend on area, such as "overlap".
*/ */
float64 Datum
areasel(Oid opid, areasel(PG_FUNCTION_ARGS)
Oid relid,
AttrNumber attno,
Datum value,
int32 flag)
{ {
float64 result; PG_RETURN_FLOAT8(0.02);
result = (float64) palloc(sizeof(float64data));
*result = 0.02;
return result;
} }
float64 Datum
areajoinsel(Oid opid, areajoinsel(PG_FUNCTION_ARGS)
Oid relid1,
AttrNumber attno1,
Oid relid2,
AttrNumber attno2)
{ {
float64 result; PG_RETURN_FLOAT8(0.02);
result = (float64) palloc(sizeof(float64data));
*result = 0.02;
return result;
} }
/* /*
...@@ -79,32 +63,16 @@ areajoinsel(Oid opid, ...@@ -79,32 +63,16 @@ areajoinsel(Oid opid,
* a given box? * a given box?
*/ */
float64 Datum
positionsel(Oid opid, positionsel(PG_FUNCTION_ARGS)
Oid relid,
AttrNumber attno,
Datum value,
int32 flag)
{ {
float64 result; PG_RETURN_FLOAT8(0.1);
result = (float64) palloc(sizeof(float64data));
*result = 0.1;
return result;
} }
float64 Datum
positionjoinsel(Oid opid, positionjoinsel(PG_FUNCTION_ARGS)
Oid relid1,
AttrNumber attno1,
Oid relid2,
AttrNumber attno2)
{ {
float64 result; PG_RETURN_FLOAT8(0.1);
result = (float64) palloc(sizeof(float64data));
*result = 0.1;
return result;
} }
/* /*
...@@ -114,30 +82,14 @@ positionjoinsel(Oid opid, ...@@ -114,30 +82,14 @@ positionjoinsel(Oid opid,
* estimate than areasel does. * estimate than areasel does.
*/ */
float64 Datum
contsel(Oid opid, contsel(PG_FUNCTION_ARGS)
Oid relid,
AttrNumber attno,
Datum value,
int32 flag)
{ {
float64 result; PG_RETURN_FLOAT8(0.01);
result = (float64) palloc(sizeof(float64data));
*result = 0.01;
return result;
} }
float64 Datum
contjoinsel(Oid opid, contjoinsel(PG_FUNCTION_ARGS)
Oid relid1,
AttrNumber attno1,
Oid relid2,
AttrNumber attno2)
{ {
float64 result; PG_RETURN_FLOAT8(0.01);
result = (float64) palloc(sizeof(float64data));
*result = 0.01;
return result;
} }
This diff is collapsed.
...@@ -8,44 +8,39 @@ ...@@ -8,44 +8,39 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v 1.18 2000/01/26 05:57:14 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/misc.c,v 1.19 2000/06/05 07:28:52 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/file.h> #include <sys/file.h>
#include <time.h> #include <time.h>
#include "postgres.h" #include "postgres.h"
#include "utils/builtins.h" #include "utils/builtins.h"
/*-------------------------------------------------------------------------
/*
* Check if data is Null * Check if data is Null
*/ */
bool Datum
nullvalue(Datum value, bool *isNull) nullvalue(PG_FUNCTION_ARGS)
{ {
if (*isNull) if (PG_ARGISNULL(0))
{ PG_RETURN_BOOL(true);
*isNull = false; PG_RETURN_BOOL(false);
return true;
}
return false;
} }
/*----------------------------------------------------------------------* /*
* check if data is not Null * * Check if data is not Null
*--------------------------------------------------------------------- */ */
bool Datum
nonnullvalue(Datum value, bool *isNull) nonnullvalue(PG_FUNCTION_ARGS)
{ {
if (*isNull) if (PG_ARGISNULL(0))
{ PG_RETURN_BOOL(false);
*isNull = false; PG_RETURN_BOOL(true);
return false;
}
return true;
} }
/* /*
...@@ -63,13 +58,18 @@ nonnullvalue(Datum value, bool *isNull) ...@@ -63,13 +58,18 @@ nonnullvalue(Datum value, bool *isNull)
static bool random_initialized = false; static bool random_initialized = false;
bool Datum
oidrand(Oid o, int32 X) oidrand(PG_FUNCTION_ARGS)
{ {
/* XXX seems like we ought to be using the oid for something? */
#ifdef NOT_USED
Oid o = PG_GETARG_OID(0);
#endif
int32 X = PG_GETARG_INT32(1);
bool result; bool result;
if (X == 0) if (X == 0)
return true; PG_RETURN_BOOL(true);
/* /*
* We do this because the cancel key is actually a random, so we don't * We do this because the cancel key is actually a random, so we don't
...@@ -83,26 +83,29 @@ oidrand(Oid o, int32 X) ...@@ -83,26 +83,29 @@ oidrand(Oid o, int32 X)
} }
result = (random() % X == 0); result = (random() % X == 0);
return result; PG_RETURN_BOOL(result);
} }
/* /*
oidsrand(int32 X) - oidsrand(int32 X) -
seeds the random number generator seeds the random number generator
always return true always returns true
*/ */
bool Datum
oidsrand(int32 X) oidsrand(PG_FUNCTION_ARGS)
{ {
int32 X = PG_GETARG_INT32(0);
srand(X); srand(X);
random_initialized = true; random_initialized = true;
return true; PG_RETURN_BOOL(true);
} }
Datum
int32 userfntest(PG_FUNCTION_ARGS)
userfntest(int i)
{ {
return i; int32 i = PG_GETARG_INT32(0);
PG_RETURN_INT32(i);
} }
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* 1998 Jan Wieck * 1998 Jan Wieck
* *
* $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.27 2000/04/12 17:15:50 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.28 2000/06/05 07:28:52 tgl Exp $
* *
* ---------- * ----------
*/ */
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
* Local definitions * Local definitions
* ---------- * ----------
*/ */
#define PG_GETARG_NUMERIC(n) ((Numeric) DatumGetPointer(fcinfo->arg[n]))
#define PG_RETURN_NUMERIC(x) return PointerGetDatum(x)
#ifndef MIN #ifndef MIN
#define MIN(a,b) (((a)<(b)) ? (a) : (b)) #define MIN(a,b) (((a)<(b)) ? (a) : (b))
#endif #endif
...@@ -1714,7 +1717,8 @@ int4_numeric(int32 val) ...@@ -1714,7 +1717,8 @@ int4_numeric(int32 val)
init_var(&result); init_var(&result);
tmp = int4out(val); tmp = DatumGetCString(DirectFunctionCall1(int4out,
Int32GetDatum(val)));
set_var_from_str(tmp, &result); set_var_from_str(tmp, &result);
res = make_result(&result); res = make_result(&result);
...@@ -1730,7 +1734,7 @@ numeric_int4(Numeric num) ...@@ -1730,7 +1734,7 @@ numeric_int4(Numeric num)
{ {
NumericVar x; NumericVar x;
char *str; char *str;
int32 result; Datum result;
if (num == NULL) if (num == NULL)
return 0; return 0;
...@@ -1749,7 +1753,7 @@ numeric_int4(Numeric num) ...@@ -1749,7 +1753,7 @@ numeric_int4(Numeric num)
free_var(&x); free_var(&x);
result = int4in(str); result = DirectFunctionCall1(int4in, CStringGetDatum(str));
pfree(str); pfree(str);
return result; return result;
...@@ -1807,35 +1811,35 @@ numeric_int8(Numeric num) ...@@ -1807,35 +1811,35 @@ numeric_int8(Numeric num)
} }
Numeric Datum
int2_numeric(int16 val) int2_numeric(PG_FUNCTION_ARGS)
{ {
int16 val = PG_GETARG_INT16(0);
Numeric res; Numeric res;
NumericVar result; NumericVar result;
char *tmp; char *tmp;
init_var(&result); init_var(&result);
tmp = int2out(val); tmp = DatumGetCString(DirectFunctionCall1(int2out,
Int16GetDatum(val)));
set_var_from_str(tmp, &result); set_var_from_str(tmp, &result);
res = make_result(&result); res = make_result(&result);
free_var(&result); free_var(&result);
pfree(tmp); pfree(tmp);
return res; PG_RETURN_NUMERIC(res);
} }
int16 Datum
numeric_int2(Numeric num) numeric_int2(PG_FUNCTION_ARGS)
{ {
Numeric num = PG_GETARG_NUMERIC(0);
NumericVar x; NumericVar x;
char *str; char *str;
int16 result; Datum result;
if (num == NULL)
return 0;
if (NUMERIC_IS_NAN(num)) if (NUMERIC_IS_NAN(num))
elog(ERROR, "Cannot convert NaN to int2"); elog(ERROR, "Cannot convert NaN to int2");
...@@ -1851,7 +1855,7 @@ numeric_int2(Numeric num) ...@@ -1851,7 +1855,7 @@ numeric_int2(Numeric num)
free_var(&x); free_var(&x);
result = int2in(str); result = DirectFunctionCall1(int2in, CStringGetDatum(str));
pfree(str); pfree(str);
return result; return result;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.34 2000/04/12 17:15:51 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.35 2000/06/05 07:28:52 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -26,17 +26,15 @@ ...@@ -26,17 +26,15 @@
* oidvectorin - converts "num num ..." to internal form * oidvectorin - converts "num num ..." to internal form
* *
* Note: * Note:
* Fills any nonexistent digits with NULL oids. * Fills any unsupplied positions with InvalidOid.
*/ */
Oid * Datum
oidvectorin(char *oidString) oidvectorin(PG_FUNCTION_ARGS)
{ {
char *oidString = PG_GETARG_CSTRING(0);
Oid *result; Oid *result;
int slot; int slot;
if (oidString == NULL)
return NULL;
result = (Oid *) palloc(sizeof(Oid[INDEX_MAX_KEYS])); result = (Oid *) palloc(sizeof(Oid[INDEX_MAX_KEYS]));
for (slot = 0; *oidString && slot < INDEX_MAX_KEYS; slot++) for (slot = 0; *oidString && slot < INDEX_MAX_KEYS; slot++)
...@@ -53,30 +51,23 @@ oidvectorin(char *oidString) ...@@ -53,30 +51,23 @@ oidvectorin(char *oidString)
if (*oidString) if (*oidString)
elog(ERROR, "oidvector value has too many values"); elog(ERROR, "oidvector value has too many values");
while (slot < INDEX_MAX_KEYS) while (slot < INDEX_MAX_KEYS)
result[slot++] = 0; result[slot++] = InvalidOid;
return result; PG_RETURN_POINTER(result);
} }
/* /*
* oidvectorout - converts internal form to "num num ..." * oidvectorout - converts internal form to "num num ..."
*/ */
char * Datum
oidvectorout(Oid *oidArray) oidvectorout(PG_FUNCTION_ARGS)
{ {
Oid *oidArray = (Oid *) PG_GETARG_POINTER(0);
int num, int num,
maxnum; maxnum;
char *rp; char *rp;
char *result; char *result;
if (oidArray == NULL)
{
result = (char *) palloc(2);
result[0] = '-';
result[1] = '\0';
return result;
}
/* find last non-zero value in vector */ /* find last non-zero value in vector */
for (maxnum = INDEX_MAX_KEYS - 1; maxnum >= 0; maxnum--) for (maxnum = INDEX_MAX_KEYS - 1; maxnum >= 0; maxnum--)
if (oidArray[maxnum] != 0) if (oidArray[maxnum] != 0)
...@@ -93,147 +84,177 @@ oidvectorout(Oid *oidArray) ...@@ -93,147 +84,177 @@ oidvectorout(Oid *oidArray)
; ;
} }
*rp = '\0'; *rp = '\0';
return result; PG_RETURN_CSTRING(result);
} }
Oid Datum
oidin(char *s) oidin(PG_FUNCTION_ARGS)
{ {
return int4in(s); char *s = PG_GETARG_CSTRING(0);
/* XXX should use an unsigned-int conversion here */
return DirectFunctionCall1(int4in, CStringGetDatum(s));
} }
char * Datum
oidout(Oid o) oidout(PG_FUNCTION_ARGS)
{ {
return int4out(o); Oid o = PG_GETARG_OID(0);
/* XXX should use an unsigned-int conversion here */
return DirectFunctionCall1(int4out, ObjectIdGetDatum(o));
} }
/***************************************************************************** /*****************************************************************************
* PUBLIC ROUTINES * * PUBLIC ROUTINES *
*****************************************************************************/ *****************************************************************************/
/* Datum
* If you change this function, change heap_keytest() oideq(PG_FUNCTION_ARGS)
* because we have hardcoded this in there as an optimization
*/
bool
oideq(Oid arg1, Oid arg2)
{ {
return arg1 == arg2; Oid arg1 = PG_GETARG_OID(0);
Oid arg2 = PG_GETARG_OID(1);
PG_RETURN_BOOL(arg1 == arg2);
} }
bool Datum
oidne(Oid arg1, Oid arg2) oidne(PG_FUNCTION_ARGS)
{ {
return arg1 != arg2; Oid arg1 = PG_GETARG_OID(0);
Oid arg2 = PG_GETARG_OID(1);
PG_RETURN_BOOL(arg1 != arg2);
} }
bool Datum
oidvectoreq(Oid *arg1, Oid *arg2) oidvectoreq(PG_FUNCTION_ARGS)
{ {
return (bool) (memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(Oid)) == 0); Oid *arg1 = (Oid *) PG_GETARG_POINTER(0);
Oid *arg2 = (Oid *) PG_GETARG_POINTER(1);
PG_RETURN_BOOL(memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(Oid)) == 0);
} }
bool Datum
oidvectorne(Oid *arg1, Oid *arg2) oidvectorne(PG_FUNCTION_ARGS)
{ {
return (bool) (memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(Oid)) != 0); Oid *arg1 = (Oid *) PG_GETARG_POINTER(0);
Oid *arg2 = (Oid *) PG_GETARG_POINTER(1);
PG_RETURN_BOOL(memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(Oid)) != 0);
} }
bool Datum
oidvectorlt(Oid *arg1, Oid *arg2) oidvectorlt(PG_FUNCTION_ARGS)
{ {
Oid *arg1 = (Oid *) PG_GETARG_POINTER(0);
Oid *arg2 = (Oid *) PG_GETARG_POINTER(1);
int i; int i;
for (i = 0; i < INDEX_MAX_KEYS; i++) for (i = 0; i < INDEX_MAX_KEYS; i++)
if (!int4eq(arg1[i], arg2[i])) if (arg1[i] != arg2[i])
return int4lt(arg1[i], arg2[i]); PG_RETURN_BOOL(arg1[i] < arg2[i]);
return false; PG_RETURN_BOOL(false);
} }
bool Datum
oidvectorle(Oid *arg1, Oid *arg2) oidvectorle(PG_FUNCTION_ARGS)
{ {
Oid *arg1 = (Oid *) PG_GETARG_POINTER(0);
Oid *arg2 = (Oid *) PG_GETARG_POINTER(1);
int i; int i;
for (i = 0; i < INDEX_MAX_KEYS; i++) for (i = 0; i < INDEX_MAX_KEYS; i++)
if (!int4eq(arg1[i], arg2[i])) if (arg1[i] != arg2[i])
return int4le(arg1[i], arg2[i]); PG_RETURN_BOOL(arg1[i] <= arg2[i]);
return true; PG_RETURN_BOOL(true);
} }
bool Datum
oidvectorge(Oid *arg1, Oid *arg2) oidvectorge(PG_FUNCTION_ARGS)
{ {
Oid *arg1 = (Oid *) PG_GETARG_POINTER(0);
Oid *arg2 = (Oid *) PG_GETARG_POINTER(1);
int i; int i;
for (i = 0; i < INDEX_MAX_KEYS; i++) for (i = 0; i < INDEX_MAX_KEYS; i++)
if (!int4eq(arg1[i], arg2[i])) if (arg1[i] != arg2[i])
return int4ge(arg1[i], arg2[i]); PG_RETURN_BOOL(arg1[i] >= arg2[i]);
return true; PG_RETURN_BOOL(true);
} }
bool Datum
oidvectorgt(Oid *arg1, Oid *arg2) oidvectorgt(PG_FUNCTION_ARGS)
{ {
Oid *arg1 = (Oid *) PG_GETARG_POINTER(0);
Oid *arg2 = (Oid *) PG_GETARG_POINTER(1);
int i; int i;
for (i = 0; i < INDEX_MAX_KEYS; i++) for (i = 0; i < INDEX_MAX_KEYS; i++)
if (!int4eq(arg1[i], arg2[i])) if (arg1[i] != arg2[i])
return int4gt(arg1[i], arg2[i]); PG_RETURN_BOOL(arg1[i] > arg2[i]);
return false; PG_RETURN_BOOL(false);
} }
bool Datum
oideqint4(Oid arg1, int32 arg2) oideqint4(PG_FUNCTION_ARGS)
{ {
/* oid is unsigned, but int4 is signed */ Oid arg1 = PG_GETARG_OID(0);
return arg2 >= 0 && arg1 == arg2; int32 arg2 = PG_GETARG_INT32(1);
/* oid is unsigned, but int4 is signed */
PG_RETURN_BOOL(arg2 >= 0 && arg1 == arg2);
} }
bool Datum
int4eqoid(int32 arg1, Oid arg2) int4eqoid(PG_FUNCTION_ARGS)
{ {
/* oid is unsigned, but int4 is signed */ int32 arg1 = PG_GETARG_INT32(0);
return arg1 >= 0 && arg1 == arg2; Oid arg2 = PG_GETARG_OID(1);
/* oid is unsigned, but int4 is signed */
PG_RETURN_BOOL(arg1 >= 0 && arg1 == arg2);
} }
text * Datum
oid_text(Oid oid) oid_text(PG_FUNCTION_ARGS)
{ {
Oid oid = PG_GETARG_OID(0);
text *result; text *result;
int len; int len;
char *str; char *str;
str = oidout(oid); str = DatumGetCString(DirectFunctionCall1(oidout,
len = (strlen(str) + VARHDRSZ); ObjectIdGetDatum(oid)));
len = strlen(str) + VARHDRSZ;
result = palloc(len); result = (text *) palloc(len);
VARSIZE(result) = len; VARSIZE(result) = len;
memmove(VARDATA(result), str, (len - VARHDRSZ)); memcpy(VARDATA(result), str, (len - VARHDRSZ));
pfree(str); pfree(str);
return result; PG_RETURN_TEXT_P(result);
} /* oid_text() */ }
Oid Datum
text_oid(text *string) text_oid(PG_FUNCTION_ARGS)
{ {
text *string = PG_GETARG_TEXT_P(0);
Oid result; Oid result;
int len; int len;
char *str; char *str;
len = (VARSIZE(string) - VARHDRSZ); len = (VARSIZE(string) - VARHDRSZ);
str = palloc(len + 1); str = palloc(len + 1);
memmove(str, VARDATA(string), len); memcpy(str, VARDATA(string), len);
*(str + len) = '\0'; *(str + len) = '\0';
result = oidin(str); result = DatumGetObjectId(DirectFunctionCall1(oidin,
CStringGetDatum(str)));
pfree(str); pfree(str);
return result; PG_RETURN_OID(result);
} /* oid_text() */ }
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.55 2000/05/28 17:56:05 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.56 2000/06/05 07:28:52 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -34,17 +34,16 @@ ...@@ -34,17 +34,16 @@
* *
* proid of '-' signifies unknown, for consistency with regprocout * proid of '-' signifies unknown, for consistency with regprocout
*/ */
int32 Datum
regprocin(char *pro_name_or_oid) regprocin(PG_FUNCTION_ARGS)
{ {
HeapTuple proctup = NULL; char *pro_name_or_oid = PG_GETARG_CSTRING(0);
HeapTuple proctup;
HeapTupleData tuple; HeapTupleData tuple;
RegProcedure result = InvalidOid; RegProcedure result = InvalidOid;
if (pro_name_or_oid == NULL)
return InvalidOid;
if (pro_name_or_oid[0] == '-' && pro_name_or_oid[1] == '\0') if (pro_name_or_oid[0] == '-' && pro_name_or_oid[1] == '\0')
return InvalidOid; PG_RETURN_OID(InvalidOid);
if (!IsIgnoringSystemIndexes()) if (!IsIgnoringSystemIndexes())
{ {
...@@ -57,7 +56,8 @@ regprocin(char *pro_name_or_oid) ...@@ -57,7 +56,8 @@ regprocin(char *pro_name_or_oid)
pro_name_or_oid[0] <= '9') pro_name_or_oid[0] <= '9')
{ {
proctup = SearchSysCacheTuple(PROCOID, proctup = SearchSysCacheTuple(PROCOID,
ObjectIdGetDatum(oidin(pro_name_or_oid)), DirectFunctionCall1(oidin,
CStringGetDatum(pro_name_or_oid)),
0, 0, 0); 0, 0, 0);
if (HeapTupleIsValid(proctup)) if (HeapTupleIsValid(proctup))
result = (RegProcedure) proctup->t_data->t_oid; result = (RegProcedure) proctup->t_data->t_oid;
...@@ -78,7 +78,7 @@ regprocin(char *pro_name_or_oid) ...@@ -78,7 +78,7 @@ regprocin(char *pro_name_or_oid)
(bits16) 0x0, (bits16) 0x0,
(AttrNumber) 1, (AttrNumber) 1,
(RegProcedure) F_NAMEEQ, (RegProcedure) F_NAMEEQ,
PointerGetDatum(pro_name_or_oid)); CStringGetDatum(pro_name_or_oid));
hdesc = heap_openr(ProcedureRelationName, AccessShareLock); hdesc = heap_openr(ProcedureRelationName, AccessShareLock);
idesc = index_openr(ProcedureNameIndex); idesc = index_openr(ProcedureNameIndex);
...@@ -125,7 +125,7 @@ regprocin(char *pro_name_or_oid) ...@@ -125,7 +125,7 @@ regprocin(char *pro_name_or_oid)
(bits16) 0, (bits16) 0,
(AttrNumber) 1, (AttrNumber) 1,
(RegProcedure) F_NAMEEQ, (RegProcedure) F_NAMEEQ,
(Datum) pro_name_or_oid); CStringGetDatum(pro_name_or_oid));
procscan = heap_beginscan(proc, 0, SnapshotNow, 1, &key); procscan = heap_beginscan(proc, 0, SnapshotNow, 1, &key);
if (!HeapScanIsValid(procscan)) if (!HeapScanIsValid(procscan))
...@@ -133,7 +133,7 @@ regprocin(char *pro_name_or_oid) ...@@ -133,7 +133,7 @@ regprocin(char *pro_name_or_oid)
heap_close(proc, AccessShareLock); heap_close(proc, AccessShareLock);
elog(ERROR, "regprocin: could not begin scan of %s", elog(ERROR, "regprocin: could not begin scan of %s",
ProcedureRelationName); ProcedureRelationName);
return 0; PG_RETURN_OID(InvalidOid);
} }
proctup = heap_getnext(procscan, 0); proctup = heap_getnext(procscan, 0);
if (HeapTupleIsValid(proctup)) if (HeapTupleIsValid(proctup))
...@@ -143,24 +143,25 @@ regprocin(char *pro_name_or_oid) ...@@ -143,24 +143,25 @@ regprocin(char *pro_name_or_oid)
RelationGetDescr(proc), RelationGetDescr(proc),
&isnull); &isnull);
if (isnull) if (isnull)
elog(FATAL, "regprocin: null procedure %s", pro_name_or_oid); elog(ERROR, "regprocin: null procedure %s", pro_name_or_oid);
} }
else else
result = (RegProcedure) 0; elog(ERROR, "No procedure with name %s", pro_name_or_oid);
heap_endscan(procscan); heap_endscan(procscan);
heap_close(proc, AccessShareLock); heap_close(proc, AccessShareLock);
} }
return (int32) result; PG_RETURN_OID(result);
} }
/* /*
* regprocout - converts proid to "pro_name" * regprocout - converts proid to "pro_name"
*/ */
char * Datum
regprocout(RegProcedure proid) regprocout(PG_FUNCTION_ARGS)
{ {
RegProcedure proid = PG_GETARG_OID(0);
HeapTuple proctup; HeapTuple proctup;
char *result; char *result;
...@@ -170,7 +171,7 @@ regprocout(RegProcedure proid) ...@@ -170,7 +171,7 @@ regprocout(RegProcedure proid)
{ {
result[0] = '-'; result[0] = '-';
result[1] = '\0'; result[1] = '\0';
return result; PG_RETURN_CSTRING(result);
} }
if (!IsBootstrapProcessingMode()) if (!IsBootstrapProcessingMode())
...@@ -203,7 +204,7 @@ regprocout(RegProcedure proid) ...@@ -203,7 +204,7 @@ regprocout(RegProcedure proid)
(bits16) 0, (bits16) 0,
(AttrNumber) ObjectIdAttributeNumber, (AttrNumber) ObjectIdAttributeNumber,
(RegProcedure) F_INT4EQ, (RegProcedure) F_INT4EQ,
(Datum) proid); ObjectIdGetDatum(proid));
procscan = heap_beginscan(proc, 0, SnapshotNow, 1, &key); procscan = heap_beginscan(proc, 0, SnapshotNow, 1, &key);
if (!HeapScanIsValid(procscan)) if (!HeapScanIsValid(procscan))
...@@ -211,7 +212,6 @@ regprocout(RegProcedure proid) ...@@ -211,7 +212,6 @@ regprocout(RegProcedure proid)
heap_close(proc, AccessShareLock); heap_close(proc, AccessShareLock);
elog(ERROR, "regprocout: could not begin scan of %s", elog(ERROR, "regprocout: could not begin scan of %s",
ProcedureRelationName); ProcedureRelationName);
return 0;
} }
proctup = heap_getnext(procscan, 0); proctup = heap_getnext(procscan, 0);
if (HeapTupleIsValid(proctup)) if (HeapTupleIsValid(proctup))
...@@ -224,7 +224,7 @@ regprocout(RegProcedure proid) ...@@ -224,7 +224,7 @@ regprocout(RegProcedure proid)
if (!isnull) if (!isnull)
StrNCpy(result, s, NAMEDATALEN); StrNCpy(result, s, NAMEDATALEN);
else else
elog(FATAL, "regprocout: null procedure %u", proid); elog(ERROR, "regprocout: null procedure %u", proid);
} }
else else
{ {
...@@ -235,7 +235,7 @@ regprocout(RegProcedure proid) ...@@ -235,7 +235,7 @@ regprocout(RegProcedure proid)
heap_close(proc, AccessShareLock); heap_close(proc, AccessShareLock);
} }
return result; PG_RETURN_CSTRING(result);
} }
/* /*
...@@ -245,21 +245,15 @@ regprocout(RegProcedure proid) ...@@ -245,21 +245,15 @@ regprocout(RegProcedure proid)
* OIDs are significant in the input vector, so that trailing InvalidOid * OIDs are significant in the input vector, so that trailing InvalidOid
* argument types can be recognized. * argument types can be recognized.
*/ */
text * Datum
oidvectortypes(Oid *oidArray) oidvectortypes(PG_FUNCTION_ARGS)
{ {
Oid *oidArray = (Oid *) PG_GETARG_POINTER(0);
HeapTuple typetup; HeapTuple typetup;
text *result; text *result;
int numargs, int numargs,
num; num;
if (oidArray == NULL)
{
result = (text *) palloc(VARHDRSZ);
VARSIZE(result) = 0;
return result;
}
/* Try to guess how many args there are :-( */ /* Try to guess how many args there are :-( */
numargs = 0; numargs = 0;
for (num = 0; num < FUNC_MAX_ARGS; num++) for (num = 0; num < FUNC_MAX_ARGS; num++)
...@@ -289,7 +283,7 @@ oidvectortypes(Oid *oidArray) ...@@ -289,7 +283,7 @@ oidvectortypes(Oid *oidArray)
strcat(VARDATA(result), "- "); strcat(VARDATA(result), "- ");
} }
VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ; VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
return result; PG_RETURN_TEXT_P(result);
} }
...@@ -302,10 +296,12 @@ oidvectortypes(Oid *oidArray) ...@@ -302,10 +296,12 @@ oidvectortypes(Oid *oidArray)
* Define RegprocToOid() as a macro in builtins.h. * Define RegprocToOid() as a macro in builtins.h.
* Referenced in pg_proc.h. - tgl 97/04/26 * Referenced in pg_proc.h. - tgl 97/04/26
*/ */
Oid Datum
regproctooid(RegProcedure rp) regproctooid(PG_FUNCTION_ARGS)
{ {
return (Oid) rp; RegProcedure rp = PG_GETARG_OID(0);
PG_RETURN_OID((Oid) rp);
} }
/* (see int.c for comparison/operation routines) */ /* (see int.c for comparison/operation routines) */
This diff is collapsed.
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* varchar.c * varchar.c
* Functions for the built-in type char() and varchar(). * Functions for the built-in types char(n) and varchar(n).
* *
* 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
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.62 2000/05/30 00:49:53 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.63 2000/06/05 07:28:52 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres.h" #include "postgres.h"
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/fmgroids.h" #include "utils/fmgroids.h"
...@@ -22,9 +23,10 @@ ...@@ -22,9 +23,10 @@
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
#endif #endif
#ifdef CYR_RECODE
char *convertstr(char *, int, int);
#ifdef CYR_RECODE
/* XXX no points for style --- this is actually in utils/init/miscinit.c */
extern char *convertstr(char *, int, int);
#endif #endif
...@@ -34,7 +36,7 @@ char *convertstr(char *, int, int); ...@@ -34,7 +36,7 @@ char *convertstr(char *, int, int);
* VARCHAR is for storing string whose length is at most the length specified * VARCHAR is for storing string whose length is at most the length specified
* at CREATE TABLE time. * at CREATE TABLE time.
* *
* It's hard to implement these types because we cannot figure out what * It's hard to implement these types because we cannot figure out
* the length of the type from the type itself. I change (hopefully all) the * the length of the type from the type itself. I change (hopefully all) the
* fmgr calls that invoke input functions of a data type to supply the * fmgr calls that invoke input functions of a data type to supply the
* length also. (eg. in INSERTs, we have the tupleDescriptor which contains * length also. (eg. in INSERTs, we have the tupleDescriptor which contains
...@@ -44,8 +46,9 @@ char *convertstr(char *, int, int); ...@@ -44,8 +46,9 @@ char *convertstr(char *, int, int);
* must be null-terminated. * must be null-terminated.
* *
* We actually implement this as a varlena so that we don't have to pass in * We actually implement this as a varlena so that we don't have to pass in
* the length for the comparison functions. (The difference between "text" * the length for the comparison functions. (The difference between these
* is that we truncate and possibly blank-pad the string at insertion time.) * types and "text" is that we truncate and possibly blank-pad the string
* at insertion time.)
* *
* - ay 6/95 * - ay 6/95
*/ */
...@@ -231,28 +234,33 @@ _bpchar(ArrayType *v, int32 len) ...@@ -231,28 +234,33 @@ _bpchar(ArrayType *v, int32 len)
/* bpchar_char() /* bpchar_char()
* Convert bpchar(1) to char. * Convert bpchar(1) to char.
*
* If input is multiple chars, only the first is returned.
*/ */
int32 Datum
bpchar_char(char *s) bpchar_char(PG_FUNCTION_ARGS)
{ {
return (int32) *VARDATA(s); struct varlena *s = PG_GETARG_BPCHAR_P(0);
} /* bpchar_char() */
PG_RETURN_CHAR(*VARDATA(s));
}
/* char_bpchar() /* char_bpchar()
* Convert char to bpchar(1). * Convert char to bpchar(1).
*/ */
char * Datum
char_bpchar(int32 c) char_bpchar(PG_FUNCTION_ARGS)
{ {
char *result; char c = PG_GETARG_CHAR(0);
struct varlena *result;
result = palloc(VARHDRSZ + 1); result = (struct varlena *) palloc(VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1; VARSIZE(result) = VARHDRSZ + 1;
*(VARDATA(result)) = (char) c; *(VARDATA(result)) = c;
return result; PG_RETURN_BPCHAR_P(result);
} /* char_bpchar() */ }
/* bpchar_name() /* bpchar_name()
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.64 2000/05/28 17:56:06 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.65 2000/06/05 07:28:53 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -35,7 +35,7 @@ static Index CatalogCacheComputeTupleHashIndex(struct catcache * cacheInOutP, ...@@ -35,7 +35,7 @@ static Index CatalogCacheComputeTupleHashIndex(struct catcache * cacheInOutP,
HeapTuple tuple); HeapTuple tuple);
static void CatalogCacheInitializeCache(struct catcache * cache, static void CatalogCacheInitializeCache(struct catcache * cache,
Relation relation); Relation relation);
static uint32 cc_hashname(NameData *n); static Datum cc_hashname(PG_FUNCTION_ARGS);
/* ---------------- /* ----------------
* variables, macros and other stuff * variables, macros and other stuff
...@@ -87,38 +87,38 @@ static const Oid eqproc[] = { ...@@ -87,38 +87,38 @@ static const Oid eqproc[] = {
* ---------------------------------------------------------------- * ----------------------------------------------------------------
*/ */
static CCHashFunc static PGFunction
GetCCHashFunc(Oid keytype) GetCCHashFunc(Oid keytype)
{ {
switch (keytype) switch (keytype)
{ {
case BOOLOID: case BOOLOID:
case CHAROID: case CHAROID:
return (CCHashFunc) hashchar; return hashchar;
case NAMEOID: case NAMEOID:
return (CCHashFunc) cc_hashname; return cc_hashname;
case INT2OID: case INT2OID:
return (CCHashFunc) hashint2; return hashint2;
case INT2VECTOROID: case INT2VECTOROID:
return (CCHashFunc) hashint2vector; return hashint2vector;
case INT4OID: case INT4OID:
return (CCHashFunc) hashint4; return hashint4;
case TEXTOID: case TEXTOID:
return (CCHashFunc) hashtext; return hashtext;
case REGPROCOID: case REGPROCOID:
case OIDOID: case OIDOID:
return (CCHashFunc) hashoid; return hashoid;
case OIDVECTOROID: case OIDVECTOROID:
return (CCHashFunc) hashoidvector; return hashoidvector;
default: default:
elog(FATAL, "GetCCHashFunc: type %u unsupported as catcache key", elog(FATAL, "GetCCHashFunc: type %u unsupported as catcache key",
keytype); keytype);
return NULL; return (PGFunction) NULL;
} }
} }
static uint32 static Datum
cc_hashname(NameData *n) cc_hashname(PG_FUNCTION_ARGS)
{ {
/* /*
...@@ -129,9 +129,9 @@ cc_hashname(NameData *n) ...@@ -129,9 +129,9 @@ cc_hashname(NameData *n)
*/ */
NameData my_n; NameData my_n;
namestrcpy(&my_n, NameStr(*n)); namestrcpy(&my_n, NameStr(* PG_GETARG_NAME(0)));
return hashname(&my_n); return DirectFunctionCall1(hashname, NameGetDatum(&my_n));
} }
...@@ -320,19 +320,23 @@ CatalogCacheComputeHashIndex(struct catcache * cacheInP) ...@@ -320,19 +320,23 @@ CatalogCacheComputeHashIndex(struct catcache * cacheInP)
{ {
case 4: case 4:
hashIndex ^= hashIndex ^=
(*cacheInP->cc_hashfunc[3]) (cacheInP->cc_skey[3].sk_argument) << 9; DatumGetUInt32(DirectFunctionCall1(cacheInP->cc_hashfunc[3],
cacheInP->cc_skey[3].sk_argument)) << 9;
/* FALLTHROUGH */ /* FALLTHROUGH */
case 3: case 3:
hashIndex ^= hashIndex ^=
(*cacheInP->cc_hashfunc[2]) (cacheInP->cc_skey[2].sk_argument) << 6; DatumGetUInt32(DirectFunctionCall1(cacheInP->cc_hashfunc[2],
cacheInP->cc_skey[2].sk_argument)) << 6;
/* FALLTHROUGH */ /* FALLTHROUGH */
case 2: case 2:
hashIndex ^= hashIndex ^=
(*cacheInP->cc_hashfunc[1]) (cacheInP->cc_skey[1].sk_argument) << 3; DatumGetUInt32(DirectFunctionCall1(cacheInP->cc_hashfunc[1],
cacheInP->cc_skey[1].sk_argument)) << 3;
/* FALLTHROUGH */ /* FALLTHROUGH */
case 1: case 1:
hashIndex ^= hashIndex ^=
(*cacheInP->cc_hashfunc[0]) (cacheInP->cc_skey[0].sk_argument); DatumGetUInt32(DirectFunctionCall1(cacheInP->cc_hashfunc[0],
cacheInP->cc_skey[0].sk_argument));
break; break;
default: default:
elog(FATAL, "CCComputeHashIndex: %d cc_nkeys", cacheInP->cc_nkeys); elog(FATAL, "CCComputeHashIndex: %d cc_nkeys", cacheInP->cc_nkeys);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.42 2000/05/30 04:24:53 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.43 2000/06/05 07:28:55 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -21,6 +21,27 @@ ...@@ -21,6 +21,27 @@
#include "utils/fmgrtab.h" #include "utils/fmgrtab.h"
#include "utils/syscache.h" #include "utils/syscache.h"
/*
* Declaration for old-style function pointer type. This is now used only
* in fmgr_oldstyle() and is no longer exported.
*
* The m68k SVR4 ABI defines that pointers are returned in %a0 instead of
* %d0. So if a function pointer is declared to return a pointer, the
* compiler may look only into %a0, but if the called function was declared
* to return an integer type, it puts its value only into %d0. So the
* caller doesn't pink up the correct return value. The solution is to
* declare the function pointer to return int, so the compiler picks up the
* return value from %d0. (Functions returning pointers put their value
* *additionally* into %d0 for compatibility.) The price is that there are
* some warnings about int->pointer conversions...
*/
#if defined(__mc68000__) && defined(__ELF__)
typedef int32 ((*func_ptr) ());
#else
typedef char *((*func_ptr) ());
#endif
static Datum fmgr_oldstyle(PG_FUNCTION_ARGS); static Datum fmgr_oldstyle(PG_FUNCTION_ARGS);
static Datum fmgr_untrusted(PG_FUNCTION_ARGS); static Datum fmgr_untrusted(PG_FUNCTION_ARGS);
static Datum fmgr_sql(PG_FUNCTION_ARGS); static Datum fmgr_sql(PG_FUNCTION_ARGS);
...@@ -377,7 +398,7 @@ fmgr_oldstyle(PG_FUNCTION_ARGS) ...@@ -377,7 +398,7 @@ fmgr_oldstyle(PG_FUNCTION_ARGS)
default: default:
/* /*
* Increasing FUNC_MAX_ARGS doesn't automatically add cases * Increasing FUNC_MAX_ARGS doesn't automatically add cases
* to the above code, so give the actual value in this error * to the above code, so mention the actual value in this error
* not FUNC_MAX_ARGS. You could add cases to the above if you * not FUNC_MAX_ARGS. You could add cases to the above if you
* needed to support old-style functions with many arguments, * needed to support old-style functions with many arguments,
* but making 'em be new-style is probably a better idea. * but making 'em be new-style is probably a better idea.
...@@ -420,100 +441,6 @@ fmgr_sql(PG_FUNCTION_ARGS) ...@@ -420,100 +441,6 @@ fmgr_sql(PG_FUNCTION_ARGS)
return 0; /* keep compiler happy */ return 0; /* keep compiler happy */
} }
#if 0
/*
* Interface routine for functions using fmgr_faddr
*/
FmgrInfo *fmgr_pl_finfo; /* should GO AWAY */
char *
fmgr_faddr_link(char *arg0, ...)
{
FunctionCallInfoData fcinfo;
int n_arguments;
Datum result;
MemSet(&fcinfo, 0, sizeof(fcinfo));
/* We rely on fmgr_faddr macro to have set back-link to FmgrInfo (ugh) */
fcinfo.flinfo = fmgr_pl_finfo;
fcinfo.nargs = fcinfo.flinfo->fn_nargs;
n_arguments = fcinfo.nargs;
if (n_arguments > 0)
{
fcinfo.arg[0] = (Datum) arg0;
if (n_arguments > 1)
{
va_list pvar;
int i;
if (n_arguments > FUNC_MAX_ARGS)
elog(ERROR, "fmgr_faddr_link: function %u: too many arguments (%d > %d)",
fcinfo.flinfo->fn_oid, n_arguments, FUNC_MAX_ARGS);
va_start(pvar, arg0);
for (i = 1; i < n_arguments; i++)
fcinfo.arg[i] = (Datum) va_arg(pvar, char *);
va_end(pvar);
}
}
result = FunctionCallInvoke(&fcinfo);
/* Check for null result, since caller is clearly not expecting one */
if (fcinfo.isnull)
elog(ERROR, "fmgr_faddr_link: function %u returned NULL",
fcinfo.flinfo->fn_oid);
return (char *) result;
}
/*
* fmgr - return the value of a function call
*
* This is essentially fmgr_info plus call the function.
*/
char *
fmgr(Oid procedureId,...)
{
FmgrInfo flinfo;
FunctionCallInfoData fcinfo;
int n_arguments;
Datum result;
fmgr_info(procedureId, &flinfo);
MemSet(&fcinfo, 0, sizeof(fcinfo));
fcinfo.flinfo = &flinfo;
fcinfo.nargs = flinfo.fn_nargs;
n_arguments = fcinfo.nargs;
if (n_arguments > 0)
{
va_list pvar;
int i;
if (n_arguments > FUNC_MAX_ARGS)
elog(ERROR, "fmgr: function %u: too many arguments (%d > %d)",
flinfo.fn_oid, n_arguments, FUNC_MAX_ARGS);
va_start(pvar, procedureId);
for (i = 0; i < n_arguments; i++)
fcinfo.arg[i] = (Datum) va_arg(pvar, char *);
va_end(pvar);
}
result = FunctionCallInvoke(&fcinfo);
/* Check for null result, since caller is clearly not expecting one */
if (fcinfo.isnull)
elog(ERROR, "fmgr: function %u returned NULL",
flinfo.fn_oid);
return (char *) result;
}
#endif
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* Support routines for callers of fmgr-compatible functions * Support routines for callers of fmgr-compatible functions
...@@ -1267,6 +1194,57 @@ OidFunctionCall9(Oid functionId, Datum arg1, Datum arg2, ...@@ -1267,6 +1194,57 @@ OidFunctionCall9(Oid functionId, Datum arg1, Datum arg2,
} }
/*
* !!! OLD INTERFACE !!!
*
* fmgr() is the only remaining vestige of the old-style caller support
* functions. It's no longer used anywhere in the Postgres distribution,
* but we should leave it around for a release or two to ease the transition
* for user-supplied C functions. OidFunctionCallN() replaces it for new
* code.
*
* DEPRECATED, DO NOT USE IN NEW CODE
*/
char *
fmgr(Oid procedureId,...)
{
FmgrInfo flinfo;
FunctionCallInfoData fcinfo;
int n_arguments;
Datum result;
fmgr_info(procedureId, &flinfo);
MemSet(&fcinfo, 0, sizeof(fcinfo));
fcinfo.flinfo = &flinfo;
fcinfo.nargs = flinfo.fn_nargs;
n_arguments = fcinfo.nargs;
if (n_arguments > 0)
{
va_list pvar;
int i;
if (n_arguments > FUNC_MAX_ARGS)
elog(ERROR, "fmgr: function %u: too many arguments (%d > %d)",
flinfo.fn_oid, n_arguments, FUNC_MAX_ARGS);
va_start(pvar, procedureId);
for (i = 0; i < n_arguments; i++)
fcinfo.arg[i] = (Datum) va_arg(pvar, char *);
va_end(pvar);
}
result = FunctionCallInvoke(&fcinfo);
/* Check for null result, since caller is clearly not expecting one */
if (fcinfo.isnull)
elog(ERROR, "fmgr: function %u returned NULL",
flinfo.fn_oid);
return (char *) result;
}
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* Support routines for standard pass-by-reference datatypes * Support routines for standard pass-by-reference datatypes
* *
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: hash.h,v 1.31 2000/02/21 03:36:51 tgl Exp $ * $Id: hash.h,v 1.32 2000/06/05 07:28:57 tgl Exp $
* *
* NOTES * NOTES
* modeled after Margo Seltzer's hash implementation for unix. * modeled after Margo Seltzer's hash implementation for unix.
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include "access/itup.h" #include "access/itup.h"
#include "access/relscan.h" #include "access/relscan.h"
#include "access/sdir.h" #include "access/sdir.h"
#include "utils/int8.h" #include "fmgr.h"
/* /*
* An overflow page is a spare page allocated for storing data whose * An overflow page is a spare page allocated for storing data whose
...@@ -262,18 +262,24 @@ extern void hashmarkpos(IndexScanDesc scan); ...@@ -262,18 +262,24 @@ extern void hashmarkpos(IndexScanDesc scan);
extern void hashrestrpos(IndexScanDesc scan); extern void hashrestrpos(IndexScanDesc scan);
extern void hashdelete(Relation rel, ItemPointer tid); extern void hashdelete(Relation rel, ItemPointer tid);
/* hashfunc.c */ /*
extern uint32 hashint2(int16 key); * Datatype-specific hash functions in hashfunc.c.
extern uint32 hashint4(uint32 key); *
extern uint32 hashint8(int64 *key); * NOTE: some of these are also used by catcache operations, without
extern uint32 hashfloat4(float32 keyp); * any direct connection to hash indexes.
extern uint32 hashfloat8(float64 keyp); */
extern uint32 hashoid(Oid key); extern Datum hashint2(PG_FUNCTION_ARGS);
extern uint32 hashoidvector(Oid *key); extern Datum hashint4(PG_FUNCTION_ARGS);
extern uint32 hashint2vector(int16 *key); extern Datum hashint8(PG_FUNCTION_ARGS);
extern uint32 hashchar(char key); extern Datum hashfloat4(PG_FUNCTION_ARGS);
extern uint32 hashtext(struct varlena * key); extern Datum hashfloat8(PG_FUNCTION_ARGS);
extern uint32 hashname(NameData *n); extern Datum hashoid(PG_FUNCTION_ARGS);
extern Datum hashoidvector(PG_FUNCTION_ARGS);
extern Datum hashint2vector(PG_FUNCTION_ARGS);
extern Datum hashchar(PG_FUNCTION_ARGS);
extern Datum hashtext(PG_FUNCTION_ARGS);
extern Datum hashname(PG_FUNCTION_ARGS);
/* private routines */ /* private routines */
......
...@@ -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: xact.h,v 1.24 2000/01/26 05:57:51 momjian Exp $ * $Id: xact.h,v 1.25 2000/06/05 07:28:57 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -115,9 +115,9 @@ extern void AbortOutOfAnyTransaction(void); ...@@ -115,9 +115,9 @@ extern void AbortOutOfAnyTransaction(void);
extern TransactionId DisabledTransactionId; extern TransactionId DisabledTransactionId;
/* defined in xid.c */ /* defined in xid.c */
extern TransactionId xidin(char *representation); extern Datum xidin(PG_FUNCTION_ARGS);
extern char *xidout(TransactionId transactionId); extern Datum xidout(PG_FUNCTION_ARGS);
extern bool xideq(TransactionId xid1, TransactionId xid2); extern Datum xideq(PG_FUNCTION_ARGS);
extern void TransactionIdAdd(TransactionId *xid, int value); extern void TransactionIdAdd(TransactionId *xid, int value);
#endif /* XACT_H */ #endif /* XACT_H */
...@@ -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.23 2000/05/29 01:59:10 tgl Exp $ * $Id: catversion.h,v 1.24 2000/06/05 07:28:58 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200005282 #define CATALOG_VERSION_NO 200006021
#endif #endif
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,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_operator.h,v 1.75 2000/04/12 17:16:29 momjian Exp $ * $Id: pg_operator.h,v 1.76 2000/06/05 07:28:59 tgl Exp $
* *
* NOTES * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
...@@ -711,17 +711,17 @@ DATA(insert OID = 1763 ( "@" PGUID 0 l t f 0 1700 1700 0 0 0 0 numeric_ab ...@@ -711,17 +711,17 @@ DATA(insert OID = 1763 ( "@" PGUID 0 l t f 0 1700 1700 0 0 0 0 numeric_ab
/* LZTEXT type */ /* LZTEXT type */
DATA(insert OID = 1657 ( "=" PGUID 0 b t f 1625 1625 16 1657 1658 1659 1659 lztext_eq eqsel eqjoinsel )); DATA(insert OID = 1657 ( "=" PGUID 0 b t f 1625 1625 16 1657 1658 1659 1659 lztext_eq eqsel eqjoinsel ));
DATA(insert OID = 1658 ( "<>" PGUID 0 b t f 1625 1625 16 1658 1657 0 0 lztext_ne neqsel neqjoinsel )); DATA(insert OID = 1658 ( "<>" PGUID 0 b t f 1625 1625 16 1658 1657 0 0 lztext_ne neqsel neqjoinsel ));
DATA(insert OID = 1659 ( "<" PGUID 0 b t f 1625 1625 16 1661 1662 0 0 lztext_lt intltsel intltjoinsel )); DATA(insert OID = 1659 ( "<" PGUID 0 b t f 1625 1625 16 1661 1662 0 0 lztext_lt scalarltsel scalarltjoinsel ));
DATA(insert OID = 1660 ( "<=" PGUID 0 b t f 1625 1625 16 1662 1661 0 0 lztext_le intltsel intltjoinsel )); DATA(insert OID = 1660 ( "<=" PGUID 0 b t f 1625 1625 16 1662 1661 0 0 lztext_le scalarltsel scalarltjoinsel ));
DATA(insert OID = 1661 ( ">" PGUID 0 b t f 1625 1625 16 1659 1660 0 0 lztext_gt intgtsel intgtjoinsel )); DATA(insert OID = 1661 ( ">" PGUID 0 b t f 1625 1625 16 1659 1660 0 0 lztext_gt scalargtsel scalargtjoinsel ));
DATA(insert OID = 1662 ( ">=" PGUID 0 b t f 1625 1625 16 1660 1659 0 0 lztext_ge intgtsel intgtjoinsel )); DATA(insert OID = 1662 ( ">=" PGUID 0 b t f 1625 1625 16 1660 1659 0 0 lztext_ge scalargtsel scalargtjoinsel ));
DATA(insert OID = 1784 ( "=" PGUID 0 b t f 1560 1560 16 1784 1785 1786 1786 biteq eqsel eqjoinsel )); DATA(insert OID = 1784 ( "=" PGUID 0 b t f 1560 1560 16 1784 1785 1786 1786 biteq eqsel eqjoinsel ));
DATA(insert OID = 1785 ( "<>" PGUID 0 b t f 1560 1560 16 1785 1784 0 0 bitne neqsel neqjoinsel )); DATA(insert OID = 1785 ( "<>" PGUID 0 b t f 1560 1560 16 1785 1784 0 0 bitne neqsel neqjoinsel ));
DATA(insert OID = 1786 ( "<" PGUID 0 b t f 1560 1560 16 1787 1789 0 0 bitlt intltsel intltjoinsel )); DATA(insert OID = 1786 ( "<" PGUID 0 b t f 1560 1560 16 1787 1789 0 0 bitlt scalarltsel scalarltjoinsel ));
DATA(insert OID = 1787 ( ">" PGUID 0 b t f 1560 1560 16 1786 1788 0 0 bitgt intgtsel intgtjoinsel )); DATA(insert OID = 1787 ( ">" PGUID 0 b t f 1560 1560 16 1786 1788 0 0 bitgt scalargtsel scalargtjoinsel ));
DATA(insert OID = 1788 ( "<=" PGUID 0 b t f 1560 1560 16 1789 1787 0 0 bitle intltsel intltjoinsel )); DATA(insert OID = 1788 ( "<=" PGUID 0 b t f 1560 1560 16 1789 1787 0 0 bitle scalarltsel scalarltjoinsel ));
DATA(insert OID = 1789 ( ">=" PGUID 0 b t f 1560 1560 16 1788 1786 0 0 bitge intgtsel intgtjoinsel )); DATA(insert OID = 1789 ( ">=" PGUID 0 b t f 1560 1560 16 1788 1786 0 0 bitge scalargtsel scalargtjoinsel ));
DATA(insert OID = 1790 ( "<=>" PGUID 0 b t f 1560 1560 23 0 0 0 0 bitcmp - - )); DATA(insert OID = 1790 ( "<=>" PGUID 0 b t f 1560 1560 23 0 0 0 0 bitcmp - - ));
DATA(insert OID = 1791 ( "&" PGUID 0 b t f 1560 1560 1560 0 0 0 0 bitand - - )); DATA(insert OID = 1791 ( "&" PGUID 0 b t f 1560 1560 1560 0 0 0 0 bitand - - ));
DATA(insert OID = 1792 ( "|" PGUID 0 b t f 1560 1560 1560 0 0 0 0 bitor - - )); DATA(insert OID = 1792 ( "|" PGUID 0 b t f 1560 1560 1560 0 0 0 0 bitor - - ));
...@@ -733,10 +733,10 @@ DATA(insert OID = 1797 ( "||" PGUID 0 b t f 1560 1560 1560 0 0 0 0 bitc ...@@ -733,10 +733,10 @@ DATA(insert OID = 1797 ( "||" PGUID 0 b t f 1560 1560 1560 0 0 0 0 bitc
DATA(insert OID = 1804 ( "=" PGUID 0 b t f 1562 1562 16 1804 1805 1806 1806 varbiteq eqsel eqjoinsel )); DATA(insert OID = 1804 ( "=" PGUID 0 b t f 1562 1562 16 1804 1805 1806 1806 varbiteq eqsel eqjoinsel ));
DATA(insert OID = 1805 ( "<>" PGUID 0 b t f 1562 1562 16 1805 1804 0 0 varbitne neqsel neqjoinsel )); DATA(insert OID = 1805 ( "<>" PGUID 0 b t f 1562 1562 16 1805 1804 0 0 varbitne neqsel neqjoinsel ));
DATA(insert OID = 1806 ( "<" PGUID 0 b t f 1562 1562 16 1807 1809 0 0 varbitlt intltsel intltjoinsel )); DATA(insert OID = 1806 ( "<" PGUID 0 b t f 1562 1562 16 1807 1809 0 0 varbitlt scalarltsel scalarltjoinsel ));
DATA(insert OID = 1807 ( ">" PGUID 0 b t f 1562 1562 16 1806 1808 0 0 varbitgt intgtsel intgtjoinsel )); DATA(insert OID = 1807 ( ">" PGUID 0 b t f 1562 1562 16 1806 1808 0 0 varbitgt scalargtsel scalargtjoinsel ));
DATA(insert OID = 1808 ( "<=" PGUID 0 b t f 1562 1562 16 1809 1807 0 0 varbitle intltsel intltjoinsel )); DATA(insert OID = 1808 ( "<=" PGUID 0 b t f 1562 1562 16 1809 1807 0 0 varbitle scalarltsel scalarltjoinsel ));
DATA(insert OID = 1809 ( ">=" PGUID 0 b t f 1562 1562 16 1808 1806 0 0 varbitge intgtsel intgtjoinsel )); DATA(insert OID = 1809 ( ">=" PGUID 0 b t f 1562 1562 16 1808 1806 0 0 varbitge scalargtsel scalargtjoinsel ));
DATA(insert OID = 1810 ( "<=>" PGUID 0 b t f 1562 1562 23 0 0 0 0 varbitcmp - - )); DATA(insert OID = 1810 ( "<=>" PGUID 0 b t f 1562 1562 23 0 0 0 0 varbitcmp - - ));
DATA(insert OID = 1811 ( "&" PGUID 0 b t f 1562 1562 1562 0 0 0 0 varbitand - - )); DATA(insert OID = 1811 ( "&" PGUID 0 b t f 1562 1562 1562 0 0 0 0 varbitand - - ));
DATA(insert OID = 1812 ( "|" PGUID 0 b t f 1562 1562 1562 0 0 0 0 varbitor - - )); DATA(insert OID = 1812 ( "|" PGUID 0 b t f 1562 1562 1562 0 0 0 0 varbitor - - ));
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -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: smgr.h,v 1.20 2000/04/12 17:16:52 momjian Exp $ * $Id: smgr.h,v 1.21 2000/06/05 07:29:06 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -100,9 +100,9 @@ extern int mmshutdown(void); ...@@ -100,9 +100,9 @@ extern int mmshutdown(void);
extern int MMShmemSize(void); extern int MMShmemSize(void);
/* smgrtype.c */ /* smgrtype.c */
extern char *smgrout(int2 i); extern Datum smgrout(PG_FUNCTION_ARGS);
extern int2 smgrin(char *s); extern Datum smgrin(PG_FUNCTION_ARGS);
extern bool smgreq(int2 a, int2 b); extern Datum smgreq(PG_FUNCTION_ARGS);
extern bool smgrne(int2 a, int2 b); extern Datum smgrne(PG_FUNCTION_ARGS);
#endif /* SMGR_H */ #endif /* SMGR_H */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment