diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-01-17 16:35:46 +0200 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2013-01-17 16:46:16 +0200 |
commit | 9ee4d06f3fdde37b063b8a0f0fa0a2113ac12303 (patch) | |
tree | 692e6a1de1a5a48872958ab8554a57889be2c6ba /src/backend/access/gist/gist.c | |
parent | bba486f372ffa28d6a0b70a6b0ad7065429213d0 (diff) | |
download | postgresql-9ee4d06f3fdde37b063b8a0f0fa0a2113ac12303.tar.gz postgresql-9ee4d06f3fdde37b063b8a0f0fa0a2113ac12303.zip |
Make GiST indexes on-disk compatible with 9.2 again.
The patch that turned XLogRecPtr into a uint64 inadvertently changed the
on-disk format of GiST indexes, because the NSN field in the GiST page
opaque is an XLogRecPtr. That breaks pg_upgrade. Revert the format of that
field back to the two-field struct that XLogRecPtr was before. This is the
same we did to LSNs in the page header to avoid changing on-disk format.
Bump catversion, as this invalidates any existing GiST indexes built on
9.3devel.
Diffstat (limited to 'src/backend/access/gist/gist.c')
-rw-r--r-- | src/backend/access/gist/gist.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 95d33c8945b..4686242802d 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -240,7 +240,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, { /* save old rightlink and NSN */ oldrlink = GistPageGetOpaque(page)->rightlink; - oldnsn = GistPageGetOpaque(page)->nsn; + oldnsn = GistPageGetNSN(page); dist->buffer = buffer; dist->block.blkno = BufferGetBlockNumber(buffer); @@ -364,7 +364,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, * F_FOLLOW_RIGHT flags ensure that scans will follow the * rightlinks until the downlinks are inserted. */ - GistPageGetOpaque(ptr->page)->nsn = oldnsn; + GistPageSetNSN(ptr->page, oldnsn); } START_CRIT_SECTION(); @@ -473,7 +473,7 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, { Page leftpg = BufferGetPage(leftchildbuf); - GistPageGetOpaque(leftpg)->nsn = recptr; + GistPageSetNSN(leftpg, recptr); GistClearFollowRight(leftpg); PageSetLSN(leftpg, recptr); @@ -561,7 +561,7 @@ gistdoinsert(Relation r, IndexTuple itup, Size freespace, GISTSTATE *giststate) } if (stack->blkno != GIST_ROOT_BLKNO && - stack->parent->lsn < GistPageGetOpaque(stack->page)->nsn) + stack->parent->lsn < GistPageGetNSN(stack->page)) { /* * Concurrent split detected. There's no guarantee that the @@ -707,8 +707,7 @@ gistdoinsert(Relation r, IndexTuple itup, Size freespace, GISTSTATE *giststate) */ } else if (GistFollowRight(stack->page) || - stack->parent->lsn < - GistPageGetOpaque(stack->page)->nsn) + stack->parent->lsn < GistPageGetNSN(stack->page)) { /* * The page was split while we momentarily unlocked the @@ -793,7 +792,7 @@ gistFindPath(Relation r, BlockNumber child, OffsetNumber *downlinkoffnum) if (GistFollowRight(page)) elog(ERROR, "concurrent GiST page split was incomplete"); - if (top->parent && top->parent->lsn < GistPageGetOpaque(page)->nsn && + if (top->parent && top->parent->lsn < GistPageGetNSN(page) && GistPageGetOpaque(page)->rightlink != InvalidBlockNumber /* sanity check */ ) { /* |