The attached patches against 7.3 and 7.4 fix a subtraction carry bug in
xlog.c.

-- 
John Nield
[EMAIL PROTECTED]
Index: pgsql-server-7_3/src/backend/access/transam/xlog.c
diff -c pgsql-server-7_3/src/backend/access/transam/xlog.c:1.1.1.1 
pgsql-server-7_3/src/backend/access/transam/xlog.c:1.1.1.1.2.2
*** pgsql-server-7_3/src/backend/access/transam/xlog.c:1.1.1.1  Thu Jun 19 14:25:08 
2003
--- pgsql-server-7_3/src/backend/access/transam/xlog.c  Thu Jun 19 18:21:54 2003
***************
*** 354,362 ****
          logSeg = (xlrp).xrecoff / XLogSegSize \
        )
  #define XLByteToPrevSeg(xlrp, logId, logSeg)  \
!       ( logId = (xlrp).xlogid, \
!         logSeg = ((xlrp).xrecoff - 1) / XLogSegSize \
!       )
  
  /*
   * Is an XLogRecPtr within a particular XLOG segment?
--- 354,366 ----
          logSeg = (xlrp).xrecoff / XLogSegSize \
        )
  #define XLByteToPrevSeg(xlrp, logId, logSeg)  \
!       do { \
!               logId = (xlrp).xlogid; \
!         if ( (xlrp).xrecoff == 0 ) \
!                       { logId--; logSeg = XLogSegsPerFile - 1; } \
!               else \
!                       logSeg = ((xlrp).xrecoff - 1) / XLogSegSize; \
!       } while (0)
  
  /*
   * Is an XLogRecPtr within a particular XLOG segment?
***************
*** 369,376 ****
         (xlrp).xrecoff / XLogSegSize == (logSeg))
  
  #define XLByteInPrevSeg(xlrp, logId, logSeg)  \
!       ((xlrp).xlogid == (logId) && \
!        ((xlrp).xrecoff - 1) / XLogSegSize == (logSeg))
  
  
  #define XLogFileName(path, log, seg)  \
--- 373,384 ----
         (xlrp).xrecoff / XLogSegSize == (logSeg))
  
  #define XLByteInPrevSeg(xlrp, logId, logSeg)  \
!   ( \
!       ((xlrp).xrecoff == 0)? \
!               ((xlrp).xlogid - 1 == (logId) && (XLogSegsPerFile - 1) == logSeg): \
!               ((xlrp).xlogid == (logId) &&  \
!                                               ((xlrp).xrecoff - 1) / XLogSegSize == 
(logSeg)) \
!   )
  
  
  #define XLogFileName(path, log, seg)  \
*** src/backend/access/transam/xlog.c.orig	Fri Jun 20 09:04:20 2003
--- src/backend/access/transam/xlog.c	Fri Jun 20 09:10:04 2003
***************
*** 354,362 ****
  	  logSeg = (xlrp).xrecoff / XLogSegSize \
  	)
  #define XLByteToPrevSeg(xlrp, logId, logSeg)	\
! 	( logId = (xlrp).xlogid, \
! 	  logSeg = ((xlrp).xrecoff - 1) / XLogSegSize \
! 	)
  
  /*
   * Is an XLogRecPtr within a particular XLOG segment?
--- 354,366 ----
  	  logSeg = (xlrp).xrecoff / XLogSegSize \
  	)
  #define XLByteToPrevSeg(xlrp, logId, logSeg)	\
! 	do { \
! 		logId = (xlrp).xlogid; \
!         if ( (xlrp).xrecoff == 0 ) \
! 			{ logId--; logSeg = XLogSegsPerFile - 1; } \
! 		else \
! 			logSeg = ((xlrp).xrecoff - 1) / XLogSegSize; \
! 	} while (0)
  
  /*
   * Is an XLogRecPtr within a particular XLOG segment?
***************
*** 369,376 ****
  	 (xlrp).xrecoff / XLogSegSize == (logSeg))
  
  #define XLByteInPrevSeg(xlrp, logId, logSeg)	\
! 	((xlrp).xlogid == (logId) && \
! 	 ((xlrp).xrecoff - 1) / XLogSegSize == (logSeg))
  
  
  #define XLogFileName(path, log, seg)	\
--- 373,384 ----
  	 (xlrp).xrecoff / XLogSegSize == (logSeg))
  
  #define XLByteInPrevSeg(xlrp, logId, logSeg)	\
!   ( \
! 	((xlrp).xrecoff == 0)? \
! 		((xlrp).xlogid - 1 == (logId) && (XLogSegsPerFile - 1) == logSeg): \
! 		((xlrp).xlogid == (logId) &&  \
! 						((xlrp).xrecoff - 1) / XLogSegSize == (logSeg)) \
!   )
  
  
  #define XLogFileName(path, log, seg)	\
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to