summaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
authorTom Lane2007-10-11 18:05:27 +0000
committerTom Lane2007-10-11 18:05:27 +0000
commit82d8ab6fc4c1a0330c91022728e1e766db207069 (patch)
tree0bd9635d34da6c964d37fd4a725ead26a9a7340d /src/backend/utils
parent68b08b251239e9ec883156b0cba53316c88adb5f (diff)
Fix the plan-invalidation mechanism to treat regclass constants that refer to
a relation as a reason to invalidate a plan when the relation changes. This handles scenarios such as dropping/recreating a sequence that is referenced by nextval('seq') in a cached plan. Rather than teach plancache.c all about digging through plan trees to find regclass Consts, we charge the planner's setrefs.c with making a list of the relation OIDs on which each plan depends. That way the list can be built cheaply during a plan tree traversal that has to happen anyway. Per bug #3662 and subsequent discussion.
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/cache/plancache.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c
index 43297281f5f..2f52ed7a8cc 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.11 2007/09/20 17:56:31 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.12 2007/10/11 18:05:27 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -921,26 +921,17 @@ PlanCacheCallback(Datum arg, Oid relid)
foreach(lc2, plan->stmt_list)
{
PlannedStmt *plannedstmt = (PlannedStmt *) lfirst(lc2);
- ListCell *lc3;
Assert(!IsA(plannedstmt, Query));
if (!IsA(plannedstmt, PlannedStmt))
continue; /* Ignore utility statements */
- foreach(lc3, plannedstmt->rtable)
+ if ((relid == InvalidOid) ? plannedstmt->relationOids != NIL :
+ list_member_oid(plannedstmt->relationOids, relid))
{
- RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc3);
-
- if (rte->rtekind != RTE_RELATION)
- continue;
- if (relid == rte->relid || relid == InvalidOid)
- {
- /* Invalidate the plan! */
- plan->dead = true;
- break; /* out of rangetable scan */
- }
- }
- if (plan->dead)
+ /* Invalidate the plan! */
+ plan->dead = true;
break; /* out of stmt_list scan */
+ }
}
}
else