diff --git a/doc/src/sgml/libpgtcl.sgml b/doc/src/sgml/libpgtcl.sgml
index c0ffddebeeae208d7f143ac7b615f4f8fcd9ade3..f3f0112c4e3894280e7732db130126196f93a120 100644
--- a/doc/src/sgml/libpgtcl.sgml
+++ b/doc/src/sgml/libpgtcl.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpgtcl.sgml,v 1.38 2003/09/29 18:18:35 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpgtcl.sgml,v 1.39 2003/10/31 00:18:55 tgl Exp $
 -->
 
 <chapter id="pgtcl">
@@ -1217,7 +1217,7 @@ pg_lo_creat <parameter>conn</parameter> <parameter>mode</parameter>
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which to create the large
+      The handle of a connection to the database in which to create the large
       object.
      </para>
     </listitem>
@@ -1284,8 +1284,8 @@ pg_lo_open <parameter>conn</parameter> <parameter>loid</parameter> <parameter>mo
 
     <listitem>
      <para>
-      The handle of a database connection in which the large object to
-      be opened exists.
+      The handle of a connection to the database in which the large object
+      exists.
      </para>
     </listitem>
    </varlistentry>
@@ -1354,7 +1354,7 @@ pg_lo_close <parameter>conn</parameter> <parameter>descriptor</parameter>
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
@@ -1417,7 +1417,7 @@ pg_lo_read <parameter>conn</parameter> <parameter>descriptor</parameter> <parame
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
@@ -1458,7 +1458,9 @@ pg_lo_read <parameter>conn</parameter> <parameter>descriptor</parameter> <parame
   <title>Return Value</title>
 
   <para>
-   None
+   The number of bytes actually read is returned; this could be less than
+   the number requested if the end of the large object is reached first.
+   In event of an error, the return value is negative.
   </para>
  </refsect1>
 </refentry>
@@ -1499,7 +1501,7 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
@@ -1519,7 +1521,8 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
     <term><parameter>buf</parameter></term>
     <listitem>
      <para>
-      The string to write to the large object (not a variable name).
+      The string to write to the large object (not a variable name,
+      but the value itself).
      </para>
     </listitem>
    </varlistentry>
@@ -1528,7 +1531,8 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
     <term><parameter>len</parameter></term>
     <listitem>
      <para>
-      The maximum number of bytes to write.
+      The maximum number of bytes to write.  The number written will
+      be the smaller of this value and the length of the string.
      </para>
     </listitem>
    </varlistentry>
@@ -1539,7 +1543,9 @@ pg_lo_write <parameter>conn</parameter> <parameter>descriptor</parameter> <param
   <title>Return Value</title>
 
   <para>
-   None
+   The number of bytes actually written is returned; this will ordinarily
+   be the same as the number requested.
+   In event of an error, the return value is negative.
   </para>
  </refsect1>
 </refentry>
@@ -1580,7 +1586,7 @@ pg_lo_lseek <parameter>conn</parameter> <parameter>descriptor</parameter> <param
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
@@ -1664,7 +1670,7 @@ pg_lo_tell <parameter>conn</parameter> <parameter>descriptor</parameter>
 
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
@@ -1727,7 +1733,7 @@ pg_lo_unlink <parameter>conn</parameter> <parameter>loid</parameter>
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
@@ -1788,7 +1794,7 @@ pg_lo_import <parameter>conn</parameter> <parameter>filename</parameter>
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which to create the large
+      The handle of a connection to the database in which to create the large
       object.
      </para>
     </listitem>
@@ -1858,7 +1864,7 @@ pg_lo_export <parameter>conn</parameter> <parameter>loid</parameter> <parameter>
     <term><parameter>conn</parameter></term>
     <listitem>
      <para>
-      The handle of a database connection in which the large object
+      The handle of a connection to the database in which the large object
       exists.
      </para>
     </listitem>
diff --git a/src/interfaces/libpgtcl/pgtclCmds.c b/src/interfaces/libpgtcl/pgtclCmds.c
index 657a59fe89269a1d96b3c29fc520ec78965465ec..dad51c4dcfdb25592290ec4ab07000ab0ef36430 100644
--- a/src/interfaces/libpgtcl/pgtclCmds.c
+++ b/src/interfaces/libpgtcl/pgtclCmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.73 2003/08/04 02:40:16 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.74 2003/10/31 00:18:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1215,17 +1215,21 @@ Pg_lo_read(ClientData cData, Tcl_Interp *interp, int objc,
 	buf = ckalloc(len + 1);
 
 	nbytes = lo_read(conn, fd, buf, len);
-	bufObj = Tcl_NewStringObj(buf, nbytes);
 
-	if (Tcl_ObjSetVar2(interp, bufVar, NULL, bufObj,
-					   TCL_LEAVE_ERR_MSG | TCL_PARSE_PART1) == NULL)
-		rc = TCL_ERROR;
-	else
+	if (nbytes >= 0)
+	{
+		bufObj = Tcl_NewByteArrayObj(buf, nbytes);
+
+		if (Tcl_ObjSetVar2(interp, bufVar, NULL, bufObj,
+						   TCL_LEAVE_ERR_MSG | TCL_PARSE_PART1) == NULL)
+			rc = TCL_ERROR;
+	}
+
+	if (rc == TCL_OK)
 		Tcl_SetObjResult(interp, Tcl_NewIntObj(nbytes));
 
 	ckfree(buf);
 	return rc;
-
 }
 
 #else
@@ -1265,7 +1269,9 @@ Pg_lo_read(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[])
 
 	nbytes = lo_read(conn, fd, buf, len);
 
-	Tcl_SetVar(interp, bufVar, buf, TCL_LEAVE_ERR_MSG);
+	if (nbytes >= 0)
+		Tcl_SetVar(interp, bufVar, buf, TCL_LEAVE_ERR_MSG);
+
 	sprintf(interp->result, "%d", nbytes);
 	ckfree(buf);
 	return TCL_OK;
@@ -1307,7 +1313,7 @@ Pg_lo_write(ClientData cData, Tcl_Interp *interp, int objc,
 	if (Tcl_GetIntFromObj(interp, objv[2], &fd) != TCL_OK)
 		return TCL_ERROR;
 
-	buf = Tcl_GetStringFromObj(objv[3], &nbytes);
+	buf = Tcl_GetByteArrayFromObj(objv[3], &nbytes);
 
 	if (Tcl_GetIntFromObj(interp, objv[4], &len) != TCL_OK)
 		return TCL_ERROR;