* Rats, we have to visit the heap to check visibility.
                         */
                        InstrCountTuples2(node, 1);
-                       if (!index_fetch_heap(scandesc, slot))
+                       if (!index_fetch_heap(scandesc, node->ioss_TableSlot))
                                continue;               /* no visible tuple, try next index entry */
 
-                       ExecClearTuple(slot);
+                       ExecClearTuple(node->ioss_TableSlot);
 
                        /*
                         * Only MVCC snapshots are supported here, so there should be no
         */
        tupDesc = ExecTypeFromTL(node->indextlist);
        ExecInitScanTupleSlot(estate, &indexstate->ss, tupDesc,
-                                                 table_slot_callbacks(currentRelation));
+                                                 &TTSOpsVirtual);
+
+       /*
+        * We need another slot, in a format that's suitable for the table AM,
+        * for when we need to fetch a tuple from the table for rechecking
+        * visibility.
+        */
+       indexstate->ioss_TableSlot =
+               ExecAllocTableSlot(&estate->es_tupleTable,
+                                                  RelationGetDescr(currentRelation),
+                                                  table_slot_callbacks(currentRelation));
 
        /*
         * Initialize result type and projection info.  The node's targetlist will
 
  *             SortSupport                for reordering ORDER BY exprs
  *             OrderByTypByVals   is the datatype of order by expression pass-by-value?
  *             OrderByTypLens     typlens of the datatypes of order by expressions
- *             pscan_len                  size of parallel index scan descriptor
+ *             PscanLen                   size of parallel index scan descriptor
  * ----------------
  */
 typedef struct IndexScanState
  *             RuntimeContext     expr context for evaling runtime Skeys
  *             RelationDesc       index relation descriptor
  *             ScanDesc                   index scan descriptor
+ *             TableSlot                  slot for holding tuples fetched from the table
  *             VMBuffer                   buffer in use for visibility map testing, if any
- *             ioss_PscanLen      Size of parallel index-only scan descriptor
+ *             PscanLen                   size of parallel index-only scan descriptor
  * ----------------
  */
 typedef struct IndexOnlyScanState
        ExprContext *ioss_RuntimeContext;
        Relation        ioss_RelationDesc;
        struct IndexScanDescData *ioss_ScanDesc;
+       TupleTableSlot *ioss_TableSlot;
        Buffer          ioss_VMBuffer;
        Size            ioss_PscanLen;
 } IndexOnlyScanState;