diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index b1d1c578f385503fd110177e57d959da22467ed6..16fcd225a8eb0645698deaa44099cb80ac5fe44f 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.47 2000/02/18 09:29:57 inoue Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.48 2000/04/07 00:30:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -338,6 +338,11 @@ ExecIndexReScan(IndexScan *node, ExprContext *exprCtxt, Plan *parent)
 	if (ScanDirectionIsBackward(node->indxorderdir))
 		indexstate->iss_IndexPtr = numIndices;
 
+	/* If we are being passed an outer tuple, save it for runtime key calc */
+	if (exprCtxt != NULL)
+		node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple =
+			exprCtxt->ecxt_outertuple;
+
 	/* If this is re-scanning of PlanQual ... */
 	if (estate->es_evTuple != NULL &&
 		estate->es_evTuple[node->scan.scanrelid - 1] != NULL)
@@ -346,12 +351,6 @@ ExecIndexReScan(IndexScan *node, ExprContext *exprCtxt, Plan *parent)
 		return;
 	}
 
-	/* it's possible in subselects */
-	if (exprCtxt == NULL)
-		exprCtxt = node->scan.scanstate->cstate.cs_ExprContext;
-
-	node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple = exprCtxt->ecxt_outertuple;
-
 	/*
 	 * get the index qualifications and recalculate the appropriate values
 	 */
@@ -379,14 +378,16 @@ ExecIndexReScan(IndexScan *node, ExprContext *exprCtxt, Plan *parent)
 				{
 					clause = nth(j, qual);
 					scanexpr = (run_keys[j] == RIGHT_OP) ?
-						(Node *) get_rightop(clause) : (Node *) get_leftop(clause);
-
+						(Node *) get_rightop(clause) :
+						(Node *) get_leftop(clause);
 					/*
 					 * pass in isDone but ignore it.  We don't iterate in
 					 * quals
 					 */
 					scanvalue = (Datum)
-						ExecEvalExpr(scanexpr, exprCtxt, &isNull, &isDone);
+						ExecEvalExpr(scanexpr,
+								node->scan.scanstate->cstate.cs_ExprContext,
+									 &isNull, &isDone);
 					scan_keys[j].sk_argument = scanvalue;
 					if (isNull)
 						scan_keys[j].sk_flags |= SK_ISNULL;
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c
index 36159ad4abec037ec5db6cec254d85fd5b37dce0..7d9c6748637cf77a0ee12409ac9ba67ced0a7132 100644
--- a/src/backend/executor/nodeTidscan.c
+++ b/src/backend/executor/nodeTidscan.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.4 2000/01/26 05:56:24 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.5 2000/04/07 00:30:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -109,8 +109,10 @@ TidNext(TidScan *node)
 		if (estate->es_evTupleNull[node->scan.scanrelid - 1])
 			return slot;		/* return empty slot */
 		
+		/* probably ought to use ExecStoreTuple here... */
 		slot->val = estate->es_evTuple[node->scan.scanrelid - 1];
 		slot->ttc_shouldFree = false;
+
 		/* Flag for the next call that no more tuples */
 		estate->es_evTupleNull[node->scan.scanrelid - 1] = true;
 		return (slot);
@@ -255,7 +257,6 @@ ExecTidReScan(TidScan *node, ExprContext *exprCtxt, Plan *parent)
 {
 	EState		*estate;
 	TidScanState	*tidstate;
-	Plan		*outerPlan;
 	ItemPointer	*tidList;
 
 	tidstate = node->tidstate;
@@ -263,30 +264,22 @@ ExecTidReScan(TidScan *node, ExprContext *exprCtxt, Plan *parent)
 	tidstate->tss_TidPtr = -1;
 	tidList = tidstate->tss_TidList;
 
-	if ((outerPlan = outerPlan((Plan *) node)) != NULL)
+	/* If we are being passed an outer tuple, save it for runtime key calc */
+	if (exprCtxt != NULL)
+		node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple =
+			exprCtxt->ecxt_outertuple;
+
+	/* If this is re-scanning of PlanQual ... */
+	if (estate->es_evTuple != NULL &&
+		estate->es_evTuple[node->scan.scanrelid - 1] != NULL)
 	{
-		/* we are scanning a subplan */
-		outerPlan = outerPlan((Plan *) node);
-		ExecReScan(outerPlan, exprCtxt, parent);
+		estate->es_evTupleNull[node->scan.scanrelid - 1] = false;
+		return;
 	}
-	else
-	/* otherwise, we are scanning a relation */
-	{
-		/* If this is re-scanning of PlanQual ... */
-		if (estate->es_evTuple != NULL &&
-			estate->es_evTuple[node->scan.scanrelid - 1] != NULL)
-		{
-			estate->es_evTupleNull[node->scan.scanrelid - 1] = false;
-			return;
-		}
 
-		/* it's possible in subselects */
-		if (exprCtxt == NULL)
-			exprCtxt = node->scan.scanstate->cstate.cs_ExprContext;
-
-		node->scan.scanstate->cstate.cs_ExprContext->ecxt_outertuple = exprCtxt->ecxt_outertuple;
-		tidstate->tss_NumTids = TidListCreate(node->tideval, exprCtxt, tidList);
-	}
+	tidstate->tss_NumTids = TidListCreate(node->tideval,
+									node->scan.scanstate->cstate.cs_ExprContext,
+										  tidList);
 
 	/* ----------------
 	 *	perhaps return something meaningful