diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 593d127dfaedee6f1f9e3dc29bdea57608df907d..3c9c39b03f12584b20b274a6699585ba8aec68fc 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.474 2005/11/03 20:02:50 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475 2005/11/05 03:04:52 tgl Exp $
  *
  * NOTES
  *
@@ -2647,7 +2647,6 @@ BackendRun(Port *port)
 	/* set these to empty in case they are needed before we set them up */
 	port->remote_host = "";
 	port->remote_port = "";
-	port->commandTag = "";
 
 	/*
 	 * Initialize libpq and enable reporting of ereport errors to the client.
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 245b8eeee239a039d0911143357113e86e6ea3f1..467bde6c1ccc488aa87a948f51fb019e5505bb2b 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.158 2005/10/15 02:49:26 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/lmgr/lock.c,v 1.159 2005/11/05 03:04:52 tgl Exp $
  *
  * NOTES
  *	  Outside modules can create a lock table and acquire/release
@@ -1049,21 +1049,21 @@ WaitOnLock(LOCKMETHODID lockmethodid, LOCALLOCK *locallock,
 		   ResourceOwner owner)
 {
 	LockMethod	lockMethodTable = LockMethods[lockmethodid];
-	char	   *new_status,
-			   *old_status;
-	size_t		len;
+	const char *old_status;
+	char	   *new_status;
+	int			len;
 
 	Assert(lockmethodid < NumLockMethods);
 
 	LOCK_PRINT("WaitOnLock: sleeping on lock",
 			   locallock->lock, locallock->tag.mode);
 
-	old_status = pstrdup(get_ps_display());
-	len = strlen(old_status);
+	old_status = get_ps_display(&len);
 	new_status = (char *) palloc(len + 8 + 1);
 	memcpy(new_status, old_status, len);
 	strcpy(new_status + len, " waiting");
 	set_ps_display(new_status);
+	new_status[len] = '\0';		/* truncate off " waiting" */
 
 	awaitedLock = locallock;
 	awaitedOwner = owner;
