]> granicus.if.org Git - postgresql/commitdiff
Fix errors in contrib/bloom index build.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 22 Mar 2018 17:13:58 +0000 (13:13 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 22 Mar 2018 17:14:07 +0000 (13:14 -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.)

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

contrib/bloom/blinsert.c

index d231e5331f9fad1ed4fd3efc4edab097cc4a3055..4afdea7c9a302fc5fd50e33c2f0e29a7da4aa9f0 100644 (file)
@@ -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;
 }