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);