aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuo Ishii <ishii@postgresql.org>2015-09-05 09:19:25 +0900
committerTatsuo Ishii <ishii@postgresql.org>2015-09-05 09:42:46 +0900
commitb1cbc8529d076b71c9c2f8403139f7235072a357 (patch)
treedca59d6a2b6a5a5b5ceabc04809a5da71b7f7261 /src
parenta2538da89f664671d1790cb8dbb4b94849ed923c (diff)
downloadpostgresql-b1cbc8529d076b71c9c2f8403139f7235072a357.tar.gz
postgresql-b1cbc8529d076b71c9c2f8403139f7235072a357.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/brin/brin.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index 25d2a094dda..99337b0f0c0 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -934,12 +934,13 @@ terminate_brin_buildstate(BrinBuildState *state)
*/
static void
summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel,
- BlockNumber heapBlk)
+ BlockNumber heapBlk, BlockNumber heapNumBlks)
{
Buffer phbuf;
BrinTuple *phtup;
Size phsz;
OffsetNumber offset;
+ BlockNumber scanNumBlks;
/*
* Insert the placeholder tuple
@@ -960,8 +961,10 @@ summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel,
* by transactions that are still in progress, among other corner cases.
*/
state->bs_currRangeStart = heapBlk;
+ scanNumBlks = heapBlk + state->bs_pagesPerRange <= heapNumBlks ?
+ state->bs_pagesPerRange : heapNumBlks - heapBlk;
IndexBuildHeapRangeScan(heapRel, state->bs_irel, indexInfo, false, true,
- heapBlk, state->bs_pagesPerRange,
+ heapBlk, scanNumBlks,
brinbuildCallback, (void *) state);
/*
@@ -1066,7 +1069,7 @@ brinsummarize(Relation index, Relation heapRel, double *numSummarized,
pagesPerRange);
indexInfo = BuildIndexInfo(index);
}
- summarize_range(indexInfo, state, heapRel, heapBlk);
+ summarize_range(indexInfo, state, heapRel, heapBlk, heapNumBlocks);
/* and re-initialize state for the next range */
brin_memtuple_initialize(state->bs_dtuple, state->bs_bdesc);