aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gist/gist.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-01-17 16:35:46 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-01-17 16:46:16 +0200
commit9ee4d06f3fdde37b063b8a0f0fa0a2113ac12303 (patch)
tree692e6a1de1a5a48872958ab8554a57889be2c6ba /src/backend/access/gist/gist.c
parentbba486f372ffa28d6a0b70a6b0ad7065429213d0 (diff)
downloadpostgresql-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.c13
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 */ )
{
/*