aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-12-03 22:13:16 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-12-03 23:16:01 +0200
commit22122c83f1331d03e8317afbfcfbb65bef9c82d2 (patch)
tree1b96db614825d402f9502bf5eb71db1741fac98b /src
parent4a8adfd4d09c7885daf548ecd53d4999f168a174 (diff)
downloadpostgresql-22122c83f1331d03e8317afbfcfbb65bef9c82d2.tar.gz
postgresql-22122c83f1331d03e8317afbfcfbb65bef9c82d2.zip
Fix full-page writes of internal GIN pages.
Insertion to a non-leaf GIN page didn't make a full-page image of the page, which is wrong. The code used to do it correctly, but was changed (commit 853d1c3103fa961ae6219f0281885b345593d101) because the redo-routine didn't track incomplete splits correctly when the page was restored from a full page image. Of course, that was not right way to fix it, the redo routine should've been fixed instead. The redo-routine was surreptitiously fixed in 2010 (commit 4016bdef8aded77b4903c457050622a5a1815c16), so all we need to do now is revert the code that creates the record to its original form. This doesn't change the format of the WAL record. Backpatch to all supported versions.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/gin/gindatapage.c9
-rw-r--r--src/backend/access/gin/ginentrypage.c6
2 files changed, 10 insertions, 5 deletions
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c
index 5221f5e92f0..36d13171212 100644
--- a/src/backend/access/gin/gindatapage.c
+++ b/src/backend/access/gin/gindatapage.c
@@ -382,12 +382,14 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off,
data.nitem = 1;
}
- rdata[0].buffer = InvalidBuffer;
+ rdata[0].buffer = buf;
+ rdata[0].buffer_std = false;
rdata[0].data = (char *) &data;
rdata[0].len = offsetof(ginxlogInsertDataLeaf, items);
rdata[0].next = &rdata[1];
- rdata[1].buffer = InvalidBuffer;
+ rdata[1].buffer = buf;
+ rdata[1].buffer_std = false;
rdata[1].data = (char *) &items->items[savedPos];
rdata[1].len = sizeof(ItemPointerData) * data.nitem;
rdata[1].next = NULL;
@@ -398,7 +400,8 @@ dataPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off,
GinDataPageAddPostingItem(page, pitem, off);
- rdata[0].buffer = InvalidBuffer;
+ rdata[0].buffer = buf;
+ rdata[0].buffer_std = false;
rdata[0].data = (char *) pitem;
rdata[0].len = sizeof(PostingItem);
rdata[0].next = NULL;
diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c
index 89cde4aec01..e754d05ec97 100644
--- a/src/backend/access/gin/ginentrypage.c
+++ b/src/backend/access/gin/ginentrypage.c
@@ -523,13 +523,15 @@ entryPlaceToPage(GinBtree btree, Buffer buf, OffsetNumber off,
data.isDelete = insertData->isDelete;
- rdata[cnt].buffer = InvalidBuffer;
+ rdata[cnt].buffer = buf;
+ rdata[cnt].buffer_std = false;
rdata[cnt].data = (char *) &data;
rdata[cnt].len = offsetof(ginxlogInsertEntry, tuple);
rdata[cnt].next = &rdata[cnt + 1];
cnt++;
- rdata[cnt].buffer = InvalidBuffer;
+ rdata[cnt].buffer = buf;
+ rdata[cnt].buffer_std = false;
rdata[cnt].data = (char *) insertData->entry;
rdata[cnt].len = IndexTupleSize(insertData->entry);
rdata[cnt].next = NULL;