From: | Gaetano Mendola <mendola(at)bigfoot(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Subject: | Re: PageGetMaxOffsetNumber on uninitialized pages |
Date: | 2004-06-03 16:25:54 |
Message-ID: | 40BF5112.6050402@bigfoot.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Tom Lane wrote:
> I was just looking at this macro:
>
> /*
> * PageGetMaxOffsetNumber
> * Returns the maximum offset number used by the given page.
> * Since offset numbers are 1-based, this is also the number
> * of items on the page.
> *
> * NOTE: to ensure sane behavior if the page is not initialized
> * (pd_lower == 0), cast the unsigned values to int before dividing.
> * That way we get -1 or so, not a huge positive number...
> */
> #define PageGetMaxOffsetNumber(page) \
> (((int) (((PageHeader) (page))->pd_lower - SizeOfPageHeaderData)) \
> / ((int) sizeof(ItemIdData)))
>
> The macro does the right thing on its own terms when applied to a zeroed
> page, but in some places it's used like this:
>
> OffsetNumber n;
> OffsetNumber maxoff;
>
> maxoff = PageGetMaxOffsetNumber(p);
> for (n = FirstOffsetNumber; n <= maxoff; n++)
>
> and OffsetNumber is uint16 not int. So a loop like this would go nuts
> instead of treating the zeroed page as if it were empty. This is not
> good (see the comments for PageHeaderIsValid in bufpage.c if you
> disremember why).
>
> We could fix this by changing the declarations of the "maxoff" variables
> to int, but I think it's probably cleaner to recode
> PageGetMaxOffsetNumber like so:
>
> #define PageGetMaxOffsetNumber(page) \
> (((PageHeader) (page))->pd_lower <= SizeOfPageHeaderData ? 0 : \
> ((((PageHeader) (page))->pd_lower - SizeOfPageHeaderData) \
> / sizeof(ItemIdData)))
Well I think that is safe change:
a <= b ? 0 : ( a-b ) /c
in
max( 0, (a-b)/c )
so I think (not tested) you can rewrite that macro in:
#define PageGetMaxOffsetNumber(page) \
(max(0, ((((PageHeader) (page))->pd_lower - SizeOfPageHeaderData) \
/ sizeof(ItemIdData))))
Regards
Gaeatano Mendola
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2004-06-03 16:47:34 | Re: [HACKERS] Configuration patch |
Previous Message | Tom Lane | 2004-06-03 16:23:02 | Re: pgsql-server: Adjust our timezone library to use pg_time_t (typedef'd |