OBJS       = rawpage.o heapfuncs.o btreefuncs.o fsmfuncs.o
 
 EXTENSION = pageinspect
-DATA = pageinspect--1.0.sql pageinspect--unpackaged--1.0.sql
+DATA = pageinspect--1.0.sql pageinspect--unpackaged--1.0.sql \
+   pageinspect--1.1.sql pageinspect--1.0--1.1.sql
 
 ifdef USE_PGXS
 PG_CONFIG = pg_config
 
 # pageinspect extension
 comment = 'inspect the contents of database pages at a low level'
-default_version = '1.0'
+default_version = '1.1'
 module_pathname = '$libdir/pageinspect'
 relocatable = true
 
             (uint32) (lsn >> 32), (uint32) lsn);
 
    values[0] = CStringGetTextDatum(lsnchar);
-   values[1] = UInt16GetDatum(PageGetTLI(page));
+   values[1] = UInt16GetDatum(page->pd_checksum);
    values[2] = UInt16GetDatum(page->pd_flags);
    values[3] = UInt16GetDatum(page->pd_lower);
    values[4] = UInt16GetDatum(page->pd_upper);
 
       passed as argument.  For example:
 <screen>
 test=# SELECT * FROM page_header(get_raw_page('pg_class', 0));
-    lsn    | tli | flags | lower | upper | special | pagesize | version | prune_xid
------------+-----+-------+-------+-------+---------+----------+---------+-----------
- 0/24A1B50 |   1 |     1 |   232 |   368 |    8192 |     8192 |       4 |         0
+    lsn    | checksum | flags  | lower | upper | special | pagesize | version | prune_xid
+-----------+----------+--------+-------+-------+---------+----------+---------+-----------
+ 0/24A1B50 |        1 |      1 |   232 |   368 |    8192 |     8192 |       4 |         0
 </screen>
       The returned columns correspond to the fields in the
       <structname>PageHeaderData</> struct.
 
 
                recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT, rdata);
                PageSetLSN(page, recptr);
-               PageSetTLI(page, ThisTimeLineID);
            }
 
            LockBuffer(stack->buffer, GIN_UNLOCK);
 
                    recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT, rdata);
                    PageSetLSN(page, recptr);
-                   PageSetTLI(page, ThisTimeLineID);
                    PageSetLSN(lpage, recptr);
-                   PageSetTLI(lpage, ThisTimeLineID);
                    PageSetLSN(rpage, recptr);
-                   PageSetTLI(rpage, ThisTimeLineID);
                }
 
                UnlockReleaseBuffer(rbuffer);
 
                    recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT, rdata);
                    PageSetLSN(lpage, recptr);
-                   PageSetTLI(lpage, ThisTimeLineID);
                    PageSetLSN(rpage, recptr);
-                   PageSetTLI(rpage, ThisTimeLineID);
                }
                UnlockReleaseBuffer(rbuffer);
                END_CRIT_SECTION();
 
 
        recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT_LISTPAGE, rdata);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    /* get free space before releasing buffer */
 
        recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_UPDATE_META_PAGE, rdata);
        PageSetLSN(metapage, recptr);
-       PageSetTLI(metapage, ThisTimeLineID);
 
        if (buffer != InvalidBuffer)
        {
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
    }
 
 
            recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_DELETE_LISTPAGE, rdata);
            PageSetLSN(metapage, recptr);
-           PageSetTLI(metapage, ThisTimeLineID);
 
            for (i = 0; i < data.ndeleted; i++)
            {
                page = BufferGetPage(buffers[i]);
                PageSetLSN(page, recptr);
-               PageSetTLI(page, ThisTimeLineID);
            }
        }
 
 
 
        recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_CREATE_PTREE, rdata);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    UnlockReleaseBuffer(buffer);
 
        page = BufferGetPage(RootBuffer);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
 
        page = BufferGetPage(MetaBuffer);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    UnlockReleaseBuffer(MetaBuffer);
 
 
        recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_UPDATE_META_PAGE, &rdata);
        PageSetLSN(metapage, recptr);
-       PageSetTLI(metapage, ThisTimeLineID);
    }
 
    UnlockReleaseBuffer(metabuffer);
 
 
    recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_VACUUM_PAGE, rdata);
    PageSetLSN(page, recptr);
-   PageSetTLI(page, ThisTimeLineID);
 }
 
 static bool
 
        recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_DELETE_PAGE, rdata);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
        PageSetLSN(parentPage, recptr);
