diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 5c07795c8a90ec5cbafaad7c1d0df7538b998e60..32380eeb37b3c6a8abcf2e22b40f7560a0d2d5a7 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.163 2004/08/23 23:22:44 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.164 2004/08/28 18:18:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -4922,9 +4922,11 @@ CreateCheckPoint(bool shutdown, bool force)
 	 * Truncate pg_subtrans if possible.  We can throw away all data before
 	 * the oldest XMIN of any running transaction.  No future transaction will
 	 * attempt to reference any pg_subtrans entry older than that (see Asserts
-	 * in subtrans.c).
+	 * in subtrans.c).  During recovery, though, we mustn't do this because
+	 * StartupSUBTRANS hasn't been called yet.
 	 */
-	TruncateSUBTRANS(GetOldestXmin(true));
+	if (!InRecovery)
+		TruncateSUBTRANS(GetOldestXmin(true));
 
 	LWLockRelease(CheckpointLock);
 }