diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 813f70d5dbf49fca7ea369a603bc6597c9963d38..5616d0b3cd1911b3f65e5d98c97d98218ecc230f 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -13,7 +13,7 @@
  *
  *	Copyright (c) 2001-2003, PostgreSQL Global Development Group
  *
- *	$PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.75 2004/06/14 18:08:18 tgl Exp $
+ *	$PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.76 2004/06/26 16:32:02 tgl Exp $
  * ----------
  */
 #include "postgres.h"
@@ -22,12 +22,10 @@
 #include <fcntl.h>
 #include <sys/param.h>
 #include <sys/time.h>
-#include <sys/types.h>
 #include <sys/socket.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <errno.h>
 #include <signal.h>
 #include <time.h>
 
@@ -55,6 +53,47 @@
 #include "utils/syscache.h"
 
 
+/* ----------
+ * Paths for the statistics files. The %s is replaced with the
+ * installation's $PGDATA.
+ * ----------
+ */
+#define PGSTAT_STAT_FILENAME	"%s/global/pgstat.stat"
+#define PGSTAT_STAT_TMPFILE		"%s/global/pgstat.tmp.%d"
+
+/* ----------
+ * Timer definitions.
+ * ----------
+ */
+#define PGSTAT_STAT_INTERVAL	500		/* How often to write the status
+										 * file; in milliseconds. */
+
+#define PGSTAT_DESTROY_DELAY	10000	/* How long to keep destroyed
+										 * objects known, to give delayed
+										 * UDP packets time to arrive;
+										 * in milliseconds. */
+
+#define PGSTAT_DESTROY_COUNT	(PGSTAT_DESTROY_DELAY / PGSTAT_STAT_INTERVAL)
+
+#define PGSTAT_RESTART_INTERVAL 60		/* How often to attempt to restart
+										 * a failed statistics collector;
+										 * in seconds. */
+
+/* ----------
+ * Amount of space reserved in pgstat_recvbuffer().
+ * ----------
+ */
+#define PGSTAT_RECVBUFFERSZ		((int) (1024 * sizeof(PgStat_Msg)))
+
+/* ----------
+ * The initial size hints for the hash tables used in the collector.
+ * ----------
+ */
+#define PGSTAT_DB_HASH_SIZE		16
+#define PGSTAT_BE_HASH_SIZE		512
+#define PGSTAT_TAB_HASH_SIZE	512
+
+
 /* ----------
  * GUC parameters
  * ----------
@@ -2760,7 +2799,7 @@ pgstat_recv_activity(PgStat_MsgActivity *msg, int len)
 
 	/*
 	 * Here we check explicitly for 0 return, since we don't want to
-	 * mangle the activity of an active backend by a delayed packed from a
+	 * mangle the activity of an active backend by a delayed packet from a
 	 * dead one.
 	 */
 	if (pgstat_add_backend(&msg->m_hdr) != 0)
@@ -2768,7 +2807,7 @@ pgstat_recv_activity(PgStat_MsgActivity *msg, int len)
 
 	entry = &(pgStatBeTable[msg->m_hdr.m_backendid - 1]);
 
-	strncpy(entry->activity, msg->m_what, PGSTAT_ACTIVITY_SIZE);
+	StrNCpy(entry->activity, msg->m_what, PGSTAT_ACTIVITY_SIZE);
 
 	entry->activity_start_sec =
 		GetCurrentAbsoluteTimeUsec(&entry->activity_start_usec);
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 61cb86bb3c6da9dda6391d2e992b07f467f2e971..ea2d7e1f1335f79e14ca05d2cc6d2b3d040be1ae 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 2001-2003, PostgreSQL Global Development Group
  *
- *	$PostgreSQL: pgsql/src/include/pgstat.h,v 1.24 2004/06/14 18:08:19 tgl Exp $
+ *	$PostgreSQL: pgsql/src/include/pgstat.h,v 1.25 2004/06/26 16:32:04 tgl Exp $
  * ----------
  */
 #ifndef PGSTAT_H
@@ -16,38 +16,6 @@
 #include "utils/rel.h"
 
 
