summaryrefslogtreecommitdiff
path: root/src/backend/storage/page
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>2000-10-21 15:43:36 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>2000-10-21 15:43:36 +0000
commita7fcadd10ab67a9cc938eb2818aae33d5be0238a (patch)
tree2739d0f36c72ff592740864b48023cffa692afac /src/backend/storage/page
parent7c177a49082f6c22dc6c12cbaf58cf984fbb6cfd (diff)
downloadpostgresql-a7fcadd10ab67a9cc938eb2818aae33d5be0238a.tar.gz
WAL
Diffstat (limited to 'src/backend/storage/page')
-rw-r--r--src/backend/storage/page/bufpage.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index dd1b44d334..6f043bf944 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.32 2000/10/20 11:28:39 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.33 2000/10/21 15:43:29 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -245,7 +245,11 @@ itemidcompare(const void *itemidp1, const void *itemidp2)
/*
* PageRepairFragmentation
- * Frees fragmented space on a page.
+ *
+ * Frees fragmented space on a page.
+ * It doesn't remove unused line pointers! Please don't change this.
+ * This routine is usable for heap pages only.
+ *
*/
void
PageRepairFragmentation(Page page)
@@ -264,6 +268,8 @@ PageRepairFragmentation(Page page)
for (i = 0; i < nline; i++)
{
lp = ((PageHeader) page)->pd_linp + i;
+ if ((*lp).lp_flags & LP_DELETE) /* marked for deletion */
+ (*lp).lp_flags &= ~(LP_USED | LP_DELETE);
if ((*lp).lp_flags & LP_USED)
nused++;
}
@@ -344,6 +350,31 @@ PageGetFreeSpace(Page page)
}
/*
+ * PageRepairFragmentation un-useful for index page cleanup because
+ * of it doesn't remove line pointers. This routine could be more
+ * effective but ... no time -:)
+ */
+void
+IndexPageCleanup(Buffer buffer)
+{
+ Page page = (Page) BufferGetPage(buffer);
+ ItemId lp;
+ OffsetNumber maxoff;
+ OffsetNumber i;
+
+ maxoff = PageGetMaxOffsetNumber(page);
+ for (i = 0; i < maxoff; i++)
+ {
+ lp = ((PageHeader) page)->pd_linp + i;
+ if ((*lp).lp_flags & LP_DELETE) /* marked for deletion */
+ {
+ PageIndexTupleDelete(page, i + 1);
+ maxoff--;
+ }
+ }
+}
+
+/*
*----------------------------------------------------------------
* PageIndexTupleDelete
*----------------------------------------------------------------