diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index 4a5363c66f97e378f89ea519f45ba7eb17c226f8..71ec8f8250a625f831b60512391c5d6837849dd2 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.127 2010/08/05 15:25:35 rhaas Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/namespace.c,v 1.128 2010/08/13 16:27:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2667,6 +2667,17 @@ GetOverrideSearchPath(MemoryContext context)
  *
  * We allow nested overrides, hence the push/pop terminology.  The GUC
  * search_path variable is ignored while an override is active.
+ *
+ * It's possible that newpath->useTemp is set but there is no longer any
+ * active temp namespace, if the path was saved during a transaction that
+ * created a temp namespace and was later rolled back.  In that case we just
+ * ignore useTemp.  A plausible alternative would be to create a new temp
+ * namespace, but for existing callers that's not necessary because an empty
+ * temp namespace wouldn't affect their results anyway.
+ *
+ * It's also worth noting that other schemas listed in newpath might not
+ * exist anymore either.  We don't worry about this because OIDs that match
+ * no existing namespace will simply not produce any hits during searches.
  */
 void
 PushOverrideSearchPath(OverrideSearchPath *newpath)
@@ -2700,11 +2711,8 @@ PushOverrideSearchPath(OverrideSearchPath *newpath)
 	if (newpath->addCatalog)
 		oidlist = lcons_oid(PG_CATALOG_NAMESPACE, oidlist);
 
-	if (newpath->addTemp)
-	{
-		Assert(OidIsValid(myTempNamespace));
+	if (newpath->addTemp && OidIsValid(myTempNamespace))
 		oidlist = lcons_oid(myTempNamespace, oidlist);
-	}
 
 	/*
 	 * Build the new stack entry, then insert it at the head of the list.
diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c
index 95f010f682d511d2e94e62528733a044ed6a466e..339c8c2c855c557402fca0c066c39fe24e054594 100644
--- a/src/backend/utils/cache/plancache.c
+++ b/src/backend/utils/cache/plancache.c
@@ -35,7 +35,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.35 2010/02/26 02:01:11 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.36 2010/08/13 16:27:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -513,6 +513,8 @@ RevalidateCachedPlan(CachedPlanSource *plansource, bool useResOwner)
 
 		/*
 		 * Restore the search_path that was in use when the plan was made.
+		 * See comments for PushOverrideSearchPath about limitations of this.
+		 *
 		 * (XXX is there anything else we really need to restore?)
 		 */
 		PushOverrideSearchPath(plansource->search_path);