8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.144 2000/03/17 02:36:06 tgl Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.145 2000/04/06 00:29:51 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -1510,6 +1510,8 @@ vc_repair_frag(VRelStats *vacrelstats, Relation onerel,
1510
1510
ItemPointerSetInvalid (& Ctid );
1511
1511
for (ti = 0 ; ti < num_vtmove ; ti ++ )
1512
1512
{
1513
+ VPageDescr destvpd = vtmove [ti ].vpd ;
1514
+
1513
1515
/* Get tuple from chain */
1514
1516
tuple .t_self = vtmove [ti ].tid ;
1515
1517
Cbuf = ReadBuffer (onerel ,
@@ -1521,7 +1523,7 @@ vc_repair_frag(VRelStats *vacrelstats, Relation onerel,
1521
1523
tuple .t_data = (HeapTupleHeader ) PageGetItem (Cpage , Citemid );
1522
1524
tuple_len = tuple .t_len = ItemIdGetLength (Citemid );
1523
1525
/* Get page to move in */
1524
- cur_buffer = ReadBuffer (onerel , vtmove [ ti ]. vpd -> vpd_blkno );
1526
+ cur_buffer = ReadBuffer (onerel , destvpd -> vpd_blkno );
1525
1527
1526
1528
/*
1527
1529
* We should LockBuffer(cur_buffer) but don't, at the
@@ -1530,9 +1532,24 @@ vc_repair_frag(VRelStats *vacrelstats, Relation onerel,
1530
1532
* to get t_infomask of inserted heap tuple !!!
1531
1533
*/
1532
1534
ToPage = BufferGetPage (cur_buffer );
1533
- /* if this page was not used before - clean it */
1535
+ /*
1536
+ * If this page was not used before - clean it.
1537
+ *
1538
+ * This path is different from the other callers of
1539
+ * vc_vacpage, because we have already incremented the
1540
+ * vpd's vpd_offsets_used field to account for the
1541
+ * tuple(s) we expect to move onto the page. Therefore
1542
+ * vc_vacpage's check for vpd_offsets_used == 0 is wrong.
1543
+ * But since that's a good debugging check for all other
1544
+ * callers, we work around it here rather than remove it.
1545
+ */
1534
1546
if (!PageIsEmpty (ToPage ) && vtmove [ti ].cleanVpd )
1535
- vc_vacpage (ToPage , vtmove [ti ].vpd );
1547
+ {
1548
+ int sv_offsets_used = destvpd -> vpd_offsets_used ;
1549
+ destvpd -> vpd_offsets_used = 0 ;
1550
+ vc_vacpage (ToPage , destvpd );
1551
+ destvpd -> vpd_offsets_used = sv_offsets_used ;
1552
+ }
1536
1553
heap_copytuple_with_tuple (& tuple , & newtup );
1537
1554
RelationInvalidateHeapTuple (onerel , & tuple );
1538
1555
TransactionIdStore (myXID , (TransactionId * ) & (newtup .t_data -> t_cmin ));
@@ -1543,17 +1560,16 @@ vc_repair_frag(VRelStats *vacrelstats, Relation onerel,
1543
1560
InvalidOffsetNumber , LP_USED );
1544
1561
if (newoff == InvalidOffsetNumber )
1545
1562
{
1546
- elog (ERROR , "\
1547
- moving chain: failed to add item with len = %u to page %u" ,
1548
- tuple_len , vtmove [ti ].vpd -> vpd_blkno );
1563
+ elog (ERROR , "moving chain: failed to add item with len = %u to page %u" ,
1564
+ tuple_len , destvpd -> vpd_blkno );
1549
1565
}
1550
1566
newitemid = PageGetItemId (ToPage , newoff );
1551
1567
pfree (newtup .t_data );
1552
1568
newtup .t_datamcxt = NULL ;
1553
1569
newtup .t_data = (HeapTupleHeader ) PageGetItem (ToPage , newitemid );
1554
- ItemPointerSet (& (newtup .t_self ), vtmove [ ti ]. vpd -> vpd_blkno , newoff );
1555
- if (((int ) vtmove [ ti ]. vpd -> vpd_blkno ) > last_move_dest_block )
1556
- last_move_dest_block = vtmove [ ti ]. vpd -> vpd_blkno ;
1570
+ ItemPointerSet (& (newtup .t_self ), destvpd -> vpd_blkno , newoff );
1571
+ if (((int ) destvpd -> vpd_blkno ) > last_move_dest_block )
1572
+ last_move_dest_block = destvpd -> vpd_blkno ;
1557
1573
1558
1574
/*
1559
1575
* Set t_ctid pointing to itself for last tuple in
0 commit comments