Skip to content

Commit 33f1687

Browse files
committed
There already was a macro PageGetItemId; this is now used in (almost)
all places, where pd_linp is accessed. Also introduce new macros SizeOfPageHeaderData and BTMaxItemSize. This is just source code cosmetic, no behaviour changed. Manfred Koizar
1 parent 8864603 commit 33f1687

File tree

6 files changed

+58
-42
lines changed

6 files changed

+58
-42
lines changed

src/backend/access/heap/heapam.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.140 2002/07/02 05:46:14 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.141 2002/07/02 05:48:44 momjian Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -2067,7 +2067,7 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
20672067

20682068
while ((char *) unused < unend)
20692069
{
2070-
lp = ((PageHeader) page)->pd_linp + *unused;
2070+
lp = PageGetItemId(page, *unused + 1);
20712071
lp->lp_flags &= ~LP_USED;
20722072
unused++;
20732073
}

src/backend/access/nbtree/nbtinsert.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.93 2002/06/20 20:29:25 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.94 2002/07/02 05:48:44 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -383,10 +383,9 @@ _bt_insertonpg(Relation rel,
383383
* to 1/3 the per-page available space. Note that at this point,
384384
* itemsz doesn't include the ItemId.
385385
*/
386-
if (itemsz > (PageGetPageSize(page) - sizeof(PageHeaderData) - MAXALIGN(sizeof(BTPageOpaqueData))) / 3 - sizeof(ItemIdData))
386+
if (itemsz > BTMaxItemSize(page))
387387
elog(ERROR, "btree: index item size %lu exceeds maximum %lu",
388-
(unsigned long) itemsz,
389-
(PageGetPageSize(page) - sizeof(PageHeaderData) - MAXALIGN(sizeof(BTPageOpaqueData))) / 3 - sizeof(ItemIdData));
388+
(unsigned long) itemsz, BTMaxItemSize(page));
390389

391390
/*
392391
* Determine exactly where new item will go.
@@ -1020,9 +1019,8 @@ _bt_findsplitloc(Relation rel,
10201019

10211020
/* Total free space available on a btree page, after fixed overhead */
10221021
leftspace = rightspace =
1023-
PageGetPageSize(page) - sizeof(PageHeaderData) -
1024-
MAXALIGN(sizeof(BTPageOpaqueData))
1025-
+sizeof(ItemIdData);
1022+
PageGetPageSize(page) - SizeOfPageHeaderData -
1023+
MAXALIGN(sizeof(BTPageOpaqueData));
10261024

10271025
/*
10281026
* Finding the best possible split would require checking all the

src/backend/access/nbtree/nbtsort.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
* Portions Copyright (c) 1994, Regents of the University of California
3636
*
3737
* IDENTIFICATION
38-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsort.c,v 1.64 2002/06/20 20:29:25 momjian Exp $
38+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsort.c,v 1.65 2002/07/02 05:48:44 momjian Exp $
3939
*
4040
*-------------------------------------------------------------------------
4141
*/
@@ -346,10 +346,9 @@ _bt_buildadd(Relation index, BTPageState *state, BTItem bti)
346346
* oversize items being inserted into an already-existing index. But
347347
* during creation of an index, we don't go through there.
348348
*/
349-
if (btisz > (PageGetPageSize(npage) - sizeof(PageHeaderData) - MAXALIGN(sizeof(BTPageOpaqueData))) / 3 - sizeof(ItemIdData))
349+
if (btisz > BTMaxItemSize(npage))
350350
elog(ERROR, "btree: index item size %lu exceeds maximum %ld",
351-
(unsigned long) btisz,
352-
(PageGetPageSize(npage) - sizeof(PageHeaderData) - MAXALIGN(sizeof(BTPageOpaqueData))) / 3 - sizeof(ItemIdData));
351+
(unsigned long) btisz, BTMaxItemSize(npage));
353352

