diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index bdd486825d0c3aacf53765b83be574461ac22838..b333a0ed4e36fc2ca49619b5315cc772b00a2026 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.56 2000/01/26 05:57:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.57 2000/03/24 02:41:46 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -41,13 +41,13 @@ static int text_cmp(text *arg1, text *arg2); * The input is scaned twice. * The error checking of input is minimal. */ -text * +bytea * byteain(char *inputText) { char *tp; char *rp; int byte; - text *result; + bytea *result; if (inputText == NULL) elog(ERROR, "Bad input string for type bytea"); @@ -64,7 +64,7 @@ byteain(char *inputText) } tp = inputText; byte += VARHDRSZ; - result = (text *) palloc(byte); + result = (bytea *) palloc(byte); result->vl_len = byte; /* varlena? */ rp = result->vl_dat; while (*tp != '\0') @@ -90,10 +90,9 @@ byteain(char *inputText) * NULL vlena should be an error--returning string with NULL for now. */ char * -byteaout(text *vlena) +byteaout(bytea *vlena) { char *result; - char *vp; char *rp; int val; /* holds unprintable chars */ @@ -173,7 +172,6 @@ textin(char *inputText) * textout - converts internal representation to "..." */ char * - textout(text *vlena) { int len; @@ -218,7 +216,7 @@ textlen(text *t) #endif if (!PointerIsValid(t)) - elog(ERROR, "Null input to textlen"); + return 0; #ifdef MULTIBYTE len = 0; @@ -247,10 +245,9 @@ int32 textoctetlen(text *t) { if (!PointerIsValid(t)) - elog(ERROR, "Null input to textoctetlen"); + return 0; return VARSIZE(t) - VARHDRSZ; - } /* textoctetlen() */ /* @@ -621,19 +618,18 @@ text_smaller(text *arg1, text *arg2) } /*------------------------------------------------------------- - * byteaGetSize + * byteaoctetlen * * get the number of bytes contained in an instance of type 'bytea' *------------------------------------------------------------- */ int32 -byteaGetSize(text *v) +byteaoctetlen(bytea *v) { - int len; - - len = v->vl_len - sizeof(v->vl_len); + if (!PointerIsValid(v)) + return 0; - return len; + return VARSIZE(v) - VARHDRSZ; } /*------------------------------------------------------------- @@ -645,23 +641,22 @@ byteaGetSize(text *v) *------------------------------------------------------------- */ int32 -byteaGetByte(text *v, int32 n) +byteaGetByte(bytea *v, int32 n) { int len; int byte; - len = byteaGetSize(v); + if (!PointerIsValid(v)) + return 0; - if (n >= len) - { - elog(ERROR, "byteaGetByte: index (=%d) out of range [0..%d]", + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len) + elog(ERROR, "byteaGetByte: index %d out of range [0..%d]", n, len - 1); - } -#ifdef USE_LOCALE - byte = (unsigned char) (v->vl_dat[n]); -#else - byte = v->vl_dat[n]; -#endif + + byte = ((unsigned char *) VARDATA(v))[n]; + return (int32) byte; } @@ -675,16 +670,26 @@ byteaGetByte(text *v, int32 n) *------------------------------------------------------------- */ int32 -byteaGetBit(text *v, int32 n) +byteaGetBit(bytea *v, int32 n) { int byteNo, bitNo; + int len; int byte; + if (!PointerIsValid(v)) + return 0; + + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len*8) + elog(ERROR, "byteaGetBit: index %d out of range [0..%d]", + n, len*8 - 1); + byteNo = n / 8; bitNo = n % 8; - byte = byteaGetByte(v, byteNo); + byte = ((unsigned char *) VARDATA(v))[byteNo]; if (byte & (1 << bitNo)) return (int32) 1; @@ -700,36 +705,31 @@ byteaGetBit(text *v, int32 n) * *------------------------------------------------------------- */ -text * -byteaSetByte(text *v, int32 n, int32 newByte) +bytea * +byteaSetByte(bytea *v, int32 n, int32 newByte) { int len; - text *res; + bytea *res; - len = byteaGetSize(v); + if (!PointerIsValid(v)) + return 0; - if (n >= len) - { - elog(ERROR, - "byteaSetByte: index (=%d) out of range [0..%d]", + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len) + elog(ERROR, "byteaSetByte: index %d out of range [0..%d]", n, len - 1); - } /* * Make a copy of the original varlena. */ - res = (text *) palloc(VARSIZE(v)); - if (res == NULL) - { - elog(ERROR, "byteaSetByte: Out of memory (%d bytes requested)", - VARSIZE(v)); - } - memmove((char *) res, (char *) v, VARSIZE(v)); + res = (bytea *) palloc(VARSIZE(v)); + memcpy((char *) res, (char *) v, VARSIZE(v)); /* * Now set the byte. */ - res->vl_dat[n] = newByte; + ((unsigned char *) VARDATA(res))[n] = newByte; return res; } @@ -742,26 +742,37 @@ byteaSetByte(text *v, int32 n, int32 newByte) * *------------------------------------------------------------- */ -text * -byteaSetBit(text *v, int32 n, int32 newBit) +bytea * +byteaSetBit(bytea *v, int32 n, int32 newBit) { - text *res; + bytea *res; + int len; int oldByte, newByte; int byteNo, bitNo; + if (!PointerIsValid(v)) + return NULL; + + len = VARSIZE(v) - VARHDRSZ; + + if (n < 0 || n >= len*8) + elog(ERROR, "byteaSetBit: index %d out of range [0..%d]", + n, len*8 - 1); + + byteNo = n / 8; + bitNo = n % 8; + /* * sanity check! */ if (newBit != 0 && newBit != 1) - elog(ERROR, "byteaSetByte: new bit must be 0 or 1"); + elog(ERROR, "byteaSetBit: new bit must be 0 or 1"); /* * get the byte where the bit we want is stored. */ - byteNo = n / 8; - bitNo = n % 8; oldByte = byteaGetByte(v, byteNo); /* diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index b8befe6882840b079eb56b8da76373ff4cdd80e7..be1e38f5949ab69e47000c928ad4969f8e6c9f37 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pg_proc.h,v 1.128 2000/03/19 01:12:18 tgl Exp $ + * $Id: pg_proc.h,v 1.129 2000/03/24 02:41:44 tgl Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -948,15 +948,15 @@ DESCR("equal"); DATA(insert OID = 717 ( int4eqoid PGUID 11 f t t 2 f 16 "23 26" 100 0 0 100 int4eqoid - )); DESCR("equal"); -DATA(insert OID = 720 ( byteaGetSize PGUID 11 f t t 1 f 23 "17" 100 0 0 100 byteaGetSize - )); +DATA(insert OID = 720 ( octet_length PGUID 11 f t t 1 f 23 "17" 100 0 0 100 byteaoctetlen - )); DESCR(""); -DATA(insert OID = 721 ( byteaGetByte PGUID 11 f t t 2 f 23 "17 23" 100 0 0 100 byteaGetByte - )); +DATA(insert OID = 721 ( get_byte PGUID 11 f t t 2 f 23 "17 23" 100 0 0 100 byteaGetByte - )); DESCR(""); -DATA(insert OID = 722 ( byteaSetByte PGUID 11 f t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetByte - )); +DATA(insert OID = 722 ( set_byte PGUID 11 f t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetByte - )); DESCR(""); -DATA(insert OID = 723 ( byteaGetBit PGUID 11 f t t 2 f 23 "17 23" 100 0 0 100 byteaGetBit - )); +DATA(insert OID = 723 ( get_bit PGUID 11 f t t 2 f 23 "17 23" 100 0 0 100 byteaGetBit - )); DESCR(""); -DATA(insert OID = 724 ( byteaSetBit PGUID 11 f t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetBit - )); +DATA(insert OID = 724 ( set_bit PGUID 11 f t t 3 f 17 "17 23 23" 100 0 0 100 byteaSetBit - )); DESCR(""); DATA(insert OID = 725 ( dist_pl PGUID 11 f t t 2 f 701 "600 628" 100 0 0 100 dist_pl - )); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 7e4ee5a560d2e80c9db65e551f4370f9647f94c3..008d3a7f20fe6768c7eb64b1bda2b8575a2c1505 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: builtins.h,v 1.106 2000/03/14 23:06:50 thomas Exp $ + * $Id: builtins.h,v 1.107 2000/03/24 02:41:45 tgl Exp $ * * NOTES * This should normally only be included by fmgr.h. @@ -450,13 +450,13 @@ extern text *text_substr(text *string, int32 m, int32 n); extern text *name_text(NameData *s); extern NameData *text_name(text *s); -extern struct varlena *byteain(char *inputText); -extern char *byteaout(struct varlena * vlena); -extern int32 byteaGetSize(struct varlena * v); -extern int32 byteaGetByte(struct varlena * v, int32 n); -extern int32 byteaGetBit(struct varlena * v, int32 n); -extern struct varlena *byteaSetByte(struct varlena * v, int32 n, int32 newByte); -extern struct varlena *byteaSetBit(struct varlena * v, int32 n, int32 newBit); +extern bytea *byteain(char *inputText); +extern char *byteaout(bytea *vlena); +extern int32 byteaoctetlen(bytea *v); +extern int32 byteaGetByte(bytea *v, int32 n); +extern int32 byteaGetBit(bytea *v, int32 n); +extern bytea *byteaSetByte(bytea *v, int32 n, int32 newByte); +extern bytea *byteaSetBit(bytea *v, int32 n, int32 newBit); /* like.c */ extern bool namelike(NameData *n, struct varlena * p);