Commit c39f5674 authored by Tatsuo Ishii's avatar Tatsuo Ishii

Fix brin index summarizing while vacuuming.

If the number of heap blocks is not multiples of pages per range, the
summarizing produces wrong summary information for the last brin index
tuple while vacuuming.

Problem reported by Tatsuo Ishii and fixed by Amit Langote.

Discussion at "[HACKERS] BRIN INDEX value (message id :20150903.174935.1946402199422994347.t-ishii@sraoss.co.jp)
Backpatched to 9.5 in which brin index was added.
parent c5454f99
...@@ -934,12 +934,13 @@ terminate_brin_buildstate(BrinBuildState *state) ...@@ -934,12 +934,13 @@ terminate_brin_buildstate(BrinBuildState *state)
*/ */
static void static void
summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel, summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel,
BlockNumber heapBlk) BlockNumber heapBlk, BlockNumber heapNumBlks)
{ {
Buffer phbuf; Buffer phbuf;
BrinTuple *phtup; BrinTuple *phtup;
Size phsz; Size phsz;
OffsetNumber offset; OffsetNumber offset;
BlockNumber scanNumBlks;
/* /*
* Insert the placeholder tuple * Insert the placeholder tuple
...@@ -960,8 +961,10 @@ summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel, ...@@ -960,8 +961,10 @@ summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel,
* by transactions that are still in progress, among other corner cases. * by transactions that are still in progress, among other corner cases.
*/ */
state->bs_currRangeStart = heapBlk; state->bs_currRangeStart = heapBlk;
scanNumBlks = heapBlk + state->bs_pagesPerRange <= heapNumBlks ?
state->bs_pagesPerRange : heapNumBlks - heapBlk;
IndexBuildHeapRangeScan(heapRel, state->bs_irel, indexInfo, false, true, IndexBuildHeapRangeScan(heapRel, state->bs_irel, indexInfo, false, true,
heapBlk, state->bs_pagesPerRange, heapBlk, scanNumBlks,
brinbuildCallback, (void *) state); brinbuildCallback, (void *) state);
/* /*
...@@ -1066,7 +1069,7 @@ brinsummarize(Relation index, Relation heapRel, double *numSummarized, ...@@ -1066,7 +1069,7 @@ brinsummarize(Relation index, Relation heapRel, double *numSummarized,
pagesPerRange); pagesPerRange);
indexInfo = BuildIndexInfo(index); indexInfo = BuildIndexInfo(index);
} }
summarize_range(indexInfo, state, heapRel, heapBlk); summarize_range(indexInfo, state, heapRel, heapBlk, heapNumBlocks);
/* and re-initialize state for the next range */ /* and re-initialize state for the next range */
brin_memtuple_initialize(state->bs_dtuple, state->bs_bdesc); brin_memtuple_initialize(state->bs_dtuple, state->bs_bdesc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment