@@ -2909,6 +2909,19 @@ heap_page_prepare_for_xid(Relation relation, Buffer buffer,
2909
2909
2910
2910
delta = (int64 ) (xid - FirstNormalTransactionId ) - (int64 ) base ;
2911
2911
2912
+ if (xid < base + delta + FirstNormalTransactionId ||
2913
+ xid > base + delta + MaxShortTransactionId )
2914
+ {
2915
+ elog (FATAL , "Fatal xid base calculation error: "
2916
+ "xid = " XID_FMT ", "
2917
+ "base = " XID_FMT ", "
2918
+ "min = %u, "
2919
+ "max = %u, "
2920
+ "delta = " INT64_FORMAT ,
2921
+ xid , base , min , max , delta
2922
+ );
2923
+ }
2924
+
2912
2925
Assert (xid >= base + delta + FirstNormalTransactionId );
2913
2926
Assert (xid <= base + delta + MaxShortTransactionId );
2914
2927
@@ -2926,6 +2939,9 @@ heap_page_prepare_for_xid(Relation relation, Buffer buffer,
2926
2939
int64 freeDelta = MaxShortTransactionId - max ,
2927
2940
requiredDelta = (base + FirstNormalTransactionId ) - xid ;
2928
2941
2942
+ /* Shouldn't consider setting base less than 0 */
2943
+ freeDelta = Min (freeDelta , base );
2944
+
2929
2945
if (requiredDelta <= freeDelta )
2930
2946
{
2931
2947
int64 delta = - (freeDelta + requiredDelta ) / 2 ;
@@ -2967,6 +2983,21 @@ heap_page_prepare_for_xid(Relation relation, Buffer buffer,
2967
2983
{
2968
2984
int64 delta = (freeDelta + requiredDelta ) / 2 ;
2969
2985
2986
+ if (xid < base + delta + FirstNormalTransactionId ||
2987
+ xid > base + delta + MaxShortTransactionId )
2988
+ {
2989
+ elog (FATAL , "Fatal xid base calculation error: "
2990
+ "xid = " XID_FMT ", "
2991
+ "base = " XID_FMT ", "
2992
+ "min = %u, "
2993
+ "max = %u, "
2994
+ "freeDelta = " INT64_FORMAT ", "
2995
+ "requiredDelta = " INT64_FORMAT ", "
2996
+ "delta = " INT64_FORMAT ,
2997
+ xid , base , min , max , freeDelta , requiredDelta , delta
2998
+ );
2999
+ }
3000
+
2970
3001
Assert (xid >= base + delta + FirstNormalTransactionId );
2971
3002
Assert (xid <= base + delta + MaxShortTransactionId );
2972
3003
0 commit comments