-       PageSetTLI(parentPage, ThisTimeLineID);
        if (leftBlkno != InvalidBlockNumber)
        {
            page = BufferGetPage(lBuffer);
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
    }
 
 
    GinInitMetabuffer(MetaBuffer);
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(MetaBuffer);
 
    RootBuffer = XLogReadBuffer(*node, GIN_ROOT_BLKNO, true);
    GinInitBuffer(RootBuffer, GIN_LEAF);
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(RootBuffer);
 
    UnlockReleaseBuffer(RootBuffer);
    GinPageGetOpaque(page)->maxoff = data->nitem;
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
 
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
        }
 
        PageSetLSN(page, lsn);
-       PageSetTLI(page, ThisTimeLineID);
 
        MarkBufferDirty(buffer);
    }
    }
 
    PageSetLSN(rpage, lsn);
-   PageSetTLI(rpage, ThisTimeLineID);
    MarkBufferDirty(rbuffer);
 
    PageSetLSN(lpage, lsn);
-   PageSetTLI(lpage, ThisTimeLineID);
    MarkBufferDirty(lbuffer);
 
    if (!data->isLeaf && data->updateBlkno != InvalidBlockNumber)
        }
 
        PageSetLSN(rootPage, lsn);
-       PageSetTLI(rootPage, ThisTimeLineID);
 
        MarkBufferDirty(rootBuf);
        UnlockReleaseBuffer(rootBuf);
        }
 
        PageSetLSN(page, lsn);
-       PageSetTLI(page, ThisTimeLineID);
        MarkBufferDirty(buffer);
    }
 
                Assert(GinPageIsData(page));
                GinPageGetOpaque(page)->flags = GIN_DELETED;
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(dbuffer);
            }
        }
                Assert(!GinPageIsLeaf(page));
                GinPageDeletePostingItem(page, data->parentOffset);
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(pbuffer);
            }
        }
                Assert(GinPageIsData(page));
                GinPageGetOpaque(page)->rightlink = data->rightLink;
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(lbuffer);
            }
            UnlockReleaseBuffer(lbuffer);
    {
        memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData));
        PageSetLSN(metapage, lsn);
-       PageSetTLI(metapage, ThisTimeLineID);
        MarkBufferDirty(metabuffer);
    }
 
                    GinPageGetOpaque(page)->maxoff++;
 
                    PageSetLSN(page, lsn);
-                   PageSetTLI(page, ThisTimeLineID);
                    MarkBufferDirty(buffer);
                }
                UnlockReleaseBuffer(buffer);
                    GinPageGetOpaque(page)->rightlink = data->newRightlink;
 
                    PageSetLSN(page, lsn);