-/* ----------
- * Paths for the statistics files. The %s is replaced with the
- * installations $PGDATA.
- * ----------
- */
-#define PGSTAT_STAT_FILENAME	"%s/global/pgstat.stat"
-#define PGSTAT_STAT_TMPFILE		"%s/global/pgstat.tmp.%d"
-
-/* ----------
- * Timer definitions.
- * ----------
- */
-#define PGSTAT_STAT_INTERVAL	500		/* How often to write the status	*/
- /* file; in milliseconds.			 */
-
-#define PGSTAT_DESTROY_DELAY	10000	/* How long to keep destroyed		*/
- /* objects known, to give delayed	 */
- /* UDP packets time to arrive;		 */
- /* in milliseconds.				 */
-
-#define PGSTAT_DESTROY_COUNT	(PGSTAT_DESTROY_DELAY / PGSTAT_STAT_INTERVAL)
-
-#define PGSTAT_RESTART_INTERVAL 60		/* How often to attempt to restart */
- /* a failed statistics collector; in seconds. */
-
-/* ----------
- * How much of the actual query string to send to the collector.
- * ----------
- */
-#define PGSTAT_ACTIVITY_SIZE	256
-
-
 /* ----------
  * The types of backend/postmaster -> collector messages
  * ----------
@@ -61,22 +29,6 @@
 #define PGSTAT_MTYPE_DROPDB			6
 #define PGSTAT_MTYPE_RESETCOUNTER	7
 
-/* ----------
- * Amount of space reserved in pgstat_recvbuffer().
- * ----------
- */
-#define PGSTAT_RECVBUFFERSZ		((int) (1024 * sizeof(PgStat_Msg)))
-
-
-/* ----------
- * The initial size hints for the hash tables used in the collector.
- * ----------
- */
-#define PGSTAT_DB_HASH_SIZE		16
-#define PGSTAT_BE_HASH_SIZE		512
-#define PGSTAT_TAB_HASH_SIZE	512
-
-
 /* ----------
  * The data type used for counters.
  * ----------
@@ -84,82 +36,6 @@
 typedef int64 PgStat_Counter;
 
 
-/* ------------------------------------------------------------
- * Statistic collector data structures follow
- * ------------------------------------------------------------
- */
-/* ----------
- * PgStat_StatDBEntry			The collectors data per database
- * ----------
- */
-typedef struct PgStat_StatDBEntry
-{
-	Oid			databaseid;
-	HTAB	   *tables;
-	int			n_backends;
-	PgStat_Counter n_connects;
-	PgStat_Counter n_xact_commit;
-	PgStat_Counter n_xact_rollback;
-	PgStat_Counter n_blocks_fetched;
-	PgStat_Counter n_blocks_hit;
-	int			destroy;
-} PgStat_StatDBEntry;
-
-
-/* ----------
- * PgStat_StatBeEntry			The collectors data per backend
- * ----------
- */
-typedef struct PgStat_StatBeEntry
-{
-	Oid			databaseid;
-	Oid			userid;
-	int			procpid;
-	char		activity[PGSTAT_ACTIVITY_SIZE];
-	AbsoluteTime activity_start_sec;
-	int			activity_start_usec;
-} PgStat_StatBeEntry;
-
-
-/* ----------
- * PgStat_StatBeDead			Because UDP packets can arrive out of
- *								order, we need to keep some information
- *								about backends that are known to be
- *								dead for some seconds. This info is held
- *								in a hash table of these structs.
- * ----------
- */
-typedef struct PgStat_StatBeDead
-{
-	int			procpid;
-	int			backendid;
-	int			destroy;
-} PgStat_StatBeDead;
-
-
-/* ----------
- * PgStat_StatTabEntry			The collectors data table data
- * ----------
- */
-typedef struct PgStat_StatTabEntry
-{
-	Oid			tableid;
-
-	PgStat_Counter numscans;
-
-	PgStat_Counter tuples_returned;
-	PgStat_Counter tuples_fetched;
-	PgStat_Counter tuples_inserted;
-	PgStat_Counter tuples_updated;
-	PgStat_Counter tuples_deleted;
-
-	PgStat_Counter blocks_fetched;
-	PgStat_Counter blocks_hit;
-
-	int			destroy;
-} PgStat_StatTabEntry;
-
-
 /* ------------------------------------------------------------
  * Message formats follow
  * ------------------------------------------------------------
@@ -181,7 +57,15 @@ typedef struct PgStat_MsgHdr
 } PgStat_MsgHdr;
 
 /* ----------
- * PgStat_TabEntry				A table slot in a MsgTabstat
+ * Space available in a message.  This will keep the UDP packets below 1K,
+ * which should fit unfragmented into the MTU of the lo interface on most
+ * platforms. Does anybody care for platforms where it doesn't?
+ * ----------
+ */
+#define PGSTAT_MSG_PAYLOAD	(1000 - sizeof(PgStat_MsgHdr))
+
+/* ----------
+ * PgStat_TableEntry			Per-table info in a MsgTabstat
  * ----------
  */
 typedef struct PgStat_TableEntry
