Re-consider VALID_ITEMPOINTER_OFFSETS wrt bitmap scan logic

pull/5052/head
Onur Tirtir 2021-05-05 02:09:41 +03:00
parent 0f4c97e0d0
commit 4f3c672ebe
1 changed files with 5 additions and 9 deletions

View File

@ -18,18 +18,14 @@
* for columnar tables to the following interval: * for columnar tables to the following interval:
* [FirstOffsetNumber, MaxOffsetNumber]. * [FirstOffsetNumber, MaxOffsetNumber].
* *
* However, for GIN indexes, Postgres also asserts the following in * However, bitmap scan logic assumes that itemPointer.offsetNumber cannot
* itemptr_to_uint64 function: * be larger than MaxHeapTuplesPerPage (see tbm_add_tuples).
* "GinItemPointerGetOffsetNumber(iptr) < (1 << MaxHeapTuplesPerPageBits)",
* where MaxHeapTuplesPerPageBits = 11.
* That means, offsetNumber for columnar tables can't be equal to
* 2**11 = 2048 = MaxOffsetNumber.
* Hence we can't use MaxOffsetNumber as offsetNumber too.
* *
* For this reason, we restrict itemPointer.offsetNumber * For this reason, we restrict itemPointer.offsetNumber
* to the following interval: [FirstOffsetNumber, MaxOffsetNumber). * to the following interval: [FirstOffsetNumber, MaxHeapTuplesPerPage].
*/ */
#define VALID_ITEMPOINTER_OFFSETS ((uint64) (MaxOffsetNumber - FirstOffsetNumber)) #define VALID_ITEMPOINTER_OFFSETS \
((uint64) (MaxHeapTuplesPerPage - FirstOffsetNumber + 1))
/* /*
* Number of valid ItemPointer BlockNumber's for "row number" <> "ItemPointer" * Number of valid ItemPointer BlockNumber's for "row number" <> "ItemPointer"