@@ -1104,8 +1104,7 @@ WaitOnLock(LOCKMETHODID lockmethodid, LOCALLOCK *locallock,
 
 	awaitedLock = NULL;
 
-	set_ps_display(old_status);
-	pfree(old_status);
+	set_ps_display(new_status);
 	pfree(new_status);
 
 	LOCK_PRINT("WaitOnLock: wakeup on lock",
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 64403ce9b18efc2ebb85c1e90bb9e11641c5093f..44ebac245c974e41ffe2012fce7ae7751178d089 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -42,7 +42,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.166 2005/11/03 17:11:39 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.167 2005/11/05 03:04:52 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -67,6 +67,7 @@
 #include "tcop/tcopprot.h"
 #include "utils/memutils.h"
 #include "utils/guc.h"
+#include "utils/ps_status.h"
 
 
 /* Global variables */
@@ -1484,19 +1485,26 @@ log_line_prefix(StringInfo buf)
 				break;
 			case 'i':
 				if (MyProcPort)
-					appendStringInfo(buf, "%s", MyProcPort->commandTag);
+				{
+					const char *psdisp;
+					int		displen;
+
+					psdisp = get_ps_display(&displen);
+					appendStringInfo(buf, "%.*s", displen, psdisp);
+				}
 				break;
 			case 'r':
-				if (MyProcPort)
+				if (MyProcPort && MyProcPort->remote_host)
 				{
 					appendStringInfo(buf, "%s", MyProcPort->remote_host);
-					if (strlen(MyProcPort->remote_port) > 0)
+					if (MyProcPort->remote_port &&
+						MyProcPort->remote_port[0] != '\0')
 						appendStringInfo(buf, "(%s)",
 										 MyProcPort->remote_port);
 				}
 				break;
 			case 'h':
-				if (MyProcPort)
+				if (MyProcPort && MyProcPort->remote_host)
 					appendStringInfo(buf, "%s", MyProcPort->remote_host);
 				break;
 			case 'q':
diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c
index af1421cd2f63493774761611463c3085a21bfc96..878ff81e241269bc14b708917843bb81ea44eed5 100644
--- a/src/backend/utils/misc/ps_status.c
+++ b/src/backend/utils/misc/ps_status.c
@@ -5,7 +5,7 @@
  * to contain some useful information. Mechanism differs wildly across
  * platforms.
  *
- * $PostgreSQL: pgsql/src/backend/utils/misc/ps_status.c,v 1.25 2005/10/15 02:49:36 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/misc/ps_status.c,v 1.26 2005/11/05 03:04:52 tgl Exp $
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  * various details abducted from various places
@@ -307,10 +307,6 @@ init_ps_display(const char *username, const char *dbname,
 void
 set_ps_display(const char *activity)
 {
-	/* save tag for possible use by elog.c */
-	if (MyProcPort)
-		MyProcPort->commandTag = activity;
-
 #ifndef PS_USE_NONE
 	/* no ps display for stand-alone backend */
 	if (!IsUnderPostmaster)
@@ -365,15 +361,31 @@ set_ps_display(const char *activity)
 
 /*
  * Returns what's currently in the ps display, in case someone needs
- * it.	Note that only the activity part is returned.
+ * it.	Note that only the activity part is returned.  On some platforms
+ * the string will not be null-terminated, so return the effective
+ * length into *displen.
  */
 const char *
-get_ps_display(void)
+get_ps_display(int *displen)
 {
 #ifdef PS_USE_CLOBBER_ARGV
+	size_t		offset;
+
 	/* If ps_buffer is a pointer, it might still be null */
 	if (!ps_buffer)
+	{
+		*displen = 0;
 		return "";
+	}
+
+	/* Remove any trailing spaces to offset the effect of PS_PADDING */
+	offset = ps_buffer_size;
+	while (offset > ps_buffer_fixed_size && ps_buffer[offset-1] == PS_PADDING)
+		offset--;
+
+	*displen = offset - ps_buffer_fixed_size;
+#else
+	*displen = strlen(ps_buffer + ps_buffer_fixed_size);
 #endif
 
 	return ps_buffer + ps_buffer_fixed_size;
diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h
index 465abdbd38a9973e2d3b4968f63e6764e0b7bac2..8d7f88d1352d24efe1828107040b9b83091c7d6d 100644
--- a/src/include/libpq/libpq-be.h
+++ b/src/include/libpq/libpq-be.h
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/libpq/libpq-be.h,v 1.52 2005/10/15 02:49:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/libpq/libpq-be.h,v 1.53 2005/11/05 03:04:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -80,7 +80,6 @@ typedef struct Port
 	 * but since it gets used by elog.c in the same way as database_name and
 	 * other members of this struct, we may as well keep it here.
 	 */
-	const char *commandTag;		/* current command tag */
 	struct timeval session_start;		/* for session duration logging */
 
 	/*
diff --git a/src/include/utils/ps_status.h b/src/include/utils/ps_status.h
index 6855d34a34ff62412be73af2cdc32996204f8b5e..b940888784b27abdfa75562569358dc7c7eb5e98 100644
--- a/src/include/utils/ps_status.h
+++ b/src/include/utils/ps_status.h
@@ -4,7 +4,7 @@
  *
  * Declarations for backend/utils/misc/ps_status.c
  *
- * $PostgreSQL: pgsql/src/include/utils/ps_status.h,v 1.25 2004/02/22 21:26:54 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/utils/ps_status.h,v 1.26 2005/11/05 03:04:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -19,6 +19,6 @@ extern void init_ps_display(const char *username, const char *dbname,
 
 extern void set_ps_display(const char *activity);
 
-extern const char *get_ps_display(void);
+extern const char *get_ps_display(int *displen);
 
 #endif   /* PS_STATUS_H */