Fix plancache's invalidation callback to do the right thing for a SI
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 26 Mar 2007 00:36:19 +0000 (00:36 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 26 Mar 2007 00:36:19 +0000 (00:36 +0000)
reset event, namely invalidate everything.  This oversight probably
explains the rare failures that some buildfarm machines have been
showing for the plancache regression test.

src/backend/utils/cache/plancache.c

index 4ff2f745c316944c2efa75284703234055ecf9d7..f02a58e29b11b9113d69cf6b7b5462e027600504 100644 (file)
@@ -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);
 }
-