mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +03:00
hash: Refactor bucket squeeze code.
In preparation for adding write-ahead logging to hash indexes, refactor _hash_freeovflpage and _hash_squeezebucket so that all related page modifications happen in a single section of code. The previous coding assumed that it would be fine to move tuples one at a time, and also that the various operations involved in freeing an overflow page didn't necessarily all need to be done together, all of which is true if you don't care about write-ahead logging. Amit Kapila, with slight changes by me.
This commit is contained in:
@@ -597,6 +597,33 @@ PageGetFreeSpace(Page page)
|
||||
return (Size) space;
|
||||
}
|
||||
|
||||
/*
|
||||
* PageGetFreeSpaceForMultipleTuples
|
||||
* Returns the size of the free (allocatable) space on a page,
|
||||
* reduced by the space needed for multiple new line pointers.
|
||||
*
|
||||
* Note: this should usually only be used on index pages. Use
|
||||
* PageGetHeapFreeSpace on heap pages.
|
||||
*/
|
||||
Size
|
||||
PageGetFreeSpaceForMultipleTuples(Page page, int ntups)
|
||||
{
|
||||
int space;
|
||||
|
||||
/*
|
||||
* Use signed arithmetic here so that we behave sensibly if pd_lower >
|
||||
* pd_upper.
|
||||
*/
|
||||
space = (int) ((PageHeader) page)->pd_upper -
|
||||
(int) ((PageHeader) page)->pd_lower;
|
||||
|
||||
if (space < (int) (ntups * sizeof(ItemIdData)))
|
||||
return 0;
|
||||
space -= ntups * sizeof(ItemIdData);
|
||||
|
||||
return (Size) space;
|
||||
}
|
||||
|
||||
/*
|
||||
* PageGetExactFreeSpace
|
||||
* Returns the size of the free (allocatable) space on a page,
|
||||
|
Reference in New Issue
Block a user