We have the TODO item:
* Make sure all block numbers are unsigned to increase maximum table size
I did some research on this and generated the following patch. I didn't
find much in the way of problems except two vacuum.c fields that should
probably be BlockNumber. freespace.c also has a numPages field in
FSMRelation that is int. Should that be BlockNumber?
I am holding the patch until I get some feedback.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Index: src/backend/commands/vacuum.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/vacuum.c,v
retrieving revision 1.230
diff -c -r1.230 vacuum.c
*** src/backend/commands/vacuum.c 20 Jun 2002 20:29:27 -0000 1.230
--- src/backend/commands/vacuum.c 8 Jul 2002 03:44:12 -0000
***************
*** 60,68 ****
typedef struct VacPageListData
{
! BlockNumber empty_end_pages; /* Number of "empty" end-pages */
! int num_pages; /* Number of pages in pagedesc */
! int num_allocated_pages; /* Number of allocated pages in
* pagedesc */
VacPage *pagedesc; /* Descriptions of pages */
} VacPageListData;
--- 60,68 ----
typedef struct VacPageListData
{
! BlockNumber empty_end_pages; /* Number of "empty" end-pages */
! BlockNumber num_pages; /* Number of pages in pagedesc */
! BlockNumber num_allocated_pages; /* Number of allocated pages in
* pagedesc */
VacPage *pagedesc; /* Descriptions of pages */
} VacPageListData;
***************
*** 988,994 ****
usable_free_size;
Size min_tlen = MaxTupleSize;
Size max_tlen = 0;
- int i;
bool do_shrinking = true;
VTupleLink vtlinks = (VTupleLink) palloc(100 * sizeof(VTupleLinkData));
int num_vtlinks = 0;
--- 988,993 ----
***************
*** 1285,1291 ****
*/
if (do_shrinking)
{
! Assert((BlockNumber) fraged_pages->num_pages >= empty_end_pages);
fraged_pages->num_pages -= empty_end_pages;
usable_free_size = 0;
for (i = 0; i < fraged_pages->num_pages; i++)
--- 1284,1292 ----
*/
if (do_shrinking)
{
! BlockNumber i;
!
! Assert(fraged_pages->num_pages >= empty_end_pages);
fraged_pages->num_pages -= empty_end_pages;
usable_free_size = 0;
for (i = 0; i < fraged_pages->num_pages; i++)
***************
*** 1412,1418 ****
Nvacpagelist.num_pages = 0;
num_fraged_pages = fraged_pages->num_pages;
! Assert((BlockNumber) vacuum_pages->num_pages >= vacuum_pages->empty_end_pages);
vacuumed_pages = vacuum_pages->num_pages - vacuum_pages->empty_end_pages;
if (vacuumed_pages > 0)
{
--- 1413,1419 ----
Nvacpagelist.num_pages = 0;
num_fraged_pages = fraged_pages->num_pages;
! Assert(vacuum_pages->num_pages >= vacuum_pages->empty_end_pages);
vacuumed_pages = vacuum_pages->num_pages - vacuum_pages->empty_end_pages;
if (vacuumed_pages > 0)
{
***************
*** 2332,2342 ****
WriteBuffer(buf);
}
! /* now - free new list of reaped pages */
! curpage = Nvacpagelist.pagedesc;
! for (i = 0; i < Nvacpagelist.num_pages; i++, curpage++)
! pfree(*curpage);
! pfree(Nvacpagelist.pagedesc);
}
/*
--- 2333,2346 ----
WriteBuffer(buf);
}
! {
! BlockNumber i;
! /* now - free new list of reaped pages */
! curpage = Nvacpagelist.pagedesc;
! for (i = 0; i < Nvacpagelist.num_pages; i++, curpage++)
! pfree(*curpage);
! pfree(Nvacpagelist.pagedesc);
! }
}
/*
***************
*** 2381,2393 ****
Buffer buf;
VacPage *vacpage;
BlockNumber relblocks;
! int nblocks;
int i;
nblocks = vacuum_pages->num_pages;
nblocks -= vacuum_pages->empty_end_pages; /* nothing to do with them */
! for (i = 0, vacpage = vacuum_pages->pagedesc; i < nblocks; i++, vacpage++)
{
CHECK_FOR_INTERRUPTS();
if ((*vacpage)->offsets_free > 0)
--- 2385,2398 ----
Buffer buf;
VacPage *vacpage;
BlockNumber relblocks;
! BlockNumber nblocks;
! BlockNumber blks;
int i;
nblocks = vacuum_pages->num_pages;
nblocks -= vacuum_pages->empty_end_pages; /* nothing to do with them */
! for (blks = 0, vacpage = vacuum_pages->pagedesc; blks < nblocks; blks++, vacpage++)
{
CHECK_FOR_INTERRUPTS();
if ((*vacpage)->offsets_free > 0)
***************
*** 2636,2643 ****
vac_update_fsm(Relation onerel, VacPageList fraged_pages,
BlockNumber rel_pages)
{
! int nPages = fraged_pages->num_pages;
! int i;
BlockNumber *pages;
Size *spaceAvail;
--- 2641,2648 ----
vac_update_fsm(Relation onerel, VacPageList fraged_pages,
BlockNumber rel_pages)
{
! BlockNumber nPages = fraged_pages->num_pages;
! BlockNumber i;
BlockNumber *pages;
Size *spaceAvail;
Index: src/backend/storage/freespace/freespace.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/storage/freespace/freespace.c,v
retrieving revision 1.12
diff -c -r1.12 freespace.c
*** src/backend/storage/freespace/freespace.c 20 Jun 2002 20:29:34 -0000 1.12
--- src/backend/storage/freespace/freespace.c 8 Jul 2002 03:44:13 -0000
***************
*** 371,382 ****
MultiRecordFreeSpace(RelFileNode *rel,
BlockNumber minPage,
BlockNumber maxPage,
! int nPages,
BlockNumber *pages,
Size *spaceAvail)
{
FSMRelation *fsmrel;
! int i;
LWLockAcquire(FreeSpaceLock, LW_EXCLUSIVE);
fsmrel = lookup_fsm_rel(rel);
--- 371,382 ----
MultiRecordFreeSpace(RelFileNode *rel,
BlockNumber minPage,
BlockNumber maxPage,
! BlockNumber nPages,
BlockNumber *pages,
Size *spaceAvail)
{
FSMRelation *fsmrel;
! BlockNumber i;
LWLockAcquire(FreeSpaceLock, LW_EXCLUSIVE);
fsmrel = lookup_fsm_rel(rel);
Index: src/backend/utils/adt/tid.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v
retrieving revision 1.31
diff -c -r1.31 tid.c
*** src/backend/utils/adt/tid.c 20 Jun 2002 20:29:38 -0000 1.31
--- src/backend/utils/adt/tid.c 8 Jul 2002 03:44:13 -0000
***************
*** 87,93 ****
blockNumber = BlockIdGetBlockNumber(blockId);
offsetNumber = itemPtr->ip_posid;
! sprintf(buf, "(%d,%d)", (int) blockNumber, (int) offsetNumber);
PG_RETURN_CSTRING(pstrdup(buf));
}
--- 87,93 ----
blockNumber = BlockIdGetBlockNumber(blockId);
offsetNumber = itemPtr->ip_posid;
! sprintf(buf, "(%u,%d)", blockNumber, (int) offsetNumber);
PG_RETURN_CSTRING(pstrdup(buf));
}
***************
*** 140,146 ****
* correspond to the CTID of a base relation.
*/
static Datum
! currtid_for_view(Relation viewrel, ItemPointer tid)
{
TupleDesc att = RelationGetDescr(viewrel);
RuleLock *rulelock;
--- 140,146 ----
* correspond to the CTID of a base relation.
*/
static Datum
! currtid_for_view(Relation viewrel, ItemPointer tid)
{
TupleDesc att = RelationGetDescr(viewrel);
RuleLock *rulelock;
Index: src/include/storage/freespace.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/storage/freespace.h,v
retrieving revision 1.7
diff -c -r1.7 freespace.h
*** src/include/storage/freespace.h 20 Jun 2002 20:29:52 -0000 1.7
--- src/include/storage/freespace.h 8 Jul 2002 03:44:14 -0000
***************
*** 38,44 ****
extern void MultiRecordFreeSpace(RelFileNode *rel,
BlockNumber minPage,
BlockNumber maxPage,
! int nPages,
BlockNumber *pages,
Size *spaceAvail);
extern void FreeSpaceMapForgetRel(RelFileNode *rel);
--- 38,44 ----
extern void MultiRecordFreeSpace(RelFileNode *rel,
BlockNumber minPage,
BlockNumber maxPage,
! BlockNumber nPages,
BlockNumber *pages,
Size *spaceAvail);
extern void FreeSpaceMapForgetRel(RelFileNode *rel);