summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-11-03 20:47:49 +0000
committerTom Lane2008-11-03 20:47:49 +0000
commit9c56ac0ccf745f0bb9cccb8e11b66a15a551e8a7 (patch)
treefa208ab8c7e1a92fda7bbd63e0a829223ae91f45
parente87430350c616ddfd81f83767d88c26a94fa1ff6 (diff)
Clean up the messy semantics (not to mention inefficiency) of PageGetTempPage
by splitting it into three functions with better-defined behaviors. Zdenek Kotala
-rw-r--r--src/backend/access/gin/gindatapage.c2
-rw-r--r--src/backend/access/gin/ginentrypage.c2
-rw-r--r--src/backend/access/gin/ginutil.c15
-rw-r--r--src/backend/access/gin/ginvacuum.c2
-rw-r--r--src/backend/access/gist/gist.c2
-rw-r--r--src/backend/access/gist/gistvacuum.c14
-rw-r--r--src/backend/access/nbtree/nbtinsert.c2
-rw-r--r--src/backend/storage/page/bufpage.c51
-rw-r--r--src/include/access/gin.h1
-rw-r--r--src/include/storage/bufpage.h4
10 files changed, 50 insertions, 45 deletions
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c
index 7b63ecb434..bf0651d311 100644
--- a/src/backend/access/gin/gindatapage.c
+++ b/src/backend/access/gin/gindatapage.c
@@ -445,7 +445,7 @@ dataSplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogRe
char *ptr;
OffsetNumber separator;
ItemPointer bound;
- Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
+ Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
int sizeofitem = GinSizeOfItem(lpage);
OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c
index 548f02e154..b293700f2e 100644
--- a/src/backend/access/gin/ginentrypage.c
+++ b/src/backend/access/gin/ginentrypage.c
@@ -458,7 +458,7 @@ entrySplitPage(GinBtree btree, Buffer lbuf, Buffer rbuf, OffsetNumber off, XLogR
leftrightmost = NULL;
static ginxlogSplit data;
Page page;
- Page lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
+ Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
Page rpage = BufferGetPage(rbuf);
Size pageSize = PageGetPageSize(lpage);
diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c
index d77382005d..5e71c8594d 100644
--- a/src/backend/access/gin/ginutil.c
+++ b/src/backend/access/gin/ginutil.c
@@ -310,21 +310,6 @@ extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *ne
return entries;
}
-/*
- * It's analog of PageGetTempPage(), but copies whole page
- */
-Page
-GinPageGetCopyPage(Page page)
-{
- Size pageSize = PageGetPageSize(page);
- Page tmppage;
-
- tmppage = (Page) palloc(pageSize);
- memcpy(tmppage, page, pageSize);
-
- return tmppage;
-}
-
Datum
ginoptions(PG_FUNCTION_ARGS)
{
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c
index 4aecf9f756..7db7d7c2a8 100644
--- a/src/backend/access/gin/ginvacuum.c
+++ b/src/backend/access/gin/ginvacuum.c
@@ -546,7 +546,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
* On first difference we create temporary page in memory
* and copies content in to it.
*/
- tmppage = GinPageGetCopyPage(origpage);
+ tmppage = PageGetTempPageCopy(origpage);
if (newN > 0)
{
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index f4f63b4cf4..9a53941715 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -343,7 +343,7 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate)
* we must create temporary page to operate
*/
dist->buffer = state->stack->buffer;
- dist->page = PageGetTempPage(BufferGetPage(dist->buffer), sizeof(GISTPageOpaqueData));
+ dist->page = PageGetTempPageCopySpecial(BufferGetPage(dist->buffer));
/* clean all flags except F_LEAF */
GistPageGetOpaque(dist->page)->flags = (is_leaf) ? F_LEAF : 0;
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c
index 4eb7663df0..82be008e6b 100644
--- a/src/backend/access/gist/gistvacuum.c
+++ b/src/backend/access/gist/gistvacuum.c
@@ -144,18 +144,6 @@ gistDeleteSubtree(GistVacuum *gv, BlockNumber blkno)
UnlockReleaseBuffer(buffer);
}
-static Page
-GistPageGetCopyPage(Page page)
-{
- Size pageSize = PageGetPageSize(page);
- Page tmppage;
-
- tmppage = (Page) palloc(pageSize);
- memcpy(tmppage, page, pageSize);
-
- return tmppage;
-}
-
static ArrayTuple
vacuumSplitPage(GistVacuum *gv, Page tempPage, Buffer buffer, IndexTuple *addon, int curlenaddon)
{
@@ -325,7 +313,7 @@ gistVacuumUpdate(GistVacuum *gv, BlockNumber blkno, bool needunion)
addon = (IndexTuple *) palloc(sizeof(IndexTuple) * lenaddon);
/* get copy of page to work */
- tempPage = GistPageGetCopyPage(page);
+ tempPage = PageGetTempPageCopy(page);
for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i))
{
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index 5293179ed4..b167f12054 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -793,7 +793,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
rbuf = _bt_getbuf(rel, P_NEW, BT_WRITE);
origpage = BufferGetPage(buf);
- leftpage = PageGetTempPage(origpage, sizeof(BTPageOpaqueData));
+ leftpage = PageGetTempPage(origpage);
rightpage = BufferGetPage(rbuf);
_bt_pageinit(leftpage, BufferGetPageSize(buf));
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index fb4e953dd1..377ecbac3f 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -254,28 +254,59 @@ PageAddItem(Page page,
/*
* PageGetTempPage
- * Get a temporary page in local memory for special processing
+ * Get a temporary page in local memory for special processing.
+ * The returned page is not initialized at all; caller must do that.
*/
Page
-PageGetTempPage(Page page, Size specialSize)
+PageGetTempPage(Page page)
+{
+ Size pageSize;
+ Page temp;
+
+ pageSize = PageGetPageSize(page);
+ temp = (Page) palloc(pageSize);
+
+ return temp;
+}
+
+/*
+ * PageGetTempPageCopy
+ * Get a temporary page in local memory for special processing.
+ * The page is initialized by copying the contents of the given page.
+ */
+Page
+PageGetTempPageCopy(Page page)
{
Size pageSize;
Page temp;
- PageHeader thdr;
pageSize = PageGetPageSize(page);
temp = (Page) palloc(pageSize);
- thdr = (PageHeader) temp;
- /* copy old page in */
memcpy(temp, page, pageSize);
- /* set high, low water marks */
- thdr->pd_lower = SizeOfPageHeaderData;
- thdr->pd_upper = pageSize - MAXALIGN(specialSize);
+ return temp;
+}
+
+/*
+ * PageGetTempPageCopySpecial
+ * Get a temporary page in local memory for special processing.
+ * The page is PageInit'd with the same special-space size as the
+ * given page, and the special space is copied from the given page.
+ */
+Page
+PageGetTempPageCopySpecial(Page page)
+{
+ Size pageSize;
+ Page temp;
+
+ pageSize = PageGetPageSize(page);
+ temp = (Page) palloc(pageSize);
- /* clear out the middle */
- MemSet((char *) temp + thdr->pd_lower, 0, thdr->pd_upper - thdr->pd_lower);
+ PageInit(temp, pageSize, PageGetSpecialSize(page));
+ memcpy(PageGetSpecialPointer(temp),
+ PageGetSpecialPointer(page),
+ PageGetSpecialSize(page));
return temp;
}
diff --git a/src/include/access/gin.h b/src/include/access/gin.h
index b081d2e672..0fd2cbd1bf 100644
--- a/src/include/access/gin.h
+++ b/src/include/access/gin.h
@@ -246,7 +246,6 @@ extern int compareAttEntries(GinState *ginstate, OffsetNumber attnum_a, Datum a,
extern Datum *extractEntriesS(GinState *ginstate, OffsetNumber attnum, Datum value,
int32 *nentries, bool *needUnique);
extern Datum *extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *nentries);
-extern Page GinPageGetCopyPage(Page page);
extern Datum gin_index_getattr(GinState *ginstate, IndexTuple tuple);
extern OffsetNumber gintuple_get_attrnum(GinState *ginstate, IndexTuple tuple);
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index e60ffca76c..8ae51af34f 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -362,7 +362,9 @@ extern void PageInit(Page page, Size pageSize, Size specialSize);
extern bool PageHeaderIsValid(PageHeader page);
extern OffsetNumber PageAddItem(Page page, Item item, Size size,
OffsetNumber offsetNumber, bool overwrite, bool is_heap);
-extern Page PageGetTempPage(Page page, Size specialSize);
+extern Page PageGetTempPage(Page page);
+extern Page PageGetTempPageCopy(Page page);
+extern Page PageGetTempPageCopySpecial(Page page);
extern void PageRestoreTempPage(Page tempPage, Page oldPage);
extern void PageRepairFragmentation(Page page);
extern Size PageGetFreeSpace(Page page);