354353
if (pgspc < btisz || pgspc < state->btps_full)
355354
{

src/backend/storage/page/bufpage.c

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.45 2002/06/20 20:29:35 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.46 2002/07/02 05:48:44 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -37,13 +37,12 @@ PageInit(Page page, Size pageSize, Size specialSize)
3737
specialSize = MAXALIGN(specialSize);
3838

3939
Assert(pageSize == BLCKSZ);
40-
Assert(pageSize >
41-
specialSize + sizeof(PageHeaderData) - sizeof(ItemIdData));
40+
Assert(pageSize > specialSize + SizeOfPageHeaderData);
4241

4342
/* Make sure all fields of page are zero, as well as unused space */
4443
MemSet(p, 0, pageSize);
4544

46-
p->pd_lower = sizeof(PageHeaderData) - sizeof(ItemIdData);
45+
p->pd_lower = SizeOfPageHeaderData;
4746
p->pd_upper = pageSize - specialSize;
4847
p->pd_special = pageSize - specialSize;
4948
PageSetPageSize(page, pageSize);
@@ -88,7 +87,7 @@ PageAddItem(Page page,
8887
/*
8988
* Be wary about corrupted page pointers
9089
*/
91-
if (phdr->pd_lower < (sizeof(PageHeaderData) - sizeof(ItemIdData)) ||
90+
if (phdr->pd_lower < SizeOfPageHeaderData ||
9291
phdr->pd_lower > phdr->pd_upper ||
9392
phdr->pd_upper > phdr->pd_special ||
9493
phdr->pd_special > BLCKSZ)
@@ -112,7 +111,7 @@ PageAddItem(Page page,
112111
}
113112
if (offsetNumber < limit)
114113
{
115-
itemId = &phdr->pd_linp[offsetNumber - 1];
114+
itemId = PageGetItemId(phdr, offsetNumber);
116115
if (((*itemId).lp_flags & LP_USED) ||
117116
((*itemId).lp_len != 0))
118117
{
@@ -136,7 +135,7 @@ PageAddItem(Page page,
136135
/* look for "recyclable" (unused & deallocated) ItemId */
137136
for (offsetNumber = 1; offsetNumber < limit; offsetNumber++)
138137
{
139-
itemId = &phdr->pd_linp[offsetNumber - 1];
138+
itemId = PageGetItemId(phdr, offsetNumber);
140139
if ((((*itemId).lp_flags & LP_USED) == 0) &&
141140
((*itemId).lp_len == 0))
142141
break;
@@ -150,7 +149,7 @@ PageAddItem(Page page,
150149
* alignedSize > pd_upper.
151150
*/
152151
if (offsetNumber > limit)
153-
lower = (char *) (&phdr->pd_linp[offsetNumber]) - (char *) page;
152+
lower = (char *) PageGetItemId(phdr, offsetNumber + 1) - (char *) page;
154153
else if (offsetNumber == limit || needshuffle)
155154
lower = phdr->pd_lower + sizeof(ItemIdData);
156155
else
@@ -175,13 +174,13 @@ PageAddItem(Page page,
175174
ItemId fromitemId,
176175
toitemId;
177176

178-
fromitemId = &phdr->pd_linp[i - 1];
179-
toitemId = &phdr->pd_linp[i];
177+
fromitemId = PageGetItemId(phdr, i);
178+
toitemId = PageGetItemId(phdr, i + 1);
180179
*toitemId = *fromitemId;
181180
}
182181
}
183182

184-
itemId = &phdr->pd_linp[offsetNumber - 1];
183+
itemId = PageGetItemId(phdr, offsetNumber);
185184
(*itemId).lp_off = upper;
186185
(*itemId).lp_len = size;
187186
(*itemId).lp_flags = flags;
@@ -214,12 +213,12 @@ PageGetTempPage(Page page, Size specialSize)
214213
memcpy(temp, page, pageSize);
215214

216215
/* clear out the middle */
217-
size = (pageSize - sizeof(PageHeaderData)) + sizeof(ItemIdData);
216+
size = pageSize - SizeOfPageHeaderData;
218217
size -= MAXALIGN(specialSize);
219-
MemSet((char *) &(thdr->pd_linp[0]), 0, size);
218+
MemSet(PageGetContents(thdr), 0, size);
220219

221220
/* set high, low water marks */
222-
thdr->pd_lower = sizeof(PageHeaderData) - sizeof(ItemIdData);
221+
thdr->pd_lower = SizeOfPageHeaderData;
223222
thdr->pd_upper = pageSize - MAXALIGN(specialSize);
224223

225224
return temp;
@@ -291,7 +290,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
291290
* pointers, lengths, etc could cause us to clobber adjacent disk
292291
* buffers, spreading the data loss further. So, check everything.
293292
*/
294-
if (pd_lower < (sizeof(PageHeaderData) - sizeof(ItemIdData)) ||
293+
if (pd_lower < SizeOfPageHeaderData ||
295294
pd_lower > pd_upper ||
296295
pd_upper > pd_special ||
297296
pd_special > BLCKSZ ||
@@ -303,7 +302,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
303302
nused = 0;
304303
for (i = 0; i < nline; i++)
305304
{
306-
lp = ((PageHeader) page)->pd_linp + i;
305+
lp = PageGetItemId(page, i + 1);
307306
if ((*lp).lp_flags & LP_DELETE) /* marked for deletion */
308307
(*lp).lp_flags &= ~(LP_USED | LP_DELETE);
309308
if ((*lp).lp_flags & LP_USED)
@@ -317,7 +316,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
317316
/* Page is completely empty, so just reset it quickly */
318317
for (i = 0; i < nline; i++)
319318
{
320-
lp = ((PageHeader) page)->pd_linp + i;
319+
lp = PageGetItemId(page, i + 1);
321320
(*lp).lp_len = 0; /* indicate unused & deallocated */
322321
}
323322
((PageHeader) page)->pd_upper = pd_special;
@@ -331,7 +330,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
331330
totallen = 0;
332331
for (i = 0; i < nline; i++)
333332
{
334-
lp = ((PageHeader) page)->pd_linp + i;
333+
lp = PageGetItemId(page, i + 1);
335334
if ((*lp).lp_flags & LP_USED)
336335
{
337336
itemidptr->offsetindex = i;
@@ -363,7 +362,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
363362

364363
for (i = 0, itemidptr = itemidbase; i < nused; i++, itemidptr++)
365364
{
366-
lp = ((PageHeader) page)->pd_linp + itemidptr->offsetindex;
365+
lp = PageGetItemId(page, itemidptr->offsetindex + 1);
367366
upper -= itemidptr->alignedlen;
368367
memmove((char *) page + upper,
369368
(char *) page + itemidptr->itemoff,
@@ -426,7 +425,7 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
426425
/*
427426
* As with PageRepairFragmentation, paranoia seems justified.
428427
*/
429-
if (phdr->pd_lower < (sizeof(PageHeaderData) - sizeof(ItemIdData)) ||
428+
if (phdr->pd_lower < SizeOfPageHeaderData ||
430429
phdr->pd_lower > phdr->pd_upper ||
431430
phdr->pd_upper > phdr->pd_special ||
432431
phdr->pd_special > BLCKSZ)
@@ -452,6 +451,8 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
452451
/*
453452
* First, we want to get rid of the pd_linp entry for the index tuple.
454453
* We copy all subsequent linp's back one slot in the array.
454+
* We don't use PageGetItemId, because we are manipulating the _array_,
455+
* not individual linp's.
455456
*/
456457
nbytes = phdr->pd_lower -
457458
((char *) &phdr->pd_linp[offidx + 1] - (char *) phdr);
@@ -490,8 +491,8 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
490491
nline--; /* there's one less than when we started */
491492
for (i = nline; --i >= 0; )
492493
{
493-
if (phdr->pd_linp[i].lp_off <= offset)
494-
phdr->pd_linp[i].lp_off += size;
494+
if (PageGetItemId(phdr, i + 1)->lp_off <= offset)
495+
PageGetItemId(phdr, i + 1)->lp_off += size;
495496
}
496497
}
497498
}

src/include/access/nbtree.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: nbtree.h,v 1.62 2002/06/20 20:29:43 momjian Exp $
10+
* $Id: nbtree.h,v 1.63 2002/07/02 05:48:44 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -65,7 +65,7 @@ typedef struct BTMetaPageData
6565
} BTMetaPageData;
6666

6767
#define BTPageGetMeta(p) \
68-
((BTMetaPageData *) &((PageHeader) p)->pd_linp[0])
68+
((BTMetaPageData *) PageGetContents(p))
6969

7070
#define BTREE_METAPAGE 0 /* first page is meta */
7171
#define BTREE_MAGIC 0x053162 /* magic number of btree pages */
@@ -76,6 +76,14 @@ typedef struct BTMetaPageData
7676

7777
#define BTREE_VERSION 1
7878

79+
/*
80+
* We actually need to be able to fit three items on every page,
81+
* so restrict any one item to 1/3 the per-page available space.
82+
*/
83+
#define BTMaxItemSize(page) \
84+
((PageGetPageSize(page) - \
85+
sizeof(PageHeaderData) - \
86+
MAXALIGN(sizeof(BTPageOpaqueData))) / 3 - sizeof(ItemIdData))
7987
/*
8088
* BTScanOpaqueData is used to remember which buffers we're currently
8189
* examining in the scan. We keep these buffers pinned (but not locked,

src/include/storage/bufpage.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: bufpage.h,v 1.48 2002/06/20 20:29:52 momjian Exp $
10+
* $Id: bufpage.h,v 1.49 2002/07/02 05:48:44 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -157,13 +157,17 @@ typedef enum
157157
((bool) (((PageHeader) (page))->pd_lower != 0)) \
158158
)
159159

160+
/*
161+
* line pointer does not count as part of header
162+
*/
163+
#define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp[0]))
164+
160165
/*
161166
* PageIsEmpty
162167
* returns true iff no itemid has been allocated on the page
163168
*/
164169
#define PageIsEmpty(page) \
165-
(((PageHeader) (page))->pd_lower <= \
166-
(sizeof(PageHeaderData) - sizeof(ItemIdData)))
170+
(((PageHeader) (page))->pd_lower <= SizeOfPageHeaderData)
167171

168172
/*
169173
* PageIsNew
@@ -179,6 +183,13 @@ typedef enum
179183
#define PageGetItemId(page, offsetNumber) \
180184
((ItemId) (&((PageHeader) (page))->pd_linp[(offsetNumber) - 1]))
181185

186+
/*
187+
* PageGetContents
188+
* To be used in case the page does not contain item pointers.
189+
*/
190+
#define PageGetContents(page) \
191+
((char *) (&((PageHeader) (page))->pd_linp[0]))
192+
182193
/* ----------------
183194
* macros to access opaque space
184195
* ----------------
@@ -290,8 +301,7 @@ typedef enum
290301
* That way we get -1 or so, not a huge positive number...
291302
*/
292303
#define PageGetMaxOffsetNumber(page) \
293-
(((int) (((PageHeader) (page))->pd_lower - \
294-
(sizeof(PageHeaderData) - sizeof(ItemIdData)))) \
304+
(((int) (((PageHeader) (page))->pd_lower - SizeOfPageHeaderData)) \
295305
/ ((int) sizeof(ItemIdData)))
296306

297307
#define PageGetLSN(page) \

0 commit comments

Comments
 (0)