提交 22122c83 编写于 作者: H Heikki Linnakangas

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
853d1c31) 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 4016bdef), 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.
上级 4a8adfd4
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册