aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/adt/varlena.c115
-rw-r--r--src/include/catalog/pg_proc.h12
-rw-r--r--src/include/utils/builtins.h16
3 files changed, 77 insertions, 66 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index bdd486825d0..b333a0ed4e3 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 b8befe68828..be1e38f5949 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 7e4ee5a560d..008d3a7f20f 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);