diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index 068ba771ea858892ab9da6a9570fb2cd2f652a7b..a675963005d58ba4e95c95f48ac0775ccae2461c 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.89 2000/07/26 23:46:22 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.90 2000/07/27 23:15:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1153,7 +1153,7 @@ one_pred_clause_test(Expr *predicate, Node *clause)
  * this test should always be considered false.
  */
 
-static StrategyNumber
+static const StrategyNumber
 			BT_implic_table[BTMaxStrategyNumber][BTMaxStrategyNumber] = {
 	{2, 2, 0, 0, 0},
 	{1, 2, 0, 0, 0},
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 84f9c322c4203c2cd8f7206fd56cb075c9849a6f..42545750d393a695952341c29236050056bb9612 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.85 2000/06/20 04:22:21 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.86 2000/07/27 23:15:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -50,6 +50,22 @@ Plan *
 planner(Query *parse)
 {
 	Plan	   *result_plan;
+	Index		save_PlannerQueryLevel;
+	List	   *save_PlannerInitPlan;
+	List	   *save_PlannerParamVar;
+	int			save_PlannerPlanId;
+
+	/*
+	 * The planner can be called recursively (an example is when
+	 * eval_const_expressions tries to simplify an SQL function).
+	 * So, global state variables must be saved and restored.
+	 *
+	 * (Perhaps these should be moved into the Query structure instead?)
+	 */
+	save_PlannerQueryLevel = PlannerQueryLevel;
+	save_PlannerInitPlan = PlannerInitPlan;
+	save_PlannerParamVar = PlannerParamVar;
+	save_PlannerPlanId = PlannerPlanId;
 
 	/* Initialize state for subselects */
 	PlannerQueryLevel = 1;
@@ -78,6 +94,12 @@ planner(Query *parse)
 	/* final cleanup of the plan */
 	set_plan_references(result_plan);
 
+	/* restore state for outer planner, if any */
+	PlannerQueryLevel = save_PlannerQueryLevel;
+	PlannerInitPlan = save_PlannerInitPlan;
+	PlannerParamVar = save_PlannerParamVar;
+	PlannerPlanId = save_PlannerPlanId;
+
 	return result_plan;
 }
 
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 1bec741c48b657d057faf3a328d03e54acd64a09..750a463122f03861abc4ba42ce6bf3893cc302b2 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.59 2000/07/05 23:11:26 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/plancat.c,v 1.60 2000/07/27 23:16:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -272,15 +272,12 @@ join_selectivity(Oid functionObjectId,
 List *
 find_inheritance_children(Oid inhparent)
 {
-	static ScanKeyData key[1] = {
-		{0, Anum_pg_inherits_inhparent, F_OIDEQ}
-	};
-
 	List	   *list = NIL;
 	Relation	relation;
 	HeapScanDesc scan;
 	HeapTuple	inheritsTuple;
 	Oid			inhrelid;
+	ScanKeyData	key[1];
 
 	/*
 	 * Can skip the scan if pg_class shows the relation has never had
@@ -289,10 +286,11 @@ find_inheritance_children(Oid inhparent)
 	if (! has_subclass(inhparent))
 		return NIL;
 
-	fmgr_info(F_OIDEQ, &key[0].sk_func);
-	key[0].sk_nargs = key[0].sk_func.fn_nargs;
-	key[0].sk_argument = ObjectIdGetDatum(inhparent);
-
+	ScanKeyEntryInitialize(&key[0],
+						   (bits16) 0x0,
+						   (AttrNumber) Anum_pg_inherits_inhparent,
+						   (RegProcedure) F_OIDEQ,
+						   ObjectIdGetDatum(inhparent));
 	relation = heap_openr(InheritsRelationName, AccessShareLock);
 	scan = heap_beginscan(relation, 0, SnapshotNow, 1, key);
 	while (HeapTupleIsValid(inheritsTuple = heap_getnext(scan, 0)))
@@ -330,45 +328,3 @@ has_subclass(Oid relationId)
 			 relationId);
 	return ((Form_pg_class) GETSTRUCT(tuple))->relhassubclass;
 }
-
-#ifdef NOT_USED
-/*
- * VersionGetParents
- *
- * Returns a LISP list containing the OIDs of all relations which are
- * base relations of the relation with OID 'verrelid'.
- */
-List *
-VersionGetParents(Oid verrelid)
-{
-	static ScanKeyData key[1] = {
-		{0, Anum_pg_version_verrelid, F_OIDEQ}
-	};
-
-	HeapTuple	versionTuple;
-	Relation	relation;
-	HeapScanDesc scan;
-	Oid			verbaseid;
-	List	   *list = NIL;
-
-	fmgr_info(F_OIDEQ, &key[0].sk_func);
-	key[0].sk_nargs = key[0].sk_func.fn_nargs;
-	key[0].sk_argument = ObjectIdGetDatum(verrelid);
-	relation = heap_openr(VersionRelationName, AccessShareLock);
-	scan = heap_beginscan(relation, 0, SnapshotNow, 1, key);
-	while (HeapTupleIsValid(versionTuple = heap_getnext(scan, 0)))
-	{
-		verbaseid = ((Form_pg_version)
-					 GETSTRUCT(versionTuple))->verbaseid;
-
-		list = lconsi(verbaseid, list);
-
-		key[0].sk_argument = ObjectIdGetDatum(verbaseid);
-		heap_rescan(scan, 0, key);
-	}
-	heap_endscan(scan);
-	heap_close(relation, AccessShareLock);
-	return list;
-}
-
-#endif