-                   PageSetTLI(page, ThisTimeLineID);
                    MarkBufferDirty(buffer);
                }
                UnlockReleaseBuffer(buffer);
    }
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
 
    UnlockReleaseBuffer(buffer);
    {
        memcpy(GinPageGetMeta(metapage), &data->metadata, sizeof(GinMetaPageData));
        PageSetLSN(metapage, lsn);
-       PageSetTLI(metapage, ThisTimeLineID);
        MarkBufferDirty(metabuffer);
    }
 
                GinPageGetOpaque(page)->flags = GIN_DELETED;
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
 
 
        for (ptr = dist; ptr; ptr = ptr->next)
        {
            PageSetLSN(ptr->page, recptr);
-           PageSetTLI(ptr->page, ThisTimeLineID);
        }
 
        /*
                                    leftchildbuf);
 
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
        else
        {
        GistClearFollowRight(leftpg);
 
        PageSetLSN(leftpg, recptr);
-       PageSetTLI(leftpg, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
 
 
        recptr = XLogInsert(RM_GIST_ID, XLOG_GIST_CREATE_INDEX, &rdata);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
    else
        PageSetLSN(page, gistGetFakeLSN(heap));
 
                                            todelete, ntodelete,
                                            NULL, 0, InvalidBuffer);
                    PageSetLSN(page, recptr);
-                   PageSetTLI(page, ThisTimeLineID);
                }
                else
                    PageSetLSN(page, gistGetFakeLSN(rel));
 
        GistClearFollowRight(page);
 
        PageSetLSN(page, lsn);
-       PageSetTLI(page, ThisTimeLineID);
        MarkBufferDirty(buffer);
    }
    UnlockReleaseBuffer(buffer);
 
    GistPageGetOpaque(page)->rightlink = InvalidBlockNumber;
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
        }
 
        PageSetLSN(page, lsn);
-       PageSetTLI(page, ThisTimeLineID);
        MarkBufferDirty(buffer);
 
        if (i == 0)
    GISTInitBuffer(buffer, F_LEAF);
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
 
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
        recptr = XLogInsert(RM_HEAP_ID, info, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
            recptr = XLogInsert(RM_HEAP2_ID, info, rdata);
 
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
        recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        if (newbuf != buffer)
        {
            PageSetLSN(BufferGetPage(newbuf), recptr);
-           PageSetTLI(BufferGetPage(newbuf), ThisTimeLineID);
        }
        PageSetLSN(BufferGetPage(buffer), recptr);
-       PageSetTLI(BufferGetPage(buffer), ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_LOCK, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
            recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_LOCK_UPDATED, rdata);
 
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
        recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_INPLACE, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
    if (!PageIsNew(page))
    {
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
    if (!PageIsNew(page))
    {
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    return recptr;
     */
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
    }
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
    memcpy(page, (char *) xlrec + SizeOfHeapNewpage, BLCKSZ);
 
    /*
-    * The page may be uninitialized. If so, we can't set the LSN and TLI
-    * because that would corrupt the page.
+    * The page may be uninitialized. If so, we can't set the LSN because that
+    * would corrupt the page.
     */
    if (!PageIsNew(page))
    {
        PageSetLSN(page, lsn);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    MarkBufferDirty(buffer);
    /* Make sure there is no forward chain link in t_ctid */
    htup->t_ctid = xlrec->target.tid;
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
    freespace = PageGetHeapFreeSpace(page);     /* needed to update FSM below */
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
 
    if (xlrec->all_visible_cleared)
        PageClearAllVisible(page);
    freespace = PageGetHeapFreeSpace(page);     /* needed to update FSM below */
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
 
    if (xlrec->all_visible_cleared)
        PageClearAllVisible(page);
    }
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(obuffer);
 
    /* Deal with new tuple */
    freespace = PageGetHeapFreeSpace(page);     /* needed to update FSM below */
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(nbuffer);
    UnlockReleaseBuffer(nbuffer);
 
    /* Make sure there is no forward chain link in t_ctid */
    htup->t_ctid = xlrec->target.tid;
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
    HeapTupleHeaderSetXmax(htup, xlrec->xmax);
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
           newlen);
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
 
                                    prstate.latestRemovedXid);
 
            PageSetLSN(BufferGetPage(buffer), recptr);
-           PageSetTLI(BufferGetPage(buffer), ThisTimeLineID);
        }
    }
    else
 
                recptr = log_heap_visible(rel->rd_node, heapBlk, buf,
                                          cutoff_xid);
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
 
            if (BufferIsValid(metabuf))
            {
                PageSetLSN(metapg, recptr);
-               PageSetTLI(metapg, ThisTimeLineID);
            }
 
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
     * examine these fields and possibly dump them in a page image.
     */
    PageSetLSN(leftpage, PageGetLSN(origpage));
-   PageSetTLI(leftpage, PageGetTLI(origpage));
 
    /* init btree private data */
    oopaque = (BTPageOpaque) PageGetSpecialPointer(origpage);
        recptr = XLogInsert(RM_BTREE_ID, xlinfo, rdata);
 
        PageSetLSN(origpage, recptr);
-       PageSetTLI(origpage, ThisTimeLineID);
        PageSetLSN(rightpage, recptr);
-       PageSetTLI(rightpage, ThisTimeLineID);
        if (!P_RIGHTMOST(ropaque))
        {
            PageSetLSN(spage, recptr);
-           PageSetTLI(spage, ThisTimeLineID);
        }
    }
 
        recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_NEWROOT, rdata);
 
        PageSetLSN(rootpage, recptr);
-       PageSetTLI(rootpage, ThisTimeLineID);
        PageSetLSN(metapg, recptr);
-       PageSetTLI(metapg, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
 
            recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_NEWROOT, &rdata);
 
            PageSetLSN(rootpage, recptr);
-           PageSetTLI(rootpage, ThisTimeLineID);
            PageSetLSN(metapg, recptr);
