*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.80 2005/04/14 20:03:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/index/indexam.c,v 1.81 2005/05/15 21:19:54 tgl Exp $
*
* INTERFACE ROUTINES
* index_open - open an index relation by relation OID
/* ----------------
* index_restrpos - restore a scan position
+ *
+ * NOTE: this only restores the internal scan state of the index AM.
+ * The current result tuple (scan->xs_ctup) doesn't change. See comments
+ * for ExecRestrPos().
* ----------------
*/
void
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.83 2005/04/19 22:35:11 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.84 2005/05/15 21:19:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
* ExecRestrPos
*
* restores the scan position previously saved with ExecMarkPos()
+ *
+ * NOTE: the semantics of this are that the first ExecProcNode following
+ * the restore operation will yield the same tuple as the first one following
+ * the mark operation. It is unspecified what happens to the plan node's
+ * result TupleTableSlot. (In most cases the result slot is unchanged by
+ * a restore, but the node may choose to clear it or to load it with the
+ * restored-to tuple.) Hence the caller should discard any previously
+ * returned TupleTableSlot after doing a restore.
*/
void
ExecRestrPos(PlanState *node)
* 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.
* But note the test is on Plan nodetype, not PlanState nodetype.
+ *
+ * (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
+ * functionscan support is actually useless code at present.)
*/
bool
ExecSupportsMarkRestore(NodeTag plantype)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/nodeMergejoin.c,v 1.73 2005/05/14 21:29:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/nodeMergejoin.c,v 1.74 2005/05/15 21:19:55 tgl Exp $
*
*-------------------------------------------------------------------------
*/
ExecRestrPos(innerPlan);
/*
- * ExecRestrPos really should give us back a new Slot,
- * but since it doesn't, use the marked slot.
+ * ExecRestrPos probably should give us back a new Slot,
+ * but since it doesn't, use the marked slot. (The
+ * previously returned mj_InnerTupleSlot cannot be
+ * assumed to hold the required tuple.)
*/
node->mj_InnerTupleSlot = innerTupleSlot;
/* we need not do MJEvalInnerValues again */
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/executor/nodeSeqscan.c,v 1.52 2005/03/16 21:38:07 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/executor/nodeSeqscan.c,v 1.53 2005/05/15 21:19:55 tgl Exp $
*
*-------------------------------------------------------------------------
*/
void
ExecSeqMarkPos(SeqScanState *node)
{
- HeapScanDesc scan;
+ HeapScanDesc scan = node->ss_currentScanDesc;
- scan = node->ss_currentScanDesc;
heap_markpos(scan);
}
void
ExecSeqRestrPos(SeqScanState *node)
{
- HeapScanDesc scan;
+ 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);
- scan = node->ss_currentScanDesc;
heap_restrpos(scan);
}