diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c
index 6c9a16a12b47211bfcd5b8ae838d2da9b3b27e8b..e04876c331771323c94323196307fdffa9f33578 100644
--- a/src/backend/executor/execScan.c
+++ b/src/backend/executor/execScan.c
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.6 1997/09/08 21:43:02 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.7 1998/02/26 12:13:09 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -104,11 +104,23 @@ ExecScan(Scan *node,
 		/* ----------------
 		 *	if the slot returned by the accessMtd contains
 		 *	NULL, then it means there is nothing more to scan
-		 *	so we just return the empty slot.
+		 *	so we just return the empty slot...
+		 *
+		 *  ... with invalid TupleDesc (not the same as in 
+		 *  projInfo->pi_slot) and break upper MergeJoin node.
+		 *  New code below do what ExecProject() does.	- vadim 02/26/98
 		 * ----------------
 		 */
 		if (TupIsNull(slot))
-			return slot;
+		{
+			scanstate->cstate.cs_TupFromTlist = false;
+			resultSlot = scanstate->cstate.cs_ProjInfo->pi_slot;
+			return (TupleTableSlot *)
+				ExecStoreTuple (NULL,
+								resultSlot,
+								InvalidBuffer,
+								true);
+		}
 
 		/* ----------------
 		 *	 place the current tuple into the expr context
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 4c01e5b1f2aa72b48a26526dc946fe210e322dfc..8bce5762b260ff2097b67a9a9683fa81736b3655 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.15 1998/02/26 04:31:26 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.16 1998/02/26 12:13:11 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -267,11 +267,11 @@ ExecIndexReScan(IndexScan *node, ExprContext *exprCtxt, Plan *parent)
 		n_keys = numScanKeys[indexPtr];
 		run_keys = (int *) runtimeKeyInfo[indexPtr];
 		scan_keys = (ScanKey) scanKeys[indexPtr];
-
+		
 		/* it's possible in subselects */
 		if (exprCtxt == NULL)
 			exprCtxt = node->scan.scanstate->cstate.cs_ExprContext;
-
+		
 		for (j = 0; j < n_keys; j++)
 		{
 
@@ -410,12 +410,10 @@ ExecIndexMarkPos(IndexScan *node)
 	indexScanDescs = indexstate->iss_ScanDescs;
 	scanDesc = indexScanDescs[indexPtr];
 
-	/* ----------------
-	 *	XXX access methods don't return marked positions so
-	 * ----------------
-	 */
+#if 0
 	IndexScanMarkPosition(scanDesc);
-	return;
+#endif
+	index_markpos (scanDesc);
 }
 
 /* ----------------------------------------------------------------
@@ -441,7 +439,10 @@ ExecIndexRestrPos(IndexScan *node)
 	indexScanDescs = indexstate->iss_ScanDescs;
 	scanDesc = indexScanDescs[indexPtr];
 
+#if 0
 	IndexScanRestorePosition(scanDesc);
+#endif
+	index_restrpos (scanDesc);
 }
 
 /* ----------------------------------------------------------------
@@ -488,7 +489,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 	HeapScanDesc currentScanDesc;
 	ScanDirection direction;
 	int			baseid;
-
+	
 	List	   *execParam = NULL;
 
 	/* ----------------
@@ -711,22 +712,22 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 				 *	it identifies the value to place in our scan key.
 				 * ----------------
 				 */
-
+				
 				/* Life was so easy before ... subselects */
-				if (((Param *) leftop)->paramkind == PARAM_EXEC)
+				if ( ((Param *) leftop)->paramkind == PARAM_EXEC )
 				{
 					have_runtime_keys = true;
 					run_keys[j] = LEFT_OP;
-					execParam = lappendi(execParam, ((Param *) leftop)->paramid);
+					execParam = lappendi (execParam, ((Param*) leftop)->paramid);
 				}
 				else
 				{
 					scanvalue = ExecEvalParam((Param *) leftop,
-										scanstate->cstate.cs_ExprContext,
+											  scanstate->cstate.cs_ExprContext,
 											  &isnull);
 					if (isnull)
 						flags |= SK_ISNULL;
-
+					
 					run_keys[j] = NO_OP;
 				}
 			}
@@ -804,22 +805,22 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 				 *	it identifies the value to place in our scan key.
 				 * ----------------
 				 */
-
+				
 				/* Life was so easy before ... subselects */
-				if (((Param *) rightop)->paramkind == PARAM_EXEC)
+				if ( ((Param *) rightop)->paramkind == PARAM_EXEC )
 				{
 					have_runtime_keys = true;
 					run_keys[j] = RIGHT_OP;
-					execParam = lappendi(execParam, ((Param *) rightop)->paramid);
+					execParam = lappendi (execParam, ((Param*) rightop)->paramid);
 				}
 				else
 				{
 					scanvalue = ExecEvalParam((Param *) rightop,
-										scanstate->cstate.cs_ExprContext,
+											  scanstate->cstate.cs_ExprContext,
 											  &isnull);
 					if (isnull)
 						flags |= SK_ISNULL;
-
+					
 					run_keys[j] = NO_OP;
 				}
 			}
@@ -989,13 +990,13 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 	indexstate->iss_ScanDescs = scanDescs;
 
 	indexstate->cstate.cs_TupFromTlist = false;
-
-	/*
-	 * if there are some PARAM_EXEC in skankeys then force index rescan on
-	 * first scan.
+	
+	/* 
+	 * if there are some PARAM_EXEC in skankeys then
+	 * force index rescan on first scan.
 	 */
-	((Plan *) node)->chgParam = execParam;
-
+	((Plan*) node)->chgParam = execParam;
+	
 	/* ----------------
 	 *	all done.
 	 * ----------------