-           PageSetTLI(metapg, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
    START_CRIT_SECTION();
 
    /*
-    * We don't do MarkBufferDirty here because we're about initialise the
-    * page, and nobody else can see it yet.
+    * We don't do MarkBufferDirty here because we're about to initialise
+    * the page, and nobody else can see it yet.
     */
 
    /* XLOG stuff */
        XLogInsert(RM_BTREE_ID, XLOG_BTREE_REUSE_PAGE, rdata);
 
        /*
-        * We don't do PageSetLSN or PageSetTLI here because we're about
-        * initialise the page, so no need.
+        * We don't do PageSetLSN here because we're about to initialise
+        * the page, so no need.
         */
    }
 
        recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_VACUUM, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        recptr = XLogInsert(RM_BTREE_ID, XLOG_BTREE_DELETE, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        if (BufferIsValid(metabuf))
        {
            PageSetLSN(metapg, recptr);
-           PageSetTLI(metapg, ThisTimeLineID);
        }
        page = BufferGetPage(pbuf);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
        page = BufferGetPage(rbuf);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
        page = BufferGetPage(buf);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
        if (BufferIsValid(lbuf))
        {
            page = BufferGetPage(lbuf);
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
    }
 
 
        /* We use the heap NEWPAGE record type for this */
        log_newpage(&wstate->index->rd_node, MAIN_FORKNUM, blkno, page);
    }
-   else
-   {
-       /* Leave the page LSN zero if not WAL-logged, but set TLI anyway */
-       PageSetTLI(page, ThisTimeLineID);
-   }
 
    /*
     * If we have to write pages nonsequentially, fill in the space with
 
        ((char *) md + sizeof(BTMetaPageData)) - (char *) metapg;
 
    PageSetLSN(metapg, lsn);
-   PageSetTLI(metapg, ThisTimeLineID);
    MarkBufferDirty(metabuf);
    UnlockReleaseBuffer(metabuf);
 }
                    elog(PANIC, "btree_insert_redo: failed to add item");
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
                UnlockReleaseBuffer(buffer);
            }
    }
 
    PageSetLSN(rpage, lsn);
-   PageSetTLI(rpage, ThisTimeLineID);
    MarkBufferDirty(rbuf);
 
    /* don't release the buffer yet; we touch right page's first item below */
                lopaque->btpo_cycleid = 0;
 
                PageSetLSN(lpage, lsn);
-               PageSetTLI(lpage, ThisTimeLineID);
                MarkBufferDirty(lbuf);
            }
 
                pageop->btpo_prev = xlrec->rightsib;
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
    opaque->btpo_flags &= ~BTP_HAS_GARBAGE;
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
    opaque->btpo_flags &= ~BTP_HAS_GARBAGE;
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
                }
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
                UnlockReleaseBuffer(buffer);
            }
                pageop->btpo_prev = leftsib;
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
                UnlockReleaseBuffer(buffer);
            }
                    pageop->btpo_next = rightsib;
 
                    PageSetLSN(page, lsn);
-                   PageSetTLI(page, ThisTimeLineID);
                    MarkBufferDirty(buffer);
                    UnlockReleaseBuffer(buffer);
                }
    pageop->btpo_cycleid = 0;
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
    }
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
 
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_ADD_LEAF, rdata);
 
        PageSetLSN(current->page, recptr);
-       PageSetTLI(current->page, ThisTimeLineID);
 
        /* update parent only if we actually changed it */
        if (xlrec.blknoParent != InvalidBlockNumber)
        {
            PageSetLSN(parent->page, recptr);
-           PageSetTLI(parent->page, ThisTimeLineID);
        }
    }
 
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_MOVE_LEAFS, rdata);
 
        PageSetLSN(current->page, recptr);
-       PageSetTLI(current->page, ThisTimeLineID);
        PageSetLSN(npage, recptr);
-       PageSetTLI(npage, ThisTimeLineID);
        PageSetLSN(parent->page, recptr);
-       PageSetTLI(parent->page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
            Page        page = BufferGetPage(newLeafBuffer);
 
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
 
        if (saveCurrent.buffer != InvalidBuffer)
            Page        page = BufferGetPage(saveCurrent.buffer);
 
            PageSetLSN(page, recptr);
-           PageSetTLI(page, ThisTimeLineID);
        }
 
        PageSetLSN(current->page, recptr);
-       PageSetTLI(current->page, ThisTimeLineID);
 
        if (parent->buffer != InvalidBuffer)
        {
            PageSetLSN(parent->page, recptr);
-           PageSetTLI(parent->page, ThisTimeLineID);
        }
    }
 
            recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_ADD_NODE, rdata);
 
            PageSetLSN(current->page, recptr);
