From 46f80803a1273836b818a60127ae01a891c42c85 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 22 Mar 2018 13:23:48 -0400 Subject: [PATCH] Fix tuple counting in SP-GiST 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.) Back-patch to all supported versions. Tomas Vondra Discussion: https://postgr.es/m/3b3d8eac-c709-0d25-088e-b98339a1b28a@2ndquadrant.com --- src/backend/access/spgist/spginsert.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/access/spgist/spginsert.c b/src/backend/access/spgist/spginsert.c index 3ce07c4a37f..f8f7fa92fe5 100644 --- a/src/backend/access/spgist/spginsert.c +++ b/src/backend/access/spgist/spginsert.c @@ -30,6 +30,7 @@ typedef struct { SpGistState spgstate; /* SPGiST's working state */ + int64 indtuples; /* total number of tuples indexed */ MemoryContext tmpCtx; /* per-tuple temporary context */ } SpGistBuildState; @@ -57,6 +58,9 @@ spgistBuildCallback(Relation index, HeapTuple htup, Datum *values, MemoryContextReset(buildstate->tmpCtx); } + /* Update total tuple count */ + buildstate->indtuples += 1; + MemoryContextSwitchTo(oldCtx); MemoryContextReset(buildstate->tmpCtx); } @@ -130,6 +134,7 @@ spgbuild(PG_FUNCTION_ARGS) */ initSpGistState(&buildstate.spgstate, index); buildstate.spgstate.isBuild = true; + buildstate.indtuples = 0; buildstate.tmpCtx = AllocSetContextCreate(CurrentMemoryContext, "SP-GiST build temporary context", @@ -145,7 +150,8 @@ spgbuild(PG_FUNCTION_ARGS) SpGistUpdateMetaPage(index); result = (IndexBuildResult *) palloc0(sizeof(IndexBuildResult)); - result->heap_tuples = result->index_tuples = reltuples; + result->heap_tuples = reltuples; + result->index_tuples = buildstate.indtuples; PG_RETURN_POINTER(result); } -- 2.39.5