@@ -234,27 +118,22 @@ typedef struct PgStat_MsgBeterm
  *								to parse a query.
  * ----------
  */
+#define PGSTAT_ACTIVITY_SIZE	PGSTAT_MSG_PAYLOAD
+
 typedef struct PgStat_MsgActivity
 {
 	PgStat_MsgHdr m_hdr;
 	char		m_what[PGSTAT_ACTIVITY_SIZE];
 } PgStat_MsgActivity;
 
-/* ----------
- * How many table entries fit into a MsgTabstat. Actually,
- * this will keep the UDP packets below 1K, what should fit
- * unfragmented into the MTU of the lo interface on most
- * platforms. Does anybody care for platforms where it doesn't?
- * ----------
- */
-#define PGSTAT_NUM_TABENTRIES	((1000 - sizeof(PgStat_MsgHdr))			\
-								/ sizeof(PgStat_TableEntry))
-
 /* ----------
  * PgStat_MsgTabstat			Sent by the backend to report table
  *								and buffer access statistics.
  * ----------
  */
+#define PGSTAT_NUM_TABENTRIES	((PGSTAT_MSG_PAYLOAD - 3 * sizeof(int))		\
+								/ sizeof(PgStat_TableEntry))
+
 typedef struct PgStat_MsgTabstat
 {
 	PgStat_MsgHdr m_hdr;
@@ -264,19 +143,14 @@ typedef struct PgStat_MsgTabstat
 	PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES];
 } PgStat_MsgTabstat;
 
-
-/* ----------
- * How many Oid entries fit into a MsgTabpurge.
- * ----------
- */
-#define PGSTAT_NUM_TABPURGE		((1000 - sizeof(PgStat_MsgHdr))			\
-								/ sizeof(Oid))
-
 /* ----------
  * PgStat_MsgTabpurge			Sent by the backend to tell the collector
  *								about dead tables.
  * ----------
  */
+#define PGSTAT_NUM_TABPURGE		((PGSTAT_MSG_PAYLOAD - sizeof(int))		\
+								/ sizeof(Oid))
+
 typedef struct PgStat_MsgTabpurge
 {
 	PgStat_MsgHdr m_hdr;
@@ -325,6 +199,83 @@ typedef union PgStat_Msg
 } PgStat_Msg;
 
 
+/* ------------------------------------------------------------
+ * Statistic collector data structures follow
+ * ------------------------------------------------------------
+ */
+
+/* ----------
+ * PgStat_StatDBEntry			The collectors data per database
+ * ----------
+ */
+typedef struct PgStat_StatDBEntry
+{
+	Oid			databaseid;
+	HTAB	   *tables;
+	int			n_backends;
+	PgStat_Counter n_connects;
+	PgStat_Counter n_xact_commit;
+	PgStat_Counter n_xact_rollback;
+	PgStat_Counter n_blocks_fetched;
+	PgStat_Counter n_blocks_hit;
+	int			destroy;
+} PgStat_StatDBEntry;
+
+
+/* ----------
+ * PgStat_StatBeEntry			The collectors data per backend
+ * ----------
+ */
+typedef struct PgStat_StatBeEntry
+{
+	Oid			databaseid;
+	Oid			userid;
+	int			procpid;
+	AbsoluteTime activity_start_sec;
+	int			activity_start_usec;
+	char		activity[PGSTAT_ACTIVITY_SIZE];
+} PgStat_StatBeEntry;
+
+
+/* ----------
+ * PgStat_StatBeDead			Because UDP packets can arrive out of
+ *								order, we need to keep some information
+ *								about backends that are known to be
+ *								dead for some seconds. This info is held
+ *								in a hash table of these structs.
+ * ----------
+ */
+typedef struct PgStat_StatBeDead
+{
+	int			procpid;
+	int			backendid;
+	int			destroy;
+} PgStat_StatBeDead;
+
+
+/* ----------
+ * PgStat_StatTabEntry			The collectors data table data
+ * ----------
+ */
+typedef struct PgStat_StatTabEntry
+{
+	Oid			tableid;
+
+	PgStat_Counter numscans;
+
+	PgStat_Counter tuples_returned;
+	PgStat_Counter tuples_fetched;
+	PgStat_Counter tuples_inserted;
+	PgStat_Counter tuples_updated;
+	PgStat_Counter tuples_deleted;
+
+	PgStat_Counter blocks_fetched;
+	PgStat_Counter blocks_hit;
+
+	int			destroy;
+} PgStat_StatTabEntry;
+
+
 /* ----------
  * GUC parameters
  * ----------