]> granicus.if.org Git - postgresql/commitdiff
Remove dead code supporting mark/restore in SeqScan, TidScan, ValuesScan.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 21 Nov 2014 01:20:54 +0000 (20:20 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 21 Nov 2014 01:20:54 +0000 (20:20 -0500)
There seems no prospect that any of this will ever be useful, and indeed
it's questionable whether some of it would work if it ever got called;
it's certainly not been exercised in a very long time, if ever. So let's
get rid of it, and make the comments about mark/restore in execAmi.c less
wishy-washy.

The mark/restore support for Result nodes is also currently dead code,
but that's due to planner limitations not because it's impossible that
it could be useful.  So I left it in.

src/backend/access/heap/heapam.c
src/backend/executor/execAmi.c
src/backend/executor/nodeSeqscan.c
src/backend/executor/nodeTidscan.c
src/backend/executor/nodeValuesscan.c
src/include/access/heapam.h
src/include/access/relscan.h
src/include/executor/nodeSeqscan.h
src/include/executor/nodeTidscan.h
src/include/executor/nodeValuesscan.h
src/include/nodes/execnodes.h

index c6e1eb79b2c912c66842d532f16136f9b30c8fda..df4853bad14a343813e6ba0918c5ae262a001123 100644 (file)
@@ -27,8 +27,6 @@
  *             heap_multi_insert - insert multiple tuples into a relation
  *             heap_delete             - delete a tuple from a relation
  *             heap_update             - replace a tuple in a relation with another tuple
- *             heap_markpos    - mark scan position
- *             heap_restrpos   - restore position to marked location
  *             heap_sync               - sync heap, for when no WAL has been written
  *
  * NOTES
@@ -280,9 +278,6 @@ initscan(HeapScanDesc scan, ScanKey key, bool is_rescan)
        scan->rs_cbuf = InvalidBuffer;
        scan->rs_cblock = InvalidBlockNumber;
 
-       /* we don't have a marked position... */
-       ItemPointerSetInvalid(&(scan->rs_mctid));
-
        /* page-at-a-time fields are always invalid when not rs_inited */
 
        /*
@@ -6317,71 +6312,6 @@ heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid,
        return false;
 }
 
-/* ----------------
- *             heap_markpos    - mark scan position
- * ----------------
- */
-void
-heap_markpos(HeapScanDesc scan)
-{
-       /* Note: no locking manipulations needed */
-
-       if (scan->rs_ctup.t_data != NULL)
-       {
-               scan->rs_mctid = scan->rs_ctup.t_self;
-               if (scan->rs_pageatatime)
-                       scan->rs_mindex = scan->rs_cindex;
-       }
-       else
-               ItemPointerSetInvalid(&scan->rs_mctid);
-}
-
-/* ----------------
- *             heap_restrpos   - restore position to marked location
- * ----------------
- */
-void
-heap_restrpos(HeapScanDesc scan)
-{
-       /* XXX no amrestrpos checking that ammarkpos called */
-
-       if (!ItemPointerIsValid(&scan->rs_mctid))
-       {
-               scan->rs_ctup.t_data = NULL;
-
-               /*
-                * unpin scan buffers
-                */
-               if (BufferIsValid(scan->rs_cbuf))
-                       ReleaseBuffer(scan->rs_cbuf);
-               scan->rs_cbuf = InvalidBuffer;
-               scan->rs_cblock = InvalidBlockNumber;
-               scan->rs_inited = false;
-       }
-       else
-       {
-               /*
-                * If we reached end of scan, rs_inited will now be false.  We must
-                * reset it to true to keep heapgettup from doing the wrong thing.
-                */
-               scan->rs_inited = true;
-               scan->rs_ctup.t_self = scan->rs_mctid;
-               if (scan->rs_pageatatime)
-               {
-                       scan->rs_cindex = scan->rs_mindex;
-                       heapgettup_pagemode(scan,
-                                                               NoMovementScanDirection,
-                                                               0,              /* needn't recheck scan keys */
-                                                               NULL);
-               }
-               else
-                       heapgettup(scan,
-                                          NoMovementScanDirection,
-                                          0,           /* needn't recheck scan keys */
-                                          NULL);
-       }
-}
-
 /*
  * If 'tuple' contains any visible XID greater than latestRemovedXid,
  * ratchet forwards latestRemovedXid to the greatest one found.
index 643aaace3a9c8372223ae30ab4e5d7a0fb902dbd..7027d7f8051460fd24dd6c40f439941e009f9075 100644 (file)
@@ -271,16 +271,20 @@ ExecReScan(PlanState *node)
  * ExecMarkPos
  *
  * Marks the current scan position.
+ *
+ * NOTE: mark/restore capability is currently needed only for plan nodes
+ * that are the immediate inner child of a MergeJoin node.  Since MergeJoin
+ * requires sorted input, there is never any need to support mark/restore in
+ * node types that cannot produce sorted output.  There are some cases in
+ * which a node can pass through sorted data from its child; if we don't
+ * implement mark/restore for such a node type, the planner compensates by
+ * inserting a Material node above that node.
  */
 void
 ExecMarkPos(PlanState *node)
 {
        switch (nodeTag(node))
        {
-               case T_SeqScanState:
-                       ExecSeqMarkPos((SeqScanState *) node);
-                       break;
-
                case T_IndexScanState:
                        ExecIndexMarkPos((IndexScanState *) node);
                        break;
@@ -289,14 +293,6 @@ ExecMarkPos(PlanState *node)
                        ExecIndexOnlyMarkPos((IndexOnlyScanState *) node);
                        break;
 
-               case T_TidScanState:
-                       ExecTidMarkPos((TidScanState *) node);
-                       break;
-
-               case T_ValuesScanState:
-                       ExecValuesMarkPos((ValuesScanState *) node);
-                       break;
-
                case T_CustomScanState:
                        ExecCustomMarkPos((CustomScanState *) node);
                        break;
@@ -338,10 +334,6 @@ ExecRestrPos(PlanState *node)
 {
        switch (nodeTag(node))
        {
-               case T_SeqScanState:
-                       ExecSeqRestrPos((SeqScanState *) node);
-                       break;
-
                case T_IndexScanState:
                        ExecIndexRestrPos((IndexScanState *) node);
                        break;
@@ -350,14 +342,6 @@ ExecRestrPos(PlanState *node)
                        ExecIndexOnlyRestrPos((IndexOnlyScanState *) node);
                        break;
 
-               case T_TidScanState:
-                       ExecTidRestrPos((TidScanState *) node);
-                       break;
-
-               case T_ValuesScanState:
-                       ExecValuesRestrPos((ValuesScanState *) node);
-                       break;
-
                case T_CustomScanState:
                        ExecCustomRestrPos((CustomScanState *) node);
                        break;
@@ -386,14 +370,6 @@ ExecRestrPos(PlanState *node)
  * This is used during planning and so must accept a Path, not a Plan.
  * We keep it here to be adjacent to the routines above, which also must
  * know which plan types support mark/restore.
- *
- * XXX Ideally, all plan node types would support mark/restore, and this
- * wouldn't be needed.  For now, this had better match the routines above.
- *
- * (However, since the only present use of mark/restore is in mergejoin,
- * there is no need to support mark/restore in any plan type that is not
- * capable of generating ordered output.  So the seqscan, tidscan,
- * and valuesscan support is actually useless code at present.)
  */
 bool
 ExecSupportsMarkRestore(Path *pathnode)
@@ -405,11 +381,8 @@ ExecSupportsMarkRestore(Path *pathnode)
         */
        switch (pathnode->pathtype)
        {
-               case T_SeqScan:
                case T_IndexScan:
                case T_IndexOnlyScan:
-               case T_TidScan:
-               case T_ValuesScan:
                case T_Material:
                case T_Sort:
                        return true;
@@ -426,7 +399,11 @@ ExecSupportsMarkRestore(Path *pathnode)
                         * Although Result supports mark/restore if it has a child plan
                         * that does, we presently come here only for ResultPath nodes,
                         * which represent Result plans without a child plan.  So there is
-                        * nothing to recurse to and we can just say "false".
+                        * nothing to recurse to and we can just say "false".  (This means
+                        * that Result's support for mark/restore is in fact dead code.
+                        * We keep it since it's not much code, and someday the planner
+                        * might be smart enough to use it.  That would require making
+                        * this function smarter too, of course.)
                         */
                        Assert(IsA(pathnode, ResultPath));
                        return false;
index ab13e4729ee6bfb495eaa9ad414c035d9a5173f2..53cfda5f9c2d3a9c63e6606458d53f1b07fdca54 100644 (file)
@@ -19,8 +19,6 @@
  *             ExecInitSeqScan                 creates and initializes a seqscan node.
  *             ExecEndSeqScan                  releases any storage allocated.
  *             ExecReScanSeqScan               rescans the relation
- *             ExecSeqMarkPos                  marks scan position
- *             ExecSeqRestrPos                 restores scan position
  */
 #include "postgres.h"
 
@@ -274,39 +272,3 @@ ExecReScanSeqScan(SeqScanState *node)
 
        ExecScanReScan((ScanState *) node);
 }
-
-/* ----------------------------------------------------------------
- *             ExecSeqMarkPos(node)
- *
- *             Marks scan position.
- * ----------------------------------------------------------------
- */
-void
-ExecSeqMarkPos(SeqScanState *node)
-{
-       HeapScanDesc scan = node->ss_currentScanDesc;
-
-       heap_markpos(scan);
-}
-
-/* ----------------------------------------------------------------
- *             ExecSeqRestrPos
- *
- *             Restores scan position.
- * ----------------------------------------------------------------
- */
-void
-ExecSeqRestrPos(SeqScanState *node)
-{
-       HeapScanDesc scan = node->ss_currentScanDesc;
-
-       /*
-        * Clear any reference to the previously returned tuple.  This is needed
-        * because the slot is simply pointing at scan->rs_cbuf, which
-        * heap_restrpos will change; we'd have an internally inconsistent slot if
-        * we didn't do this.
-        */
-       ExecClearTuple(node->ss_ScanTupleSlot);
-
-       heap_restrpos(scan);
-}
index 3560f8440ab91604612ff80825d3c5ff40120dfe..1b2454d49de6cf647b5b7249796836fe40fd807f 100644 (file)
@@ -19,8 +19,6 @@
  *             ExecInitTidScan         creates and initializes state info.
  *             ExecReScanTidScan       rescans the tid relation.
  *             ExecEndTidScan          releases all storage.
- *             ExecTidMarkPos          marks scan position.
- *             ExecTidRestrPos         restores scan position.
  */
 #include "postgres.h"
 
@@ -440,34 +438,6 @@ ExecEndTidScan(TidScanState *node)
        ExecCloseScanRelation(node->ss.ss_currentRelation);
 }
 
-/* ----------------------------------------------------------------
- *             ExecTidMarkPos
- *
- *             Marks scan position by marking the current tid.
- *             Returns nothing.
- * ----------------------------------------------------------------
- */
-void
-ExecTidMarkPos(TidScanState *node)
-{
-       node->tss_MarkTidPtr = node->tss_TidPtr;
-}
-
-/* ----------------------------------------------------------------
- *             ExecTidRestrPos
- *
- *             Restores scan position by restoring the current tid.
- *             Returns nothing.
- *
- *             XXX Assumes previously marked scan position belongs to current tid
- * ----------------------------------------------------------------
- */
-void
-ExecTidRestrPos(TidScanState *node)
-{
-       node->tss_TidPtr = node->tss_MarkTidPtr;
-}
-
 /* ----------------------------------------------------------------
  *             ExecInitTidScan
  *
index d49a4733865083e70e2fbf1395730a96ebfc4e5b..8365b8c99f562d679dc19c0196776c7507277550 100644 (file)
@@ -246,7 +246,6 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
        /*
         * Other node-specific setup
         */
-       scanstate->marked_idx = -1;
        scanstate->curr_idx = -1;
        scanstate->array_len = list_length(node->values_lists);
 
@@ -293,30 +292,6 @@ ExecEndValuesScan(ValuesScanState *node)
        ExecClearTuple(node->ss.ss_ScanTupleSlot);
 }
 
-/* ----------------------------------------------------------------
- *             ExecValuesMarkPos
- *
- *             Marks scan position.
- * ----------------------------------------------------------------
- */
-void
-ExecValuesMarkPos(ValuesScanState *node)
-{
-       node->marked_idx = node->curr_idx;
-}
-
-/* ----------------------------------------------------------------
- *             ExecValuesRestrPos
- *
- *             Restores scan position.
- * ----------------------------------------------------------------
- */
-void
-ExecValuesRestrPos(ValuesScanState *node)
-{
-       node->curr_idx = node->marked_idx;
-}
-
 /* ----------------------------------------------------------------
  *             ExecReScanValuesScan
  *
index 9cd66a1b0f9b518d0e754eecd1eafa76d5dfe32e..f43b4829e9b39653dd9cdc1406443c69ed5c9086 100644 (file)
@@ -161,9 +161,6 @@ extern void simple_heap_delete(Relation relation, ItemPointer tid);
 extern void simple_heap_update(Relation relation, ItemPointer otid,
                                   HeapTuple tup);
 
-extern void heap_markpos(HeapScanDesc scan);
-extern void heap_restrpos(HeapScanDesc scan);
-
 extern void heap_sync(Relation relation);
 
 /* in heap/pruneheap.c */
index 8beb1be8829d86d8e87394ca65f1739cdf197e1f..f2c7ca1673acdf863de37a6cdf9211e2189414aa 100644 (file)
@@ -48,11 +48,9 @@ typedef struct HeapScanDescData
        BlockNumber rs_cblock;          /* current block # in scan, if any */
        Buffer          rs_cbuf;                /* current buffer in scan, if any */
        /* NB: if rs_cbuf is not InvalidBuffer, we hold a pin on that buffer */
-       ItemPointerData rs_mctid;       /* marked scan position, if any */
 
        /* these fields only used in page-at-a-time mode and for bitmap scans */
        int                     rs_cindex;              /* current tuple's index in vistuples */
-       int                     rs_mindex;              /* marked tuple's saved index */
        int                     rs_ntuples;             /* number of visible tuples on page */
        OffsetNumber rs_vistuples[MaxHeapTuplesPerPage];        /* their offsets */
 }      HeapScanDescData;
index 86f99d8384ba8313fe16e6f7c982a5e66acb5e74..4dc74314beeff240c10b5422a11ae3fdbb65a5e9 100644 (file)
@@ -19,8 +19,6 @@
 extern SeqScanState *ExecInitSeqScan(SeqScan *node, EState *estate, int eflags);
 extern TupleTableSlot *ExecSeqScan(SeqScanState *node);
 extern void ExecEndSeqScan(SeqScanState *node);
-extern void ExecSeqMarkPos(SeqScanState *node);
-extern void ExecSeqRestrPos(SeqScanState *node);
 extern void ExecReScanSeqScan(SeqScanState *node);
 
 #endif   /* NODESEQSCAN_H */
index 813aab5d9fe9fa326b7173b971520440961a3a02..d8679a00f5f743cde5bfebd44379f2929cf934cc 100644 (file)
@@ -19,8 +19,6 @@
 extern TidScanState *ExecInitTidScan(TidScan *node, EState *estate, int eflags);
 extern TupleTableSlot *ExecTidScan(TidScanState *node);
 extern void ExecEndTidScan(TidScanState *node);
-extern void ExecTidMarkPos(TidScanState *node);
-extern void ExecTidRestrPos(TidScanState *node);
 extern void ExecReScanTidScan(TidScanState *node);
 
 #endif   /* NODETIDSCAN_H */
index 4864d1a9ac709701f5597dd7051807828d2f690a..17bf399352af997dda3bb90476d074d61366a943 100644 (file)
@@ -19,8 +19,6 @@
 extern ValuesScanState *ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags);
 extern TupleTableSlot *ExecValuesScan(ValuesScanState *node);
 extern void ExecEndValuesScan(ValuesScanState *node);
-extern void ExecValuesMarkPos(ValuesScanState *node);
-extern void ExecValuesRestrPos(ValuesScanState *node);
 extern void ExecReScanValuesScan(ValuesScanState *node);
 
 #endif   /* NODEVALUESSCAN_H */
index 40fb8243ab426024653e44a7b730a77bb295fa8d..2bffa4be6cd1dbf46e2ad7db90bdafdb344669a0 100644 (file)
@@ -1377,7 +1377,6 @@ typedef struct TidScanState
        bool            tss_isCurrentOf;
        int                     tss_NumTids;
        int                     tss_TidPtr;
-       int                     tss_MarkTidPtr;
        ItemPointerData *tss_TidList;
        HeapTupleData tss_htup;
 } TidScanState;
@@ -1435,7 +1434,6 @@ typedef struct FunctionScanState
  *             exprlists                       array of expression lists being evaluated
  *             array_len                       size of array
  *             curr_idx                        current array index (0-based)
- *             marked_idx                      marked position (for mark/restore)
  *
  *     Note: ss.ps.ps_ExprContext is used to evaluate any qual or projection
  *     expressions attached to the node.  We create a second ExprContext,
@@ -1451,7 +1449,6 @@ typedef struct ValuesScanState
        List      **exprlists;
        int                     array_len;
        int                     curr_idx;
-       int                     marked_idx;
 } ValuesScanState;
 
 /* ----------------