-           PageSetTLI(current->page, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
 
            /* we don't bother to check if any of these are redundant */
            PageSetLSN(current->page, recptr);
-           PageSetTLI(current->page, ThisTimeLineID);
            PageSetLSN(parent->page, recptr);
-           PageSetTLI(parent->page, ThisTimeLineID);
            PageSetLSN(saveCurrent.page, recptr);
-           PageSetTLI(saveCurrent.page, ThisTimeLineID);
        }
 
        END_CRIT_SECTION();
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_SPLIT_TUPLE, rdata);
 
        PageSetLSN(current->page, recptr);
-       PageSetTLI(current->page, ThisTimeLineID);
 
        if (newBuffer != InvalidBuffer)
        {
            PageSetLSN(BufferGetPage(newBuffer), recptr);
-           PageSetTLI(BufferGetPage(newBuffer), ThisTimeLineID);
        }
    }
 
 
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_CREATE_INDEX, &rdata);
 
        PageSetLSN(BufferGetPage(metabuffer), recptr);
-       PageSetTLI(BufferGetPage(metabuffer), ThisTimeLineID);
        PageSetLSN(BufferGetPage(rootbuffer), recptr);
-       PageSetTLI(BufferGetPage(rootbuffer), ThisTimeLineID);
        PageSetLSN(BufferGetPage(nullbuffer), recptr);
-       PageSetTLI(BufferGetPage(nullbuffer), ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
 
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_VACUUM_LEAF, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_VACUUM_ROOT, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_VACUUM_REDIRECT, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
 
    page = (Page) BufferGetPage(buffer);
    SpGistInitMetapage(page);
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
    SpGistInitBuffer(buffer, SPGIST_LEAF);
    page = (Page) BufferGetPage(buffer);
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
    SpGistInitBuffer(buffer, SPGIST_LEAF | SPGIST_NULLS);
    page = (Page) BufferGetPage(buffer);
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 }
                }
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                                  xldata->blknoLeaf, xldata->offnumLeaf);
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                }
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                                        toInsert[nInsert - 1]);
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                                  xldata->blknoDst, toInsert[nInsert - 1]);
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                             innerTuple->size);
 
                    PageSetLSN(page, lsn);
-                   PageSetTLI(page, ThisTimeLineID);
                    MarkBufferDirty(buffer);
                }
                UnlockReleaseBuffer(buffer);
                    if (xldata->blknoParent != xldata->blknoNew)
                    {
                        PageSetLSN(page, lsn);
-                       PageSetTLI(page, ThisTimeLineID);
                    }
                    MarkBufferDirty(buffer);
                }
                    if (xldata->blknoParent != xldata->blkno)
                    {
                        PageSetLSN(page, lsn);
-                       PageSetTLI(page, ThisTimeLineID);
                    }
                    MarkBufferDirty(buffer);
                }
                                      xldata->blknoNew, xldata->offnumNew);
 
                    PageSetLSN(page, lsn);
-                   PageSetTLI(page, ThisTimeLineID);
                    MarkBufferDirty(buffer);
                }
                UnlockReleaseBuffer(buffer);
                                  postfixTuple->size, xldata->offnumPostfix);
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                                      xldata->offnumPostfix);
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
    if (srcPage != NULL)
    {
        PageSetLSN(srcPage, lsn);
-       PageSetTLI(srcPage, ThisTimeLineID);
        MarkBufferDirty(srcBuffer);
    }
    if (destPage != NULL)
    {
        PageSetLSN(destPage, lsn);
-       PageSetTLI(destPage, ThisTimeLineID);
        MarkBufferDirty(destBuffer);
    }
 
                }
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                                    xldata->blknoInner, xldata->offnumInner);
 
                    PageSetLSN(page, lsn);
-                   PageSetTLI(page, ThisTimeLineID);
                    MarkBufferDirty(buffer);
                }
                UnlockReleaseBuffer(buffer);
                }
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                PageIndexMultiDelete(page, toDelete, xldata->nDelete);
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
            UnlockReleaseBuffer(buffer);
                }
 
                PageSetLSN(page, lsn);
-               PageSetTLI(page, ThisTimeLineID);
                MarkBufferDirty(buffer);
            }
 
 
 happen before the WAL record is inserted; see notes in SyncOneBuffer().)
 
 5. If the relation requires WAL-logging, build a WAL log record and pass it
