diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 6a562f8eaa54e88a624ce93fa54e794cca9a661a..11c8f91a8d40591231cf69a73eb4a88f4b3d814d 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -26,7 +26,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.9 1996/11/13 20:48:28 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.10 1997/01/22 05:26:27 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -170,6 +170,11 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count)
     dest =	  queryDesc->dest;
     destination = (void (*)()) DestToFunction(dest);
 
+#if 0
+    /*
+     * It doesn't work in common case (i.g. if function has a aggregate).
+     * Now we store parameter values before ExecutorStart. - vadim 01/22/97
+     */
 #ifdef INDEXSCAN_PATCH
     /*
      * If the plan is an index scan and some of the scan key are
@@ -182,6 +187,7 @@ ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count)
 	econtext = ((IndexScan *)plan)->scan.scanstate->cstate.cs_ExprContext;
 	ExecIndexReScan((IndexScan *)plan, econtext, plan);
     }
+#endif
 #endif
 
     switch(feature) {
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index a1e6bf1c45ab24c473e32fa3ebf294659303396f..d9094c6b65e5248954a1b70a005b9d65119ac308 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.4 1996/11/06 06:47:36 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.5 1997/01/22 05:26:37 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -281,15 +281,26 @@ postquel_execute(execution_state  *es,
 {
     TupleTableSlot *slot;
     Datum          value;
+
+#ifdef INDEXSCAN_PATCH
+    /*
+     * It's more right place to do it (before postquel_start->ExecutorStart).
+     * Now ExecutorStart->ExecInitIndexScan->ExecEvalParam works ok.
+     * (But note: I HOPE we can do it here). - vadim 01/22/97
+     */
+    if (fcache->nargs > 0)
+        postquel_sub_params(es, fcache->nargs, args, fcache->nullVect);
+#endif
     
     if (es->status == F_EXEC_START)
 	{
 	    (void) postquel_start(es);
 	    es->status = F_EXEC_RUN;
 	}
-    
+#ifndef INDEXSCAN_PATCH
     if (fcache->nargs > 0)
         postquel_sub_params(es, fcache->nargs, args, fcache->nullVect);
+#endif
     
     slot = postquel_getnext(es);
     
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 12b5a9c6c7587d088f8d2279d592326df3012c90..0055cf9f1d5e601cea0c8b94e9178de5bebcf61f 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.5 1996/11/08 00:45:57 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.6 1997/01/22 05:26:50 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -609,6 +609,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 	    Oper	*op;		/* operator used in scan.. */
 	    Node	*leftop;		/* expr on lhs of operator */
 	    Node	*rightop; 	/* expr on rhs ... */
+	    bits16	flags = 0;
 	    
 	    int		scanvar; 	/* which var identifies varattno */
 	    AttrNumber	varattno = 0; 	/* att number used in scan */
@@ -675,6 +676,21 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 		 */
 		run_keys[ j ] = NO_OP;
 		scanvalue = ((Const*) leftop)->constvalue;
+#ifdef INDEXSCAN_PATCH
+	    } else if (IsA(leftop,Param)) {
+	        bool isnull;
+		/* ----------------
+		 *  if the leftop is a Param node then it means
+		 *  it identifies the value to place in our scan key.
+		 * ----------------
+		 */
+		run_keys[ j ] = NO_OP;
+		scanvalue = ExecEvalParam((Param*) leftop, 
+				scanstate->cstate.cs_ExprContext,
+				&isnull);
+		if ( isnull )
+		    flags |= SK_ISNULL;
+#endif
 	    } else if (leftop != NULL &&
 		       is_funcclause(leftop) &&
 		       var_is_rel(lfirst(((Expr*)leftop)->args))) {
@@ -733,7 +749,21 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 		 */
 		run_keys[ j ] = NO_OP;
 		scanvalue = ((Const*) rightop)->constvalue;
-		
+#ifdef INDEXSCAN_PATCH
+	    } else if (IsA(rightop,Param)) {
+	        bool isnull;
+		/* ----------------
+		 *  if the rightop is a Param node then it means
+		 *  it identifies the value to place in our scan key.
+		 * ----------------
+		 */
+		run_keys[ j ] = NO_OP;
+		scanvalue = ExecEvalParam((Param*) rightop, 
+				scanstate->cstate.cs_ExprContext,
+				&isnull);
+		if ( isnull )
+		    flags |= SK_ISNULL;
+#endif
 	    } else if (rightop!=NULL &&
 		       is_funcclause(rightop) &&
 		       var_is_rel(lfirst(((Expr*)rightop)->args))) {
@@ -777,7 +807,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, Plan *parent)
 	     * ----------------
 	     */
 	    ScanKeyEntryInitialize(&scan_keys[j],
-				   0,
+				   flags,
 				   varattno, /* attribute number to scan */
 				   (RegProcedure) opid,	/* reg proc to use */
 				   (Datum) scanvalue);	/* constant */