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);