Pass ItemPointer not HeapTuple to IndexBuildCallback.
authorAndres Freund <[email protected]>
Fri, 8 Nov 2019 08:44:52 +0000 (00:44 -0800)
committerAndres Freund <[email protected]>
Fri, 8 Nov 2019 19:49:29 +0000 (11:49 -0800)
Not all AMs use HeapTuples internally, making it inconvenient to pass
a HeapTuple. As the index callbacks really only need the TID, not the
full tuple, modify callback to only take ItemPointer.

Author: Ashwin Agrawal
Reviewed-By: Andres Freund
Discussion: https://postgr.es/m/CALfoeis6=8ehuR=VNtHvj3z16cYfCwPdTcpaxU+sfSUJ5QgR3g@mail.gmail.com

contrib/amcheck/verify_nbtree.c
contrib/bloom/blinsert.c
src/backend/access/brin/brin.c
src/backend/access/gin/gininsert.c
src/backend/access/gist/gistbuild.c
src/backend/access/hash/hash.c
src/backend/access/heap/heapam_handler.c
src/backend/access/nbtree/nbtsort.c
src/backend/access/spgist/spginsert.c
src/include/access/tableam.h

index 05e7d678ed4baeb73a265ecb49659fb897afe9e6..3542545de5681f6bf574f1f7bb50eef1b91dcfa9 100644 (file)
@@ -140,7 +140,7 @@ static BTScanInsert bt_right_page_check_scankey(BtreeCheckState *state);
 static void bt_downlink_check(BtreeCheckState *state, BTScanInsert targetkey,
                                                          BlockNumber childblock);
 static void bt_downlink_missing_check(BtreeCheckState *state);
