aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2018-03-22 13:13:58 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2018-03-22 13:14:07 -0400
commitc35b47286960d2c7885dce162ddfe26939d0d373 (patch)
tree1dc40d1bd725365a25cf57571e0ba51e68ba4f9a
parente2f1eb0ee30d144628ab523432320f174a2c8966 (diff)
downloadpostgresql-c35b47286960d2c7885dce162ddfe26939d0d373.tar.gz
postgresql-c35b47286960d2c7885dce162ddfe26939d0d373.zip
Fix errors in contrib/bloom index build.
Count the number of tuples in the index honestly, instead of assuming that it's the same as the number of tuples in the heap. (It might be different if the index is partial.) Fix counting of tuples in current index page, too. This error would have led to failing to write out the final page of the index if it contained exactly one tuple, so that the last tuple of the relation would not get indexed. Back-patch to 9.6 where contrib/bloom was added. Tomas Vondra and Tom Lane Discussion: https://postgr.es/m/3b3d8eac-c709-0d25-088e-b98339a1b28a@2ndquadrant.com
-rw-r--r--contrib/bloom/blinsert.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/contrib/bloom/blinsert.c b/contrib/bloom/blinsert.c
index d231e5331f9..4afdea7c9a3 100644
--- a/contrib/bloom/blinsert.c
+++ b/contrib/bloom/blinsert.c
@@ -33,10 +33,11 @@ PG_MODULE_MAGIC;
typedef struct
{
BloomState blstate; /* bloom index state */
+ int64 indtuples; /* total number of tuples indexed */
MemoryContext tmpCtx; /* temporary memory context reset after each
* tuple */
char data[BLCKSZ]; /* cached page */
- int64 count; /* number of tuples in cached page */
+ int count; /* number of tuples in cached page */
} BloomBuildState;
/*
@@ -102,8 +103,14 @@ bloomBuildCallback(Relation index, HeapTuple htup, Datum *values,
/* We shouldn't be here since we're inserting to the empty page */
elog(ERROR, "could not add new bloom tuple to empty page");
}
+
+ /* Next item was added successfully */
+ buildstate->count++;
}
+ /* Update total tuple count */
+ buildstate->indtuples += 1;
+
MemoryContextSwitchTo(oldCtx);
MemoryContextReset(buildstate->tmpCtx);
}
@@ -138,17 +145,15 @@ blbuild(Relation heap, Relation index, IndexInfo *indexInfo)
bloomBuildCallback, (void *) &buildstate,
NULL);
- /*
- * There are could be some items in cached page. Flush this page if
- * needed.
- */
+ /* Flush last page if needed (it will be, unless heap was empty) */
if (buildstate.count > 0)
flushCachedPage(index, &buildstate);
MemoryContextDelete(buildstate.tmpCtx);
result = (IndexBuildResult *) palloc(sizeof(IndexBuildResult));
- result->heap_tuples = result->index_tuples = reltuples;
+ result->heap_tuples = reltuples;
+ result->index_tuples = buildstate.indtuples;
return result;
}