-to XLogInsert(); then update the page's LSN and TLI using the returned XLOG
+to XLogInsert(); then update the page's LSN using the returned XLOG
 location.  For instance,
 
        recptr = XLogInsert(rmgr_id, info, rdata);
 
        PageSetLSN(dp, recptr);
-       PageSetTLI(dp, ThisTimeLineID);
+       // Note that we no longer do PageSetTLI() from 9.3 onwards
+       // since that field on a page has now changed its meaning.
 
 6. END_CRIT_SECTION()
 
    ... initialize the page ...
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
    ... apply the change ...
 
    PageSetLSN(page, lsn);
-   PageSetTLI(page, ThisTimeLineID);
    MarkBufferDirty(buffer);
    UnlockReleaseBuffer(buffer);
 
 
            }
 
            PageSetLSN(page, lsn);
-           PageSetTLI(page, ThisTimeLineID);
            MarkBufferDirty(buffer);
 
            if (!keep_buffer)
 
        recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    /* Now update sequence tuple to the intended final state */
        recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG, rdata);
 
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
        elog(PANIC, "seq_redo: failed to add item to page");
 
    PageSetLSN(localpage, lsn);
-   PageSetTLI(localpage, ThisTimeLineID);
 
    memcpy(page, localpage, BufferGetPageSize(buffer));
    MarkBufferDirty(buffer);
 
                recptr = log_heap_freeze(onerel, buf, FreezeLimit,
                                         MultiXactFrzLimit, frozen, nfrozen);
                PageSetLSN(page, recptr);
-               PageSetTLI(page, ThisTimeLineID);
            }
        }
 
                                unused, uncnt,
                                vacrelstats->latestRemovedXid);
        PageSetLSN(page, recptr);
-       PageSetTLI(page, ThisTimeLineID);
    }
 
    END_CRIT_SECTION();
 
  * space management information generic to any page
  *
  *     pd_lsn      - identifies xlog record for last change to this page.
- *     pd_tli      - ditto.
+ *     pd_checksum - page checksum, if set.
  *     pd_flags    - flag bits.
  *     pd_lower    - offset to start of free space.
  *     pd_upper    - offset to end of free space.
  * The LSN is used by the buffer manager to enforce the basic rule of WAL:
  * "thou shalt write xlog before data".  A dirty buffer cannot be dumped
  * to disk until xlog has been flushed at least as far as the page's LSN.
- * We also store the 16 least significant bits of the TLI for identification
- * purposes (it is not clear that this is actually necessary, but it seems
- * like a good idea).
+ *
+ * pd_checksum stores the page checksum, if it has been set for this page;
+ * zero is a valid value for a checksum. If a checksum is not in use then
+ * we leave the field unset. This will typically mean the field is zero
+ * though non-zero values may also be present if databases have been
+ * pg_upgraded from releases prior to 9.3, when the same byte offset was
+ * used to store the current timelineid when the page was last updated.
+ * Note that there is no indication on a page as to whether the checksum
+ * is valid or not, a deliberate design choice which avoids the problem
+ * of relying on the page contents to decide whether to verify it. Hence
+ * there are no flag bits relating to checksums.
  *
  * pd_prune_xid is a hint field that helps determine whether pruning will be
  * useful. It is currently unused in index pages.
 typedef struct PageHeaderData
 {
    /* XXX LSN is member of *any* block, not only page-organized ones */
-   PageXLogRecPtr  pd_lsn;         /* LSN: next byte after last byte of xlog
+   PageXLogRecPtr  pd_lsn;     /* LSN: next byte after last byte of xlog
                                 * record for last change to this page */
-   uint16      pd_tli;         /* least significant bits of the TimeLineID
-                                * containing the LSN */
+   uint16      pd_checksum;    /* checksum */
    uint16      pd_flags;       /* flag bits, see below */
    LocationIndex pd_lower;     /* offset to start of free space */
    LocationIndex pd_upper;     /* offset to end of free space */
 #define PageSetLSN(page, lsn) \
    PageXLogRecPtrSet(((PageHeader) (page))->pd_lsn, lsn)
 
-/* NOTE: only the 16 least significant bits are stored */
-#define PageGetTLI(page) \
-   (((PageHeader) (page))->pd_tli)
-#define PageSetTLI(page, tli) \
-   (((PageHeader) (page))->pd_tli = (uint16) (tli))
-
 #define PageHasFreeLinePointers(page) \
    (((PageHeader) (page))->pd_flags & PD_HAS_FREE_LINES)
 #define PageSetHasFreeLinePointers(page) \