diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c
index 4b935492ea59798484bea2f1389d280741ba9140..b72fb5d651ed3e7ff461d4da7de955f5a67a53dd 100644
--- a/src/backend/access/transam/clog.c
+++ b/src/backend/access/transam/clog.c
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.10 2002/09/02 02:47:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/clog.c,v 1.11 2002/09/26 22:58:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -809,8 +809,8 @@ TruncateCLOG(TransactionId oldestXact)
 	if (!ScanCLOGDirectory(cutoffPage, false))
 		return;					/* nothing to remove */
 
-	/* Perform a CHECKPOINT */
-	CreateCheckPoint(false);
+	/* Perform a forced CHECKPOINT */
+	CreateCheckPoint(false, true);
 
 	/*
 	 * Scan CLOG shared memory and remove any pages preceding the cutoff
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0ff60292e68324563979d397dfcd6080a312a7d7..1944e557708f5cc31d8cc839187ecc56361e9ca3 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.106 2002/09/04 20:31:13 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.107 2002/09/26 22:58:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2743,7 +2743,7 @@ StartupXLOG(void)
 		 * checkpoint to become prevCheckPoint...
 		 */
 		ControlFile->checkPoint = checkPointLoc;
-		CreateCheckPoint(true);
+		CreateCheckPoint(true, true);
 		XLogCloseRelationCache();
 	}
 
@@ -2901,7 +2901,7 @@ ShutdownXLOG(void)
 
 	CritSectionCount++;
 	CreateDummyCaches();
-	CreateCheckPoint(true);
+	CreateCheckPoint(true, true);
 	ShutdownCLOG();
 	CritSectionCount--;
 
@@ -2910,9 +2910,12 @@ ShutdownXLOG(void)
 
 /*
  * Perform a checkpoint --- either during shutdown, or on-the-fly
+ *
+ * If force is true, we force a checkpoint regardless of whether any XLOG
+ * activity has occurred since the last one.
  */
 void
-CreateCheckPoint(bool shutdown)
+CreateCheckPoint(bool shutdown, bool force)
 {
 	CheckPoint	checkPoint;
 	XLogRecPtr	recptr;
@@ -2955,21 +2958,21 @@ CreateCheckPoint(bool shutdown)
 	LWLockAcquire(WALInsertLock, LW_EXCLUSIVE);
 
 	/*
-	 * If this isn't a shutdown, and we have not inserted any XLOG records
-	 * since the start of the last checkpoint, skip the checkpoint.  The
-	 * idea here is to avoid inserting duplicate checkpoints when the
-	 * system is idle.	That wastes log space, and more importantly it
+	 * If this isn't a shutdown or forced checkpoint, and we have not inserted
+	 * any XLOG records since the start of the last checkpoint, skip the
+	 * checkpoint.  The idea here is to avoid inserting duplicate checkpoints
+	 * when the system is idle. That wastes log space, and more importantly it
 	 * exposes us to possible loss of both current and previous checkpoint
 	 * records if the machine crashes just as we're writing the update.
-	 * (Perhaps it'd make even more sense to checkpoint only when the
-	 * previous checkpoint record is in a different xlog page?)
+	 * (Perhaps it'd make even more sense to checkpoint only when the previous
+	 * checkpoint record is in a different xlog page?)
 	 *
 	 * We have to make two tests to determine that nothing has happened since
 	 * the start of the last checkpoint: current insertion point must
 	 * match the end of the last checkpoint record, and its redo pointer
 	 * must point to itself.
 	 */
-	if (!shutdown)
+	if (!shutdown && !force)
 	{
 		XLogRecPtr	curInsert;
 
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 4df563b4285a51f2d7f1e71196504c97b756c8d5..a2b26bcdb00d506de0fd0057a405db3d2b4cf410 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.143 2002/09/25 20:31:40 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.144 2002/09/26 22:58:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -390,7 +390,7 @@ BootstrapMain(int argc, char *argv[])
 
 		case BS_XLOG_CHECKPOINT:
 			CreateDummyCaches();
-			CreateCheckPoint(false);
+			CreateCheckPoint(false, false);
 			SetSavedRedoRecPtr();		/* pass redo ptr back to
 										 * postmaster */
 			proc_exit(0);		/* done */
@@ -445,7 +445,7 @@ BootstrapMain(int argc, char *argv[])
 	Int_yyparse();
 
 	SetProcessingMode(NormalProcessing);
-	CreateCheckPoint(true);
+	CreateCheckPoint(true, true);
 	SetProcessingMode(BootstrapProcessing);
 
 	/* clean up processing */
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 92d876b265bab8b8b768c1b64bbee37612c713c7..c6bd3050825bb5fa6c14e82698aee84d33f6f91e 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.177 2002/09/04 20:31:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.178 2002/09/26 22:58:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -831,11 +831,9 @@ ProcessUtility(Node *parsetree,
 			break;
 
 		case T_CheckPointStmt:
-			{
-				if (!superuser())
-					elog(ERROR, "permission denied");
-				CreateCheckPoint(false);
-			}
+			if (!superuser())
+				elog(ERROR, "permission denied");
+			CreateCheckPoint(false, false);
 			break;
 
 		case T_ReindexStmt:
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index c8c49936803e1fc1318fc1991a587703d333ed22..f5c3e59cbcef9ab7211d8d9af29b68ed1ccd7f19 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: xlog.h,v 1.38 2002/09/26 22:46:29 tgl Exp $
+ * $Id: xlog.h,v 1.39 2002/09/26 22:58:34 tgl Exp $
  */
 #ifndef XLOG_H
 #define XLOG_H
@@ -204,7 +204,7 @@ extern void XLOGPathInit(void);
 extern void BootStrapXLOG(void);
 extern void StartupXLOG(void);
 extern void ShutdownXLOG(void);
-extern void CreateCheckPoint(bool shutdown);
+extern void CreateCheckPoint(bool shutdown, bool force);
 extern void SetThisStartUpID(void);
 extern void XLogPutNextOid(Oid nextOid);
 extern void SetSavedRedoRecPtr(void);