Fix tuple counting in SP-GiST index build.
authorTom Lane
Thu, 22 Mar 2018 17:23:48 +0000 (13:23 -0400)
committerTom Lane
Thu, 22 Mar 2018 17:23:48 +0000 (13:23 -0400)
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

index cf3d11c34cbc090133fd3846776d88f03aa07911..edb41c1fc05e662679315634d7ff2657ef09f8c8 100644 (file)
@@ -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);
 }