diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 4ff2f745c31..f02a58e29b1 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -33,7 +33,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.4 2007/03/23 19:53:51 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.5 2007/03/26 00:36:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -812,6 +812,9 @@ PlanCacheComputeResultDesc(List *stmt_list) /* * PlanCacheCallback * Relcache inval callback function + * + * Invalidate all plans mentioning the given rel, or all plans mentioning + * any rel at all if relid == InvalidOid. */ static void PlanCacheCallback(Datum arg, Oid relid) @@ -843,7 +846,7 @@ PlanCacheCallback(Datum arg, Oid relid) if (rte->rtekind != RTE_RELATION) continue; - if (relid == rte->relid) + if (relid == rte->relid || relid == InvalidOid) { /* Invalidate the plan! */ plan->dead = true; @@ -883,10 +886,11 @@ PlanCacheCallback(Datum arg, Oid relid) static void InvalRelid(Oid relid, LOCKMODE lockmode, InvalRelidContext *context) { - if (relid == context->inval_relid) + if (relid == context->inval_relid || context->inval_relid == InvalidOid) context->plan->dead = true; } + /* * HaveCachedPlans * Check if the plancache has stored any plans at all. @@ -896,4 +900,3 @@ HaveCachedPlans(void) { return (cached_plans_list != NIL); } -