Index: contrib/pg_resetxlog/README.pg_resetxlog
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_resetxlog/README.pg_resetxlog,v
retrieving revision 1.2
diff -c -r1.2 README.pg_resetxlog
*** contrib/pg_resetxlog/README.pg_resetxlog	2002/01/10 17:51:52	1.2
--- contrib/pg_resetxlog/README.pg_resetxlog	2002/01/10 19:49:23
***************
*** 22,28 ****
  the database software.
  
  A tertiary purpose it its use by pg_upgrade to set the next transaction
! id in pg_control.
  
  To run the program, make sure your postmaster is not running, then
  (as the Postgres admin user) do
--- 22,28 ----
  the database software.
  
  A tertiary purpose it its use by pg_upgrade to set the next transaction
! id and checkpoint location in pg_control.
  
  To run the program, make sure your postmaster is not running, then
  (as the Postgres admin user) do
Index: contrib/pg_resetxlog/pg_resetxlog.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_resetxlog/pg_resetxlog.c,v
retrieving revision 1.12
diff -c -r1.12 pg_resetxlog.c
*** contrib/pg_resetxlog/pg_resetxlog.c	2002/01/10 18:08:29	1.12
--- contrib/pg_resetxlog/pg_resetxlog.c	2002/01/10 19:49:24
***************
*** 683,688 ****
--- 683,689 ----
  		   "Catalog version number:               %u\n"
  		   "Current log file id:                  %u\n"
  		   "Next log file segment:                %u\n"
+ 		   "Latest checkpoint location:           %X/%X\n"
  		   "Latest checkpoint's StartUpID:        %u\n"
  		   "Latest checkpoint's NextXID:          %u\n"
  		   "Latest checkpoint's NextOID:          %u\n"
***************
*** 695,700 ****
--- 696,703 ----
  		   ControlFile.catalog_version_no,
  		   ControlFile.logId,
  		   ControlFile.logSeg,
+ 		   ControlFile.checkPoint.xlogid,
+ 		   ControlFile.checkPoint.xrecoff,
  		   ControlFile.checkPointCopy.ThisStartUpID,
  		   ControlFile.checkPointCopy.nextXid,
  		   ControlFile.checkPointCopy.nextOid,
***************
*** 709,715 ****
   * Write out the new pg_control file.
   */
  static void
! RewriteControlFile(TransactionId set_xid)
  {
  	int			fd;
  	char		buffer[BLCKSZ]; /* need not be aligned */
--- 712,718 ----
   * Write out the new pg_control file.
   */
  static void
! RewriteControlFile(TransactionId set_xid, XLogRecPtr set_checkpoint)
  {
  	int			fd;
  	char		buffer[BLCKSZ]; /* need not be aligned */
***************
*** 733,745 ****
  	ControlFile.time = time(NULL);
  	ControlFile.logId = newXlogId;
  	ControlFile.logSeg = newXlogSeg + 1;
- 	ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
  	ControlFile.prevCheckPoint.xlogid = 0;
  	ControlFile.prevCheckPoint.xrecoff = 0;
  
  	if (set_xid != 0)
  		ControlFile.checkPointCopy.nextXid = set_xid;
! 	
  	/* Contents are protected with a CRC */
  	INIT_CRC64(ControlFile.crc);
  	COMP_CRC64(ControlFile.crc,
--- 736,753 ----
  	ControlFile.time = time(NULL);
  	ControlFile.logId = newXlogId;
  	ControlFile.logSeg = newXlogSeg + 1;
  	ControlFile.prevCheckPoint.xlogid = 0;
  	ControlFile.prevCheckPoint.xrecoff = 0;
  
  	if (set_xid != 0)
  		ControlFile.checkPointCopy.nextXid = set_xid;
! 
! 	if (set_checkpoint.xlogid == 0 &&
! 		set_checkpoint.xrecoff == 0)
! 		ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
! 	else
! 		ControlFile.checkPoint = set_checkpoint;
! 
  	/* Contents are protected with a CRC */
  	INIT_CRC64(ControlFile.crc);
  	COMP_CRC64(ControlFile.crc,
***************
*** 929,938 ****
  static void
  usage(void)
  {
! 	fprintf(stderr, "Usage: pg_resetxlog [-f] [-n] [-x xid] PGDataDirectory\n"
! 			" -f\tforce update to be done\n"
! 			" -n\tno update, just show extracted pg_control values (for testing)\n"
! 			" -x XID\tset XID in pg_control\n");
  	exit(1);
  }
  
--- 937,947 ----
  static void
  usage(void)
  {
! 	fprintf(stderr, "Usage: pg_resetxlog [-f] [-n] [-x xid] [ -l log_id offset ] PGDataDirectory\n"
! 			"  -f\t  force update to be done\n"
! 			"  -n\t  no update, just show extracted pg_control values (for testing)\n"
! 			"  -x XID  set XID in pg_control\n"
! 			"  -l log_id offset   set checkpoint location in pg_control\n");
  	exit(1);
  }
  
***************
*** 944,949 ****
--- 953,959 ----
  	bool		force = false;
  	bool		noupdate = false;
  	TransactionId set_xid = 0;
+ 	XLogRecPtr	set_checkpoint = {0,0};
  	int			fd;
  	char		path[MAXPGPATH];
  
***************
*** 967,972 ****
--- 977,999 ----
  				exit(1);
  			}
  		}
+ 		else if (strcmp(argv[argn], "-l") == 0)
+ 		{
+ 			argn++;
+ 			if (argn == argc)
+ 				usage();
+ 			set_checkpoint.xlogid = strtoul(argv[argn], NULL, 0);
+ 			argn++;
+ 			if (argn == argc)
+ 				usage();
+ 			set_checkpoint.xrecoff = strtoul(argv[argn], NULL, 0);
+ 			if (set_checkpoint.xlogid == 0 &&
+ 				set_checkpoint.xrecoff == 0)
+ 			{
+ 				fprintf(stderr, "Checkpoint can not be '0 0'.");
+ 				exit(1);
+ 			}
+ 		}
  		else
  			usage();
  	}
***************
*** 1035,1041 ****
  	/*
  	 * Else, do the dirty deed.
  	 */
! 	RewriteControlFile(set_xid);
  	KillExistingXLOG();
  	WriteEmptyXLOG();
  
--- 1062,1068 ----
  	/*
  	 * Else, do the dirty deed.
  	 */
! 	RewriteControlFile(set_xid, set_checkpoint);
  	KillExistingXLOG();
  	WriteEmptyXLOG();
  
