@@ -688,6 +688,17 @@ compactify_tuples(itemIdCompact itemidbase, int nitems, Page page, bool presorte
688688 phdr -> pd_upper = upper ;
689689}
690690
691+ /*
692+ * Clean up space between pd_lower and pd_upper for better page compression.
693+ */
694+ static void
695+ memset_hole (Page page , LocationIndex old_pd_upper )
696+ {
697+ PageHeader phdr = (PageHeader ) page ;
698+ if (phdr -> pd_upper > old_pd_upper )
699+ MemSet ((char * )page + old_pd_upper , 0 , phdr -> pd_upper - old_pd_upper );
700+ }
701+
691702/*
692703 * PageRepairFragmentation
693704 *
@@ -800,6 +811,7 @@ PageRepairFragmentation(Page page)
800811
801812 compactify_tuples (itemidbase , nstorage , page , presorted );
802813 }
814+ memset_hole (page , pd_upper );
803815
804816 if (finalusedlp != nline )
805817 {
@@ -1130,6 +1142,7 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
11301142
11311143 if (offset > phdr -> pd_upper )
11321144 memmove (addr + size , addr , offset - phdr -> pd_upper );
1145+ MemSet (addr , 0 , size );
11331146
11341147 /* adjust free space boundary pointers */
11351148 phdr -> pd_upper += size ;
@@ -1287,6 +1300,7 @@ PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
12871300 compactify_tuples (itemidbase , nused , page , presorted );
12881301 else
12891302 phdr -> pd_upper = pd_special ;
1303+ memset_hole (page , pd_upper );
12901304}
12911305
12921306
@@ -1367,6 +1381,7 @@ PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum)
13671381
13681382 if (offset > phdr -> pd_upper )
13691383 memmove (addr + size , addr , offset - phdr -> pd_upper );
1384+ MemSet (addr , 0 , size );
13701385
13711386 /* adjust free space boundary pointer */
13721387 phdr -> pd_upper += size ;
0 commit comments