-static void bt_tuple_present_callback(Relation index, HeapTuple htup,
+static void bt_tuple_present_callback(Relation index, ItemPointer tid,
                                                                          Datum *values, bool *isnull,
                                                                          bool tupleIsAlive, void *checkstate);
 static IndexTuple bt_normalize_tuple(BtreeCheckState *state,
@@ -1890,7 +1890,7 @@ bt_downlink_missing_check(BtreeCheckState *state)
  * also allows us to detect the corruption in many cases.
  */
 static void
-bt_tuple_present_callback(Relation index, HeapTuple htup, Datum *values,
+bt_tuple_present_callback(Relation index, ItemPointer tid, Datum *values,
                                                  bool *isnull, bool tupleIsAlive, void *checkstate)
 {
        BtreeCheckState *state = (BtreeCheckState *) checkstate;
@@ -1901,7 +1901,7 @@ bt_tuple_present_callback(Relation index, HeapTuple htup, Datum *values,
 
        /* Generate a normalized index tuple for fingerprinting */
        itup = index_form_tuple(RelationGetDescr(index), values, isnull);
-       itup->t_tid = htup->t_self;
+       itup->t_tid = *tid;
        norm = bt_normalize_tuple(state, itup);
 
        /* Probe Bloom filter -- tuple should be present */
index 30d17f501dbda52277bab8c665325fb9d3428364..adcbd168fb6959f3f4c696ecd899bf4abb1b9d68 100644 (file)
@@ -72,7 +72,7 @@ initCachedPage(BloomBuildState *buildstate)
  * Per-tuple callback for table_index_build_scan.
  */
 static void
-bloomBuildCallback(Relation index, HeapTuple htup, Datum *values,
+bloomBuildCallback(Relation index, ItemPointer tid, Datum *values,
                                   bool *isnull, bool tupleIsAlive, void *state)
 {
        BloomBuildState *buildstate = (BloomBuildState *) state;
@@ -81,7 +81,7 @@ bloomBuildCallback(Relation index, HeapTuple htup, Datum *values,
 
        oldCtx = MemoryContextSwitchTo(buildstate->tmpCtx);
 
-       itup = BloomFormTuple(&buildstate->blstate, &htup->t_self, values, isnull);
+       itup = BloomFormTuple(&buildstate->blstate, tid, values, isnull);
 
        /* Try to add next item to cached page */
        if (BloomPageAddItem(&buildstate->blstate, buildstate->data.data, itup))
index b4f681a79ef3645dd6481fa0881b3e02f6c6cf09..294ffa6e201f71884511271113a9d5b5ff4edd2f 100644 (file)
@@ -597,7 +597,7 @@ brinendscan(IndexScanDesc scan)
  */
 static void
 brinbuildCallback(Relation index,
-                                 HeapTuple htup,
+                                 ItemPointer tid,
                                  Datum *values,
                                  bool *isnull,
                                  bool tupleIsAlive,
@@ -607,7 +607,7 @@ brinbuildCallback(Relation index,
        BlockNumber thisblock;
        int                     i;
 
-       thisblock = ItemPointerGetBlockNumber(&htup->t_self);
+       thisblock = ItemPointerGetBlockNumber(tid);
 
        /*
         * If we're in a block that belongs to a future range, summarize what
index 6eb83639aa0465695b5d8f86f26e3d31fee0057f..d2905818b261a6764ed8c77b83b6c9cf728282eb 100644 (file)
@@ -276,7 +276,7 @@ ginHeapTupleBulkInsert(GinBuildState *buildstate, OffsetNumber attnum,
 }
 
 static void
-ginBuildCallback(Relation index, HeapTuple htup, Datum *values,
+ginBuildCallback(Relation index, ItemPointer tid, Datum *values,
                                 bool *isnull, bool tupleIsAlive, void *state)
 {
        GinBuildState *buildstate = (GinBuildState *) state;
@@ -287,8 +287,7 @@ ginBuildCallback(Relation index, HeapTuple htup, Datum *values,
 
        for (i = 0; i < buildstate->ginstate.origTupdesc->natts; i++)
                ginHeapTupleBulkInsert(buildstate, (OffsetNumber) (i + 1),
-                                                          values[i], isnull[i],
-                                                          &htup->t_self);
+                                                          values[i], isnull[i], tid);
 
        /* If we've maxed out our available memory, dump everything to the index */
        if (buildstate->accum.allocatedMemory >= (Size) maintenance_work_mem * 1024L)
index 2f4543dee5280bfb11477c40531c87d187a8d431..739846a257da71f6c006877111c704229d50557d 100644 (file)
@@ -80,7 +80,7 @@ typedef struct
 static void gistInitBuffering(GISTBuildState *buildstate);
 static int     calculatePagesPerBuffer(GISTBuildState *buildstate, int levelStep);
 static void gistBuildCallback(Relation index,
-                                                         HeapTuple htup,
+                                                         ItemPointer tid,
                                                          Datum *values,
                                                          bool *isnull,
                                                          bool tupleIsAlive,
@@ -440,7 +440,7 @@ calculatePagesPerBuffer(GISTBuildState *buildstate, int levelStep)
  */
 static void
 gistBuildCallback(Relation index,
-                                 HeapTuple htup,
+                                 ItemPointer tid,
                                  Datum *values,
                                  bool *isnull,
                                  bool tupleIsAlive,
@@ -454,7 +454,7 @@ gistBuildCallback(Relation index,
 
        /* form an index tuple and point it at the heap tuple */
        itup = gistFormTuple(buildstate->giststate, index, values, isnull, true);
-       itup->t_tid = htup->t_self;
+       itup->t_tid = *tid;
 
        if (buildstate->bufferingMode == GIST_BUFFERING_ACTIVE)
        {
index 5cc30dac429ed2f10f6fc10cc09860ee0bacf558..6c058362bd1d9c2481ed0e22117c7d19b94500c0 100644 (file)
@@ -43,7 +43,7 @@ typedef struct
 } HashBuildState;
 
 static void hashbuildCallback(Relation index,
-                                                         HeapTuple htup,
+                                                         ItemPointer tid,
                                                          Datum *values,
                                                          bool *isnull,
                                                          bool tupleIsAlive,
@@ -201,7 +201,7 @@ hashbuildempty(Relation index)
  */
 static void
 hashbuildCallback(Relation index,
-                                 HeapTuple htup,
+                                 ItemPointer tid,
                                  Datum *values,
                                  bool *isnull,
                                  bool tupleIsAlive,
@@ -220,14 +220,13 @@ hashbuildCallback(Relation index,
 
        /* Either spool the tuple for sorting, or just put it into the index */
        if (buildstate->spool)
-               _h_spool(buildstate->spool, &htup->t_self,
-                                index_values, index_isnull);
+               _h_spool(buildstate->spool, tid, index_values, index_isnull);
        else
        {
                /* form an index tuple and point it at the heap tuple */
                itup = index_form_tuple(RelationGetDescr(index),
                                                                index_values, index_isnull);
-               itup->t_tid = htup->t_self;
+               itup->t_tid = *tid;
                _hash_doinsert(index, itup, buildstate->heapRel);
                pfree(itup);
        }
index 2dd8821facdc3270f4ae75edf856906a888eb4ba..7081172dcc26c34aec9963a401adf10256a0f3a0 100644 (file)
@@ -1636,10 +1636,9 @@ heapam_index_build_range_scan(Relation heapRelation,
                         * For a heap-only tuple, pretend its TID is that of the root. See
                         * src/backend/access/heap/README.HOT for discussion.
                         */
-                       HeapTupleData rootTuple;
+                       ItemPointerData tid;
                        OffsetNumber offnum;
 
-                       rootTuple = *heapTuple;
                        offnum = ItemPointerGetOffsetNumber(&heapTuple->t_self);
 
                        if (!OffsetNumberIsValid(root_offsets[offnum - 1]))
@@ -1650,18 +1649,18 @@ heapam_index_build_range_scan(Relation heapRelation,
                                                                                 offnum,
                                                                                 RelationGetRelationName(heapRelation))));
 
-                       ItemPointerSetOffsetNumber(&rootTuple.t_self,
-                                                                          root_offsets[offnum - 1]);
+                       ItemPointerSet(&tid, ItemPointerGetBlockNumber(&heapTuple->t_self),
+                                                  root_offsets[offnum - 1]);
 
                        /* Call the AM's callback routine to process the tuple */
-                       callback(indexRelation, &rootTuple, values, isnull, tupleIsAlive,
+                       callback(indexRelation, &tid, values, isnull, tupleIsAlive,
                                         callback_state);
                }
                else
                {
                        /* Call the AM's callback routine to process the tuple */
-                       callback(indexRelation, heapTuple, values, isnull, tupleIsAlive,
-                                        callback_state);
+                       callback(indexRelation, &heapTuple->t_self, values, isnull,
+                                        tupleIsAlive, callback_state);
                }
        }
 
index b5f0857598b44d7e5209da02b947fd37e5e1ef1d..c11a3fb570d4d9a8ba5b03d66ee59fd69ddf367a 100644 (file)
@@ -269,7 +269,7 @@ static void _bt_spooldestroy(BTSpool *btspool);
 static void _bt_spool(BTSpool *btspool, ItemPointer self,
                                          Datum *values, bool *isnull);
 static void _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2);
-static void _bt_build_callback(Relation index, HeapTuple htup, Datum *values,
+static void _bt_build_callback(Relation index, ItemPointer tid, Datum *values,
                                                           bool *isnull, bool tupleIsAlive, void *state);
 static Page _bt_blnewpage(uint32 level);
 static BTPageState *_bt_pagestate(BTWriteState *wstate, uint32 level);
@@ -585,7 +585,7 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2)
  */
 static void
 _bt_build_callback(Relation index,
-                                  HeapTuple htup,
+                                  ItemPointer tid,
                                   Datum *values,
                                   bool *isnull,
                                   bool tupleIsAlive,
@@ -598,12 +598,12 @@ _bt_build_callback(Relation index,
         * processing
         */
        if (tupleIsAlive || buildstate->spool2 == NULL)
-               _bt_spool(buildstate->spool, &htup->t_self, values, isnull);
+               _bt_spool(buildstate->spool, tid, values, isnull);
        else
        {
                /* dead tuples are put into spool2 */
                buildstate->havedead = true;
-               _bt_spool(buildstate->spool2, &htup->t_self, values, isnull);
+               _bt_spool(buildstate->spool2, tid, values, isnull);
        }
 
        buildstate->indtuples += 1;
index b40bd440cf09e1723e2515711f193dfc70e801a2..dd9088741cffa0e266467cdd6f16ef301b5a9467 100644 (file)
@@ -40,7 +40,7 @@ typedef struct
 
 /* Callback to process one heap tuple during table_index_build_scan */
 static void
-spgistBuildCallback(Relation index, HeapTuple htup, Datum *values,
+spgistBuildCallback(Relation index, ItemPointer tid, Datum *values,
                                        bool *isnull, bool tupleIsAlive, void *state)
 {
        SpGistBuildState *buildstate = (SpGistBuildState *) state;
@@ -55,7 +55,7 @@ spgistBuildCallback(Relation index, HeapTuple htup, Datum *values,
         * lock on some buffer.  So we need to be willing to retry.  We can flush
         * any temp data when retrying.
         */
-       while (!spgdoinsert(index, &buildstate->spgstate, &htup->t_self,
+       while (!spgdoinsert(index, &buildstate->spgstate, tid,
                                                *values, *isnull))
        {
                MemoryContextReset(buildstate->tmpCtx);
index 7f81703b783b140318f1992eee3fd79b8ce8c718..64022917e21754c9457eacf4fbfb389f3546b0cb 100644 (file)
@@ -141,7 +141,7 @@ typedef struct TM_FailureData
 
 /* Typedef for callback function for table_index_build_scan */
 typedef void (*IndexBuildCallback) (Relation index,
-                                                                       HeapTuple htup,
+                                                                       ItemPointer tid,
                                                                        Datum *values,
                                                                        bool *isnull,
                                                                        bool tupleIsAlive,