summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2007-03-26 00:36:19 +0000
committerTom Lane2007-03-26 00:36:19 +0000
commitdc1b8cea93df76596cbf8b1c41fbfa5977746095 (patch)
tree6b473da7b596c2e618b7894d612e1ee28508ac47
parent1cc97d175c1493daa6106f7196114141cc4606b7 (diff)
Fix plancache's invalidation callback to do the right thing for a SI
reset event, namely invalidate everything. This oversight probably explains the rare failures that some buildfarm machines have been showing for the plancache regression test.
-rw-r--r--src/backend/utils/cache/plancache.c11
1 files changed, 7 insertions, 4 deletions
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);
}
-