GIN's ItemPointerIsMin, ItemPointerIsMax, and ItemPointerIsLossyPage macros
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 5 Jun 2009 18:50:47 +0000 (18:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 5 Jun 2009 18:50:47 +0000 (18:50 +0000)
should use GinItemPointerGetBlockNumber/GinItemPointerGetOffsetNumber,
not ItemPointerGetBlockNumber/ItemPointerGetOffsetNumber, because the latter
will Assert() on ip_posid == 0, ie a "Min" pointer.  (Thus, ItemPointerIsMin
has never worked at all, but it seems unused at present.)  I'm not certain
that the case can occur in normal functioning, but it's blowing up on me
while investigating Tatsuo-san's data corruption problem.  In any case it
seems like a problem waiting to bite someone.

Back-patch just in case this really is a problem for somebody in the field.

src/include/access/gin.h

index 95cef21b460088d347c9de4178dbf8840e36f756..44510a36a566401aaf535a25fd1fb49faf396f7f 100644 (file)
@@ -124,18 +124,18 @@ typedef struct GinMetaPageData
 #define ItemPointerSetMin(p)  \
        ItemPointerSet((p), (BlockNumber)0, (OffsetNumber)0)
 #define ItemPointerIsMin(p)  \
-       (ItemPointerGetOffsetNumber(p) == (OffsetNumber)0 && \
-        ItemPointerGetBlockNumber(p) == (BlockNumber)0)
+       (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0 && \
+        GinItemPointerGetBlockNumber(p) == (BlockNumber)0)
 #define ItemPointerSetMax(p)  \
        ItemPointerSet((p), InvalidBlockNumber, (OffsetNumber)0xffff)
 #define ItemPointerIsMax(p)  \
-       (ItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
-        ItemPointerGetBlockNumber(p) == InvalidBlockNumber)
+       (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
+        GinItemPointerGetBlockNumber(p) == InvalidBlockNumber)
 #define ItemPointerSetLossyPage(p, b)  \
        ItemPointerSet((p), (b), (OffsetNumber)0xffff)
 #define ItemPointerIsLossyPage(p)  \
-       (ItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
-        ItemPointerGetBlockNumber(p) != InvalidBlockNumber)
+       (GinItemPointerGetOffsetNumber(p) == (OffsetNumber)0xffff && \
+        GinItemPointerGetBlockNumber(p) != InvalidBlockNumber)
 
